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(); ?>