Несколько циклов в WordPress. Второй цикл не сбрасывается
Я создал пользовательский тип записи с пользовательскими полями внутри 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; ?> »</a></li>
<?php endwhile; else: ?>
<li>Sorry, no upcoming events.</li>
<?php endif; ?>
</ul>
<p class="more"><a href="/about-us/events/">more events »</a></p>
</div>
<?php } ?>
Теперь, если я помещу этот код внутрь обычная боковая панель (вместо главной страницы) - она отлично работает. Итак, очевидно, что что-то не так с несколькими циклами на домашней странице и боковой панели. Если я упрошу виджет так, чтобы он захватывал только 2 "события", он захватит два сообщения (независимо от типа post_type). Я пробовал rewind_posts и wp_reset_query, поэтому я не уверен, что еще попробовать?
4 answers
У меня такая же проблема, и она была вызвана 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' );
?>
Попробуйте добавить объявление 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; ?> »</a></li>
<?php endwhile; else: ?>
<li>Sorry, no upcoming events.</li>
<?php endif; ?>
</ul>
<p class="more"><a href="/about-us/events/">more events »</a></p>
</div>
<?php } ?>
Попробуйте rewind_posts()
после вашего endwhile
в зависимости от того, какой цикл используется первым (если ваш вызов боковой панели находится внизу вашего шаблона, сделайте это в шаблоне страницы или наоборот, если боковая панель вызывается вверху).
Другой подход:
<?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; ?> »</a></li>
<?php endwhile; else: ?>
<li>Sorry, no upcoming events.</li>
<?php endif; ?>
</ul>
<p class="more"><a href="/about-us/events/">more events »</a></p>
</div>
<?php } ?>
Я наконец-то решил эту проблему. Я использовал 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; ?> »</a></li>
<?php endforeach; ?>
</ul>
<p class="more"><a href="/about-us/events/">more events »</a></p>
</div>
<?php wp_reset_query(); ?>
<?php } ?>