У меня есть шаблон архива, который я использую для 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();}
?>
Вы повторяете термин имя вне цикла, без каких-либо проверок на 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;
?>
<?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();
?>