Изменить количество сообщений на странице

14

В настройках WordPress => Чтение => Страницы блога показывают не более [поля ввода] сообщений

У меня сейчас установлено 3 поста.

В моем индексе, архивах дат, архивах тегов, архивах категорий, результатах поиска и т. Д. На всех страницах, которые используют цикл и подкачку страниц, теперь отображается 3 сообщения на страницу.

Моя цель - иметь разное количество результатов для разных страниц. В моем индексе может быть 3 сообщения, но в результатах поиска или архивах показывается различное количество результатов на странице.

Есть идеи как это сделать?

JasonDavis
источник

Ответы:

23

Это сделает это: (добавьте в functions.php вашей темы)

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {

  global $wp_the_query;

  if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
    $query->set( 'posts_per_page', 3 );
  }
  elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
    $query->set( 'posts_per_page', 5 );
  }
  // Etc..

  return $query;
}
Дейв Ромси
источник
Это setметод $query?
Rutwick Gangurde
@RutwickGangurde Да. На самом деле is_search () и is_archive () тоже есть, что теперь немного яснее после обновления моего ответа информацией, полученной из этого замечательного поста: billerickson.net/customize-the-wordpress-query В этой статье также отмечается, что мы ' В WP3.3 будет метод $ wp_query-> is_main_query (), что довольно круто.
Дейв Ромси
Крутой мужик! Большое спасибо за отличный пост. Я никогда не знал этих методов, и я использовал детализацию объекта / массива для изменения / установки значений. Хорошо для хаков на лету! +1 для тебя!
Rutwick Gangurde
С каких это пор было необходимо его никогда не менять, если панель инструментов is_admin? Похоже, что он не синхронизирует «Количество элементов на странице:» в параметрах экрана в WP, что может привести к страницам, к которым вы не можете перейти.
NoBugs
0

Улучшение ответа выше: ловушка pre_get_postsизвлекается по ссылке, поэтому она не требует globalвызова или returnвызова.

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {

  if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
    $query->set( 'posts_per_page', 3 );
  }
  elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
    $query->set( 'posts_per_page', 5 );
  }
  // Etc..

}
Художественная фантазия
источник
Также существует проблема с вашим кодом, так как использование глобального $ wp_query приведет к потере памяти, но вы не можете вызвать неопределенные различные $ wp_the_query
Абдулкабир Оджулири
0

Используя $ GLOBALS ['wp_query'] или просто $ wp_query

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {

  if ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_query'] ) && ( $query->is_search() ) ) {
    $query->set( 'posts_per_page', 3 );
  }
  elseif ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_the_query'] ) && ( $query->is_archive() ) ) {
    $query->set( 'posts_per_page', 5 );
  }

  return $query;
}
Абдулкабир Оюлари
источник