Не показывать $ термины, если НЕ в диапазоне дат?

У меня есть шаблон архива, который я использую для CPT, чтобы показать сообщения в диапазоне дат.
Проблема заключается в следующем — он все еще показывает имя термина в интерфейсе, когда у термина есть сообщение, но не в этом диапазоне дат?

Раньше этот шаблон работал, а термины без постов не показывались, но после добавления аргументов диапазона дат теперь отображается заголовок термина, даже если в этом диапазоне нет ни одного поста.

Я думаю, что он ведет себя так, как ожидалось, потому что в этом термине есть фактическая запись, просто она не в нужном диапазоне дат, поэтому заголовок термина отображается без постов под ним.

Как я могу изменить приведенный ниже код, чтобы НЕ отображать заголовки или сообщения, не входящие в диапазон дат?

<?php// Remove stuff
remove_action( 'genesis_loop', 'genesis_do_loop' );
remove_action( 'genesis_entry_content', 'genesis_do_post_content' );
remove_action( 'genesis_entry_header', 'genesis_do_post_title' );
remove_action( 'genesis_entry_header', 'genesis_post_info', 12 );
remove_action( 'genesis_entry_footer', 'genesis_post_meta' );

// Add our custom loop
add_action( 'genesis_loop', 'newsletter_archive_loop' );

// Add our custom loop
add_action( 'genesis_loop', 'newsletter_archive_loop' );
function newsletter_archive_loop() {
?><?php //start by fetching the terms for the year-groups taxonomy
$terms = get_terms( 'year-groups', array(
'hide_empty' => 'true'
) );
?>
<?php

// now run a query for each year-group
foreach( $terms as $term ) {

// Define the query
$args = array(
'post_type' => 'newsletters',
'year-groups' => $term->slug ,
'date_query' => array(
array(
'after'     => 'July 31st, 2014',
'before'    => array(
'year'  => 2015,
'month' => 8,
'day'   => 1,
),
'inclusive' => true,
),
),
'posts_per_page' => -1,
);
$query = new WP_Query( $args );

// output the term name in a heading tag
echo'<h2 class="archive-heading">' . $term->name . '</h2>';

$columns = 3;
$increment = 0;

// Start the Loop
while ( $query->have_posts() ) : $query->the_post();
$attachment_id = ( genesis_get_custom_field( 'newsletter_upload_pdf' ) );
$url = wp_get_attachment_url( $attachment_id );
$title = get_the_title( $attachment_id );

?>

<div class="one-third <?php if($increment % $columns == 0){echo'first';}$increment++; ?>">
<div class="archive-file">
<a href="<?php echo $url; ?>"  target="_blank"><?php echo $title; ?></a>
</div>
</div><?php endwhile;?>

<hr/>
<?php

// use reset postdata to restore orginal query
wp_reset_postdata();}

?>

0

Решение

Вы повторяете термин имя вне цикла, без каких-либо проверок на WP_Query возвращаемое значение В соответствии с этот ответ, простое исправление будет:

if ($query->have_posts()) {
echo '<h2 class="archive-heading">' . $term->name . '</h2>';
while ( $query->have_posts() ) : $query->the_post();
while ($query->have_posts()) {
$query->to_post();
//rest of while loop here
endwhile;
} else {
//no else, or:
echo '<h5>', $term->name, ' - nothing found</h5>';
}

Есть также немного более абстрактный пример этого на официальных страницах документации WP.
Итог: не повторяйте $term->name значение, если $query->have_posts() возвращается true, Так что в более стиле WordPress-у ваш код должен быть:

<?php
if ($query->has_posts) :
<h2 class="archive-heading"><?= $term->name; ?></h2>
<?php
while ($query->has_posts()) : $query->the_post();
//do stuff
endwhile;
else:
<!-- <?= $term->name; ?> is empty, optional output here -->
endif;
?>
0

Другие решения

<?php
// Remove stuff
remove_action( 'genesis_loop', 'genesis_do_loop' );
remove_action( 'genesis_entry_content', 'genesis_do_post_content' );
remove_action( 'genesis_entry_header', 'genesis_do_post_title' );
remove_action( 'genesis_entry_header', 'genesis_post_info', 12 );
remove_action( 'genesis_entry_footer', 'genesis_post_meta' );

// Add our custom loop
add_action( 'genesis_loop', 'newsletter_archive_loop' );
function newsletter_archive_loop() {

//start by fetching the terms for the year-groups taxonomy
$terms = get_terms( 'year-groups', array(
'hide_empty' => 'true'
) );

// now run a query for each year-groups
foreach( $terms as $term ) {

// Define the query
$args = array(
'post_type' => 'newsletters',
'year-groups' => $term->slug ,
'date_query' => array(
array(
'after'     => 'July 31st, 2014',
'before'    => array(
'year'  => 2015,
'month' => 8,
'day'   => 1,
),
'inclusive' => true,
),
),
'posts_per_page' => -1,
);

// run the query
$query = new WP_Query( $args );
if( $query->have_posts() ) {

// output the term name in a heading tag
echo'<h2 class="archive-heading">' . $term->name . '</h2>';

$columns = 3;
$increment = 0;

// Start the Loop
while ( $query->have_posts() ) : $query->the_post();
$attachment_id = ( genesis_get_custom_field( 'newsletter_upload_pdf' ) );
$url = wp_get_attachment_url( $attachment_id );
$title = get_the_title( $attachment_id );

?>

<div class="one-third <?php if($increment % $columns == 0){echo'first';}$increment++; ?>">
<div class="archive-file">
<a href="<?php echo $url; ?>"  target="_blank"><?php echo $title; ?></a>
</div>
</div>

<?php endwhile;?>

<hr/>

<?php
}
}
// use reset postdata to restore orginal query
wp_reset_postdata();
?>
0