【问题标题】:Multiple Loops in WordPress. Second loop not resettingWordPress 中的多个循环。第二个循环不重置
【发布时间】:2011-01-25 16:32:25
【问题描述】:

我在 Wordpress 中创建了一个带有自定义字段的自定义帖子类型。我创建了一个新的页面模板,它通过一个循环运行并且效果很好。我正在尝试向主页的侧边栏添加一个类似的循环,但它不能正常工作。

首先,我自己的页面模板上的工作代码。

<h2>Upcoming Events</h2>
<?php $todaysDate = date('Y/m/d');
$event_query = new WP_query('post_type=events&posts_per_page=-1&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
?> 

<ul id="featured_event_list">
<?php if ($event_query->have_posts()): ?>
<?php while ($event_query->have_posts()) : $event_query->the_post(); ?>
<li>
    <h3><?php the_title(); ?></h3>
    <p>
    <?php if ( get_post_meta($post->ID, 'event_featuring', true) ) : ?>
        <strong>Featuring:</strong> <?php echo get_post_meta($post->ID, 'event_featuring', true) ?><br />
    <?php endif; ?>
    <?php if ( get_post_meta($post->ID, 'event_date', true) ) : ?>
        <?php $event_date = get_post_meta($post->ID, 'event_date', true);
        $new_event_date = date("F j, Y",strtotime($event_date)); ?>
        <strong>Date:</strong> <?php echo $new_event_date ?>
        <?php endif; ?>
        <?php if ( get_post_meta($post->ID, 'event_end_date', true) ) : ?>
        <?php $event_end_date = get_post_meta($post->ID, 'event_end_date', true);
        $new_event_end_date = date("F j, Y",strtotime($event_end_date)); ?>
        - <?php echo $new_event_end_date ?>
    <?php endif; ?>
        <br />
    <?php if ( get_post_meta($post->ID, 'event_time', true) ) : ?>
        <strong>Time:</strong> <?php echo get_post_meta($post->ID, 'event_time', true) ?><br />
    <?php endif; ?>
    <?php if ( get_post_meta($post->ID, 'event_location', true) ) : ?>
        <strong>Location:</strong> <?php echo get_post_meta($post->ID, 'event_location', true) ?>
    <?php endif; ?>
    </p>
    <p><?php the_excerpt(); ?></p>
</li>
<?php endwhile; ?>
<?php else: ?>
<li>Sorry, no upcoming events.</li>
<?php endif; ?>
</ul>

这很好用,但是当我将该代码的修改版本作为小部件放入 functions.php 中时,它不起作用:

<?php
function eventsWidget() { ?>
    <div class="uwf_widget">
        <h3 class="events"><span>Featured Events</span></h3>
        <ul>
<?php
        $todaysDate = date('Y/m/d');
        $event_widget_query = new WP_query('post_type=events&posts_per_page=2&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
?> 
        <?php if ($event_widget_query->have_posts()) :?>
        <?php while ($event_widget_query->have_posts()) : $event_widget_query->the_post(); ?>
            <?php $event_date = get_post_meta($post->ID, 'event_date', true);
            $new_event_date = date("F j",strtotime($event_date)); ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
        <?php endwhile; else: ?>
            <li>Sorry, no upcoming events.</li>
        <?php endif; ?>
        </ul>
            <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
        </div>
<?php } ?>

现在,如果我将该代码放在正常的侧边栏中(而不是在主页上) - 它可以正常工作。因此,显然主页和侧边栏上的多个循环存在问题。如果我简化小部件使其仅抓取 2 个“事件”,它将抓取两个帖子(无论 post_type 是什么)。我已经尝试过 rewind_posts 和 wp_reset_query,所以我不确定还能尝试什么?

【问题讨论】:

  • 仍然坚持这一点。如果有人有任何想法,我很想听听。

标签: php wordpress loops sidebar


【解决方案1】:

我有同样的问题,它是由 wp_hook 'pre_get_posts' 引起的

<?php function custom_get_posts( $query ) {
if ( !is_admin() && false == $query->query_vars['suppress_filters'] )
    $query->set( 'post_type', array('post', 'events', 'pages') );

    return $query;
}
add_filter( 'pre_get_posts', 'custom_get_posts' );
?>

要解决此问题,您可以在 WP_Query 之前删除此过滤器,并在此查询之后再次添加。

<?php

remove_filter( 'pre_get_posts', 'custom_get_posts' );

/*
 * Your new WP_Query
 */

add_filter( 'pre_get_posts', 'custom_get_posts' );

?>

【讨论】:

    【解决方案2】:

    尝试在函数开头添加global post; 声明。

    <?php
    function eventsWidget() { 
        global $post; ?>
        <div class="uwf_widget">
            <h3 class="events"><span>Featured Events</span></h3>
            <ul>
    <?php
            $todaysDate = date('Y/m/d');
            $event_widget_query = new WP_query('post_type=events&posts_per_page=2&post_status=publish&meta_key=event_date&meta_compare=>=&meta_value=' . $todaysDate . '&orderby=meta_value&order=ASC');
    ?> 
            <?php if ($event_widget_query->have_posts()) :?>
            <?php while ($event_widget_query->have_posts()) : $event_widget_query->the_post(); ?>
                <?php $event_date = get_post_meta($post->ID, 'event_date', true);
                $new_event_date = date("F j",strtotime($event_date)); ?>
                <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
            <?php endwhile; else: ?>
                <li>Sorry, no upcoming events.</li>
            <?php endif; ?>
            </ul>
                <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
            </div>
    <?php } ?>
    

    【讨论】:

    • 我以前没试过。不幸的是,我仍然得到相同的结果。
    • 你从这个循环中得到什么输出?
    • “抱歉,没有近期活动。”如果我将查询简化为 $event_widget_query = new WP_query('post_type=events&posts_per_page=2');我收到了最近的两个帖子(不是最近的两个事件)。所以,它似乎仍然从主页循环中拉出来。
    • 仅供参考,这确实解决了我遇到的一个问题(在此处的另一个线程中描述)。
    【解决方案3】:

    在您的endwhile 之后尝试rewind_posts() 在首先使用的循环中(如果您的侧边栏调用位于模板的底部,则在您的页面模板中执行,或者如果侧边栏在顶部调用则相反)。

    另一种方法:

    <?php
    function eventsWidget() { ?>
        <div class="uwf_widget">
            <h3 class="events"><span>Featured Events</span></h3>
            <ul>
            <?php $todaysDate = date('Y/m/d');
            query_posts('$post_type=event&posts_per_page=2');
            if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
            <?php while ($have_posts()) : the_post(); ?>
                <?php $event_date = get_post_meta($post->ID, 'event_date', true);
                $new_event_date = date("F j",strtotime($event_date)); ?>
                <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
            <?php endwhile; else: ?>
                <li>Sorry, no upcoming events.</li>
            <?php endif; ?>
            </ul>
                <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
            </div>
    <?php } ?>
    

    【讨论】:

    • 我已经试过了,然后又试了一次,我得到了同样的结果,那就是“抱歉,没有即将发生的事件”。如果我将查询简化为 $event_widget_query = new WP_query('post_type=events&posts_per_page=2');我收到了最近的两个帖子(不是最近的两个事件)。所以,它似乎仍然从主页循环中拉出来。
    • 只是为了好玩,你可以在 WP_query 字符串中使用关联数组吗? 'post_type' =&gt; 'events', 'posts_per_page' =&gt; 2
    • 那是一个数组,对吧?对不起-$wp_query = new WP_Query( array( 'post_type' =&gt; 'events', 'posts_per_page' =&gt; 2 ) )
    • 是的,但我将名称保留为 $event_widget_query。如果我将其更改为 wp_query 并更新函数 - 它不仅会忽略 post_type,还会忽略 posts_per_page 并拉入 4 个(站点默认)最近的帖子。
    • 尝试另一种方法 - 稍后将编辑我的答案。
    【解决方案4】:

    我终于解决了这个问题。我使用 get_posts 并构建了一个数组,由于某种原因它现在可以在主页上运行。

    <?php
    function eventsWidget() {?>
        <div class="uwf_widget">
            <h3 class="events"><span>Featured Events</span></h3>
            <ul>
    <?php
            global $post;
            $todaysDate = date('Y/m/d');
            $event_args = array('post_type' => 'events', 
                                'numberposts' => 2,
                                'meta_key' => 'event_date',
                                'post_status' => 'publish',
                                'meta_compare' => '>=',
                                'meta_value' => $todaysDate,
                                'orderby' => 'meta_value',
                                'order'=> 'ASC');
            $event_widget_query = get_posts( $event_args );
            foreach ($event_widget_query as $post) : setup_postdata($event_widget_query); ?>
                <?php $event_date = get_post_meta($post->ID, 'event_date', true);
                $new_event_date = date("F j",strtotime($event_date)); ?>
                <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo $new_event_date; ?> &nbsp;&raquo;</a></li>
            <?php endforeach; ?>
            </ul>
                <p class="more"><a href="/about-us/events/">more events &raquo;</a></p>
            </div>
            <?php wp_reset_query(); ?>
    <?php } ?>
    

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多