Wordpress исключает дублируемую $липкую запись из цикла
Так как функция Wordpress sticky posts позволяет сообщению проверяться как липкое в панели публикации публикации, которое должно быть размещено в верхней части первой страницы сообщений. Я также собирался стилизовать липкий пост по-другому, чем обычный, в цикле, настроив Кодирование по умолчанию следующим образом:
<?php if (have_posts()) : ?>
<?php $post = $posts[0]; $c=0;?>
<?php while (have_posts()) : the_post(); ?>
<?php $c++;
if( is_home() && !$paged && $c == 1 ) :?>
<!--First sticky post content -->
<?php elseif( is_home() && !$paged && $c == 2 ) :?>
<!--Second sticky post content -->
<?php elseif( is_home() && !$paged && $c == 3 ) :?>
<!--Third sticky post content -->
<?php else:?>
<!-- Standard post content -->
<?php endif;?>
<?php endwhile; ?>
<!-- End of the main loop -->
//pagination
<?php else : ?>
<?php _e('Sorry, no posts matched your criteria.'); ?>
<?php endif; ?>
В результате я получаю первые три сообщения (отмеченные как липкие) с настраиваемым стилем, в то время как дублируется в стандартных сообщениях, в которые я не смог избавиться.
Я попытался заменить <?php else : ?>
на <?php elseif(!is_sticky()) : ?>
, но при этом отображаемая страница "paged" или номер текущей страницы больше, чем один, счетчик сообщений вычитается липкими сообщениями в соответствии с датой публикации на каждую страницу.
Любая помощь, чтобы сделать липкие сообщения, не дублированные, очень ценится.
Ответы
Ответ 1
Я бы предложил вам прочитать документацию WP_Query:
https://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
Вы можете создавать новые (или изменять существующие) запросы и получать сообщения без липких.
Не показывать липкие сообщения
Исключить все липкие сообщения из запроса:
$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
Я предлагаю вам сделать два последовательных запроса.
Сначала заберите липкие сообщения, а второй - для получения всех других сообщений (исключая липкий, как описано выше).
Ответ 2
Вы можете разделить сообщения на главной странице и другие сообщения:
<?php if (have_posts()) : ?>
<!-- if home page -->
<?php if( is_home() && !$paged ) :?>
<!-- First page loop -->
<?php $post = $posts[0]; $c=0;?>
<?php while (have_posts()) : the_post(); ?>
<?php $c++;
if( $c == 1 ) { ?>
<!--First sticky post content -->
<?php } ?>
<?php if( $c == 2 ) { ?>
<!--Second sticky post content -->
<?php } ?>
<?php if( $c == 3 ) { ?>
<!--Third sticky post content -->
<?php } ?>
<?php endwhile; ?>
<!-- End of first page loop -->
<!-- else if not home page -->
<?php else:?>
<!-- exclude stuicky posts, then run the standard loop -->
<?php $query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
<?php while (have_posts()) : the_post(); ?>
<!-- Standard post content -->
<?php endwhile; ?>
<?php endif;?>
<!-- end if home page / else -->
//pagination
<!-- else if have no posts -->
<?php else : ?>
<?php _e('Sorry, no posts matched your criteria.'); ?>
<?php endif; ?>
<!-- end if have posts / else -->
Ответ 3
Для обработки липких сообщений do
<?php
$sticky_query = new WP_Query( array( 'post__in' => get_option( 'sticky_posts' ) ) );
while ($sticky_query->have_posts()) : $sticky_query->the_post();
?>
Чтобы обрабатывать сообщения, которые не являются липкими,
<?php
$non_sticky_query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
while ($non_sticky_query->have_posts()) : $non_sticky_query->the_post();
?>
PS - is_sticky()
здесь не будет работать, поскольку я предполагаю, что этот код работает на вашей домашней странице. is_sticky()
потребует, чтобы post_id
работал, как требуется, на страницах, отличных от почтовой страницы.
Вы можете сделать что-то вроде этого is_sticky(get_the_ID())
внутри цикла в вашем текущем коде.
Ответ 4
Просто continue
в else
, если сообщение липкое.
Помещенный
<?php if ( is_sticky() ) continue;?>
в верхней части секции else...
Вы код будет выглядеть примерно так.
<?php if (have_posts()) : ?>
<?php $post = $posts[0]; $c=0;?>
<?php while (have_posts()) : the_post(); ?>
<?php $c++;
if( is_home() && !$paged && $c == 1 ) :?>
<!--First sticky post content -->
<?php elseif( is_home() && !$paged && $c == 2 ) :?>
<!--Second sticky post content -->
<?php elseif( is_home() && !$paged && $c == 3 ) :?>
<!--Third sticky post content -->
<?php else:?>
<?php if ( is_sticky() ) continue;?>
<!-- Standard post content -->
<?php endif;?>
<?php endwhile; ?>
<!-- End of the main loop -->
//pagination
<?php else : ?>
<?php _e('Sorry, no posts matched your criteria.'); ?>
<?php endif; ?>
Ответ 5
вы можете использовать этот код для отображения только липких сообщений
<?php
$args = array(
'posts_per_page' => 4,
'post__in' => get_option('sticky_posts'), //that will display only sticky posts
);
$my_query = new WP_Query($args);
while($my_query->have_posts()) : $my_query->the_post();
?>
<!-- sticky posts -->
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
затем используйте этот код, чтобы удалить только липкие сообщения из цикла
<?php
$args = array(
'posts_per_page' => 4,
'post__not_in' => get_option('sticky_posts') //that will remove only sticky posts
);
$my_query = new WP_Query($args);
while($my_query->have_posts()) : $my_query->the_post();
?>
<!-- normal posts content without sticky -->
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>