Проблема цикла Wordpress: несколько циклов, index.php и is_paged, что приводит к дублированию сообщений на следующей странице

92
11

Привет всем. Я не уверен, что то, что я испытываю, является результатом ошибки (из-за недавнего обновления до 3.1.2) или плохого кодирования. С тех пор как я обновился до версии 3.1.2, у меня возникла проблема с двумя циклами на моей индексной странице.


Вот то, что у меня есть для моей индексной страницы


<?php
if ( ! is_paged() && is_front_page() ) {
echo '<h6 class="sec1 title">FEATURE</h6>';
$sticky = get_option( 'sticky_posts' );
if ( isset( $sticky[0] ) ) {
$args = array(
'posts_per_page' => 3,
'post__in' => $sticky,
'ignore_sticky_posts' => 1);
// Query
$featured_query = new WP_query( $args );
while ($featured_query->have_posts() ) :
$featured_query->the_post();
$featured[] = $post->ID;

get_template_part( 'content', 'featured' );

endwhile;
} // endif sticky
} // endif is_paged
?>

<?php
$sticky = get_option( 'sticky_posts' );
echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$query_args = array(
'posts_per_page' => 10,
'paged' => $paged,
'post__not_in' => $featured,
'post__not_in' => $sticky
);

query_posts($query_args);
if (have_posts() ) :
while (have_posts() ) :
the_post();

get_template_part( 'content', get_post_format() );
?>

<!--<?php trackback_rdf(); ?>-->

<?php endwhile; else: ?>

<div class="box">
<p>
<?php _e( 'Sorry, no posts matched your criteria.' ); ?>
</p>
</div>

<?php endif; ?>

// Navigation comes over here


Скажем, например, первый цикл (липкие сообщения) - который НЕ выгружается, дает 3 сообщения, а второй цикл (все остальные записи) - который вызывается страницей, дает 10 сообщений. Проблема, которую я испытываю, заключается в том, что когда я перехожу на следующую страницу, последние 3 сообщения из второго цикла на странице 1 повторяются в верхней части страницы 2.


Примечание. Первый цикл находится только на странице 1 и не повторяется на второй странице, что я и предполагал.


Итак, это то, что я пытался, я удалил условие (! is_paged() && is_front_page) вместе со всем первым циклом, и проблема была решена.


Что я делаю неправильно?

спросил(а) 2021-01-19T13:34:26+03:00 9 месяцев, 1 неделя назад
1
Решение
65

Спасибо Крису,


Я изменил ваше предложение (которое, похоже, не работает)


$paged = get_query_var('page');

if ($paged < 2) :
// Put whatever you want to only show up on the first page here
endif;


к


$paged = get_query_var('paged');

if ($paged < 1 ) {
// code goes here
}

Кажется, что первая страница не считается "paged". "paged" применяется только к страницам за пределами первой страницы.


это обновленный код для всех, кто интересуется. Кончик шляпы Крису. Еще раз спасибо.


$paged = get_query_var('paged');

if ($paged < 1 ) {
echo '<h6 class="sec1 title">FEATURE</h6>';
$sticky = get_option( 'sticky_posts' );
if ( isset( $sticky[0] ) ) {
$args = array(
'posts_per_page' => 3,
'post__in' => $sticky,
'ignore_sticky_posts' => 1);
// Query
$featured_query = new WP_query( $args );
while ($featured_query->have_posts() ) :
$featured_query->the_post();

get_template_part( 'content', 'featured' );

endwhile;

wp_reset_postdata();
} // endif sticky
} // endif $paged
?>

<?php
$sticky = get_option( 'sticky_posts' );
echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$query_args = array(
'posts_per_page' => 10,
'paged' => $paged,
'post__not_in' => $sticky
);

query_posts($query_args);
if (have_posts() ) :
while (have_posts() ) :
the_post();

get_template_part( 'content', get_post_format() );
?>

<!--<?php trackback_rdf(); ?>-->

<?php endwhile; else: ?>

<div class="box">
<p>
<?php _e( 'Sorry, no posts matched your criteria.' ); ?>
</p>
</div>

<?php endif; ?>


альтернативой предыдущему примеру был тот, который я построил с нуля, прежде чем Крис ответил:   


        <?php if ( isset( $sticky[0] ) && ! is_paged() ) {
echo '<h6 class="sec1 title">FEATURE</h6>';
} ?>

<?php while ( have_posts() ) : the_post(); ?>

<?php if ( is_sticky() ) {
get_template_part( 'content', 'featured' );
} ?>

<?php endwhile; ?>

<?php rewind_posts(); ?>

<?php
echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';

global $sticky;
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
'posts_per_page' => 10,
'paged' => $paged,
'post__not_in' => $sticky
);
query_posts( $args );
while ( have_posts() ) :
the_post() ;
?>

<?php get_template_part( 'content', get_post_format() ); ?>

<!--<?php trackback_rdf(); ?>-->

<?php endwhile; ?>

ответил(а) 2021-01-19T13:34:26+03:00 9 месяцев, 1 неделя назад
65

После первого цикла попробуйте добавить   wp_reset_postdata();


Я не уверен, что вы пытаетесь создать только первый цикл на первой странице, но если да, попробуйте что-то вроде

$paged = get_query_var('page');

if ($paged < 2) :
// Put whatever you want to only show up on the first page here
endif;

ответил(а) 2021-01-19T13:34:26+03:00 9 месяцев, 1 неделя назад
47

https://wordpress.stackexchange.com/questions/126814/wordpress-static-page-pagination/139594#139594


этот пост решил мою проблему для нескольких циклов с разбиением на страницы.

ответил(а) 2021-01-19T13:34:26+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема