绕过The Loop的自定义Wordpress index.php无法正常工作

时间:2010-07-28 03:58:54

标签: php wordpress wordpress-theming

我正在为客户构建一个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实例而没有问题。

感谢您的时间 - 抱歉这部小说。如果我遗漏了任何相关细节,请告诉我。

2 个答案:

答案 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):