我正在为客户构建一个Wordpress主题,它与我之前构建的任何其他主题不同,主页是跨多个不同容器和样式的帖子集合。它应该看起来像一本杂志,在每个月初,同时发布9个不同的帖子,每个帖子属于不同的类别。许多帖子的风格不同,我无法使用传统的循环:
<?php if(has_posts()) : while(has_posts)) : the_post(); ?>
// do stuff
<?php endwhile; endif; ?>
首先,我将解释我是如何解决问题的,然后描述我遇到的问题。
在index.php的顶部,我有以下PHP代码:
$slugPostMap = array();
$slugs = array(
'art', 'big-idea', 'books', 'educators', 'film',
'ministry-update', 'music', 'parents', 'students',
);
$args = array(
'limitposts' => 1,
'order' => 'date'
);
foreach($slugs as $slug){
$args['category_name'] = $slug;
$post = get_posts($args);
$slugPostMap[$slug] = $post;
}
$slugs
数组是我需要查询的每个类别slug的集合 - 每个类别将有一个要显示的帖子。我的想法是,我可以遍历这个数组,并使用一组固定的查询参数($args
),检索每个slug的单个最新帖子。当我循环遍历slug数组时,我将查询结果存储在一个关联数组($slugPostMap
)中,其中类别slug“指向”实际帖子。
稍后在页面正文中,我使用类别slug索引从$slugPostMap
抓取所需的帖子。这是一个例子:
<?php
foreach($slugPostMap['ministry-update'] as $p):
setup_postdata($p);
?>
<a class="homepageVideoPostTitle" href="<?php the_permalink(); ?>"><?php the_date('F Y','','',true); ?></a>
<div class="homepageVideoPostSubtitle">
<?php the_title(); ?>
</div> <!-- end homepageVideoPostSubtitle -->
<div class="homepageVideoPostContent">
<?php the_excerpt(); ?>
</div>
<?php endforeach; ?>
我在开头使用foreach循环的原因是因为据我所知,几个核心Wordpress模板标签(the_title()
,the_permalink()
等)仅在循环。因为我在这里手动调用setup_postdata()
(在循环期间在幕后调用),我也使用foreach来限制当我调用setup_postdata()
时发生的任何怪异伏都教的范围。
在大多数情况下,这是有效的。在上面的示例中,调用the_excerpt()
的结果按预期显示。但是,其他一些模板标记未返回任何值(the_permalink()
和the_title()
,具体而言)。我没有收到任何错误,当我在真实的Wordpress安装中尝试这个时,页面加载正常。
我认为问题在于我在这种情况下缺乏对如何正确绕过The Loop的理解,但事实上没有任何错误或任何其他线索的问题使我在这里。< / p>
这是在某些Linux上运行的Wordpress 3.0。我已经在这个盒子上运行了许多其他Wordpress安装而没有问题,我可以使用默认主题的同一个Wordpress实例而没有问题。
感谢您的时间 - 抱歉这部小说。如果我遗漏了任何相关细节,请告诉我。
答案 0 :(得分:0)
就像你的情况一样,我不知道发生了什么奇怪的伏都教,但是如果你改变主题代码以使用在循环之外工作的函数会怎样。 get_permalink($id)和single_post_title() 应该做你需要的。
答案 1 :(得分:0)
这些模板函数使用:global $post;
来访问帖子信息。
而不是:
foreach($slugPostMap['ministry-update'] as $p):
你应该能够简单地使用$ post作为子变量:
foreach($slugPostMap['ministry-update'] as $post):