Страница с wp_query - это багги - работа на некоторых страницах, но не другие

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7687

  •  16-10-2019
  •  | 
  •  

Вопрос

У меня очень особая ошибка с страницей :( Я пытаюсь отобразить 4 сообщения на страницу для категории с слизняком "Lastest-News".

Функция лиц, кажется, работает правильно. Есть 33 сообщения. Правильно строится страницы с 9 страницами и ссылками следующего формата:/Category/Lastest-News/Page //

Интересно, что он работает правильно (отображает 4 сообщения на страницу) со страницы 1-4, включая. Однако для страниц 5-9 это вообще не работает. Кажется, это даже не служит шаблону ... единственная ошибка, которую я мог бы заметить,-это страница, в которой говорится, что «ничего не найдено для категории последних новых страниц 5».

Я бы понял, если это не сработает вообще, но для случайных 4 страниц и не больше?

Я бы очень признателен за любую помощь! Я провожу более 4 часов, пытаясь выяснить, что случилось, и это меня беспокоит.

Спасибо за помощь :)

Я использую следующий код для запроса:

<?php 
$page = get_query_var('paged');
$posts_on_page = new WP_Query("posts_per_page=4&category_name=lastest-news&paged=".$page);

//loop to display every one of 4 posts

//pagination
pagination($posts_on_page->max_num_pages);
?>

Я использую функцию лиц из этого поста: http://www.kriesi.at/archives/how-to-build-a-wordpress-post-pagination-without-plugin

Вот функция (которая, кажется, работает нормально):

function pagination($pages = '', $range = 2){  
 $showitems = ($range * 2)+1;  

 global $paged;
 if(empty($paged)) $paged = 1;

 if($pages == '')
 {
     global $wp_query;
     $pages = $wp_query->max_num_pages;
     if(!$pages)
     {
         $pages = 1;
     }
 }   

 if(1 != $pages)
 {
     echo "<div class='pagination'>";
     if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo;</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo;</a>";

     for ($i=1; $i <= $pages; $i++)
     {
         if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
         {
             echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
         }
     }

     if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>&rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>&raquo;</a>";
     echo "</div>\n";
 }
}
Это было полезно?

Решение

WordPress делает свой собственный запрос на каждой странице. Вы должны изменить этот запрос вместо создания нового. Что происходит сейчас, так это то, что WordPress делает запрос со стандартными сообщениями на страницу 10, но вы ничего не делаете с этими результатами и выполняете свой собственный запрос. Это работает ... пока WordPress не выйдет за рамки сообщения № 33, которая находится на странице № 4.

  1. WordPress запросы 1-10, ваш шаблон запросов 1-4
  2. WordPress запросы 11-20, ваш шаблон запросов 5-8
  3. WordPress запросы 21-30, ваш шаблон запросов 9-12
  4. WordPress запросы 31-40, ваш шаблон запросов 13-16
  5. WordPress запросы 41-50, но не получает результатов, поэтому он дает 404. Ваш шаблон не загружается.

Таким образом, вместо этого вы должны изменить стандартный запрос, который будет выполнять WordPress, поместив это в свой functions.php или в плагине:

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
    if ( $wp_query->is_category && 'latest-news' == $wp_query->get_queried_object()->slug ) {
        $wp_query->set( 'posts_per_page', 4 );
    }
}

Другие советы

На основании ответа @Jan Fabry я немного изменил синтаксис. Это работает хорошо. Спасибо Ян за объяснение !!!

add_action( 'pre_get_posts', 'wpse7687_pre_get_posts' );
function wpse7687_pre_get_posts( &$wp_query ) {
  if ($wp_query->query_vars['category_name'] == 'latest-news'){
    $wp_query->query_vars['posts_per_page'] = 4;
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top