Intereting Posts
Различные параметры почтового формата для каждого типа сообщений? Добавить предупреждение о зрелости для посетителей в первый раз Меню администратора и администратора. Плагин разрешений изменить боковую панель или просто виджеты для двух отдельных сообщений типа сообщения Могу ли я использовать AdSense в бесплатном блоге WordPress? Как добавить страницы в структуру пользовательского типа URL-адреса? Очистка кода WordPress, который повторяется Условные обозначения WordPress См. Таблицу поиска в базе данных? Как получить сообщения с конкретным Word Скрипты / стили оформления (Enqueue Scripts / Styles) при наличии короткого кода запрос Все сообщения типа Post A и конкретные налоговые льготы из типа Post B Неустранимая ошибка: вызов неопределенной функции wp_insert_post () Пользователь мета не сохраняет должным образом ERR_TOO_MANY_REDIRECTS, когда я меняю http на https Экспорт данных как CSV в конец с соответствующими HTTP-заголовками

Как создать целевую страницу категории, за которой следуют страницы сообщений?

Я пытаюсь создать шаблон категории в моей теме, который будет отображать статический контент, если пользователь находится на первой странице архива, а затем отображает сообщения в категории на следующих страницах. Я в основном пытаюсь воспроизвести поведение категории на Wired.com, где http://www.wired.com/category/design – целевая страница, в то время как / category / design / page / 1 показывает обратный хронологический список сообщений, подобных вам ожидалось бы в архиве категории.

Ключевым моментом здесь является то, что я не показываю никаких сообщений из архива категорий на первой странице, поэтому мне нужна следующая страница, чтобы начать с первого сообщения. Сначала я попытался сделать это с помощью смещения и ручной разбивки на страницы , установив смещение запроса на 0, если запрос «paged» var был равен 2. Но смещение игнорируется, когда оно установлено на ноль, поэтому лучше всего я могу установить смещение 1 и начните со второго поста в категории.

Это то, что я добавил в functions.php:

add_action('pre_get_posts', 'category_query_offset', 1 ); function category_query_offset(&$query) { // Before anything else, make sure this is the right query if (!$query->is_category('news')) { return; } // Next, determine how many posts per page $ppp = get_option('posts_per_page'); //Next, detect and handle pagination if ($query->is_paged) { // Manually determine page query offset $page_offset = (($query->query_vars['paged']-1) * $ppp) - $ppp; // Apply adjust page offset $query->set('offset', $page_offset ); } } 

Что было бы лучше, и то, что кажется Wired , заключается в использовании разбивки по умолчанию, чтобы сообщения начинались на странице 1, но вставляли страницу 0 для статического контента. Гипотетически это кажется возможным, если будет отображаться статический контент, если «paged» равен 0 и отображает первую страницу сообщений, если «paged» равен 1. Проблема заключается в том, что «paged» никогда не 1, потому что WordPress устанавливает «paged» 'до нуля, когда пользователь запрашивает первую страницу. Это означает, что «paged» равен 0 для категории / category / news / page / 1 и / category / news.

Есть ли способ проверить, запрашивается ли пользователь / category / news / page / 1, в отличие от / category / news? В противном случае, есть ли способ показать все должности в категории, начиная со страницы 2?

Solutions Collecting From Web of "Как создать целевую страницу категории, за которой следуют страницы сообщений?"

Это довольно интересный вопрос ( который я выделил, особенно для вашего подхода и исследований ). Большая кривая – вот первая страница запроса:

  • Вы не можете задать запрос для возврата 0 сообщений на первой странице

  • Перемещая содержимое страницы каждой страницы на одну страницу, вы потеряете последнюю страницу, так как запрос будет по-прежнему иметь только одно и то же количество сообщений, поэтому свойство $max_num_pages все равно останется таким же

Нам нужно каким-то образом «обмануть» класс WP_Query чтобы вернуть наши сообщения по-разному со смещением одной страницы, а также получить правильное количество страниц, чтобы не потерять последнюю страницу в запросе

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

ВАЖНЫЕ ЗАМЕТКИ:

  • Все непроверено, так что это может быть ошибкой. Убедитесь, что вы проверили это локально с включенной отладкой

  • Для этого кода требуется, по крайней мере, PHP 5.3, любая версия ниже 5.3 приведет к фатальной ошибке. Обратите внимание, что если вы все еще используете любую версию ниже PHP 5.5, вы должны были обновиться уже давно

  • Измените и злоупотребляйте кодом, как вы сочтете нужным, чтобы удовлетворить ваши точные потребности.

LIGHTBULB IDEA:

ЧТО МЫ НЕОБХОДИМЫ

Чтобы все работало, нам понадобится следующее:

  • Текущий номер просматриваемой страницы

  • Параметр posts_per_page установлен в настройках чтения

  • Пользовательское offset

  • Измените свойство $found_posts запроса, чтобы исправить свойство $max_num_pages

WP_Query – это WP_Query , который содержит очень простые строки кода

 if ( empty($q['nopaging']) && !$this->is_singular ) { $page = absint($q['paged']); if ( !$page ) $page = 1; // If 'offset' is provided, it takes precedence over 'paged'. if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) { $q['offset'] = absint( $q['offset'] ); $pgstrt = $q['offset'] . ', '; } else { $pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', '; } $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; } 

Что в основном происходит, когда смещение явно задано, игнорируемый параметр paged игнорируется. Первый параметр предложения SQL LIMIT пересчитывается из смещения и будет количеством сообщений, которые должны быть пропущены в сгенерированном SQL-запросе.

Из вашего вопроса, по-видимому, при установке offset на 0 , запрос смещения терпит неудачу, что странно, так как следующая проверка должна возвращать true

 if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) 

0 – действительное число и должно возвращать true. Если этого не происходит при установке, вы должны отладить проблему

Чтобы вернуться к рассматриваемой проблеме, мы будем использовать такую ​​же логику для вычисления и установки нашего смещения, чтобы получить сообщение 1 на стр. 2 и оттуда развернуть запрос. Для первой страницы мы ничего не будем изменять, поэтому сообщения, которые предположительно находятся на странице 1, по-прежнему будут на странице как обычно, нам просто нужно будет «скрыть» их позже, чтобы мы не отображали их на странице 1

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Only target the front end, VERY VERY IMPORTANT && $q->is_main_query() // Only target the main query, VERY VERY IMPORTANT && $q->is_cateory( 'news' ) // Only target the news category ) { $current_page = $q->get( 'paged' ); // Get the current page number // We will only need to run this from page 2 onwards if ( $current_page != 0 ) { // You can also use if ( is_paged() ) { // Get the amount of posts per page $posts_per_page = get_option( 'posts_per_page' ); // Recalculate our offset $offset = ( ( $current_page - 1) * $posts_per_page ) - $posts_per_page; // This should work on page 2 where it returns 0 // Set our offset $q->set( 'offset', $offset ); } } }); 

Вы должны видеть те же сообщения со страницы 1 на стр. 2. Как я уже говорил, если это не так, либо is_numeric( 0 ) возвращает false ( что не должно ), либо у вас есть еще pre_get_posts действие pre_get_posts , которое также пытается установите смещение, или вы используете использование фильтров posts_* ( более конкретно, фильтр post_limits ). Это было бы что-то, что вам нужно было бы отлаживать самостоятельно.

Следующий вопрос – исправить разбиение на страницы, поскольку, как я уже говорил, вы будете на короткой странице. Для этого нам нужно добавить значение get_option( 'posts_per_page' ) к количеству сообщений, найденных в запросе, поскольку мы компенсируем запрос этой суммой. делая это, мы фактически добавляем 1 к $max_num_pages .

 add_action( 'found_posts', function ( $found_posts, $q ) { if ( !is_admin() // Only target the front end, VERY VERY IMPORTANT && $q->is_main_query() // Only target the main query, VERY VERY IMPORTANT && $q->is_cateory( 'news' ) // Only target the news category ) { $found_posts = $found_posts + get_option( 'posts_per_page'); } }, 10, 2 ); 

Это должно сортировать все, кроме первой страницы.

ВСЕ ВМЕСТЕ СЕЙЧАС ( и специально для @ialocin – Yellow Submarine )

Все это должно идти в functions.php

 add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Only target the front end, VERY VERY IMPORTANT && $q->is_main_query() // Only target the main query, VERY VERY IMPORTANT && $q->is_cateory( 'news' ) // Only target the news category ) { $current_page = $q->get( 'paged' ); // Get the current page number // We will only need to run this from page 2 onwards if ( $current_page != 0 ) { // You can also use if ( is_paged() ) { // Get the amount of posts per page $posts_per_page = get_option( 'posts_per_page' ); // Recalculate our offset $offset = ( ( $current_page - 1) * $posts_per_page ) - $posts_per_page; // This should work on page 2 where it returns 0 // Set our offset $q->set( 'offset', $offset ); } } }); add_filter( 'found_posts', function ( $found_posts, $q ) { if ( !is_admin() // Only target the front end, VERY VERY IMPORTANT && $q->is_main_query() // Only target the main query, VERY VERY IMPORTANT && $q->is_cateory( 'news' ) // Only target the news category ) { $found_posts = $found_posts + get_option( 'posts_per_page'); } return $found_posts; }, 10, 2 ); 

ВАРИАНТЫ ПЕРВОЙ СТРАНИЦЫ

Здесь есть несколько вариантов:

ОПЦИЯ 1

Скорее всего, я поеду на этот вариант. То, что вы хотели бы сделать здесь, – создать category-news.php ( если вы еще этого не сделали ). Это будет шаблон, который будет использоваться всякий раз, когда просматривается категория news . Этот шаблон будет очень простым

пример

 <?php get_header() if ( !is_paged() ) { // This is the first page get_template_part( 'news', 'special' ); } else { // This is not the first page get_template_part( 'news', 'loop' ); } get_sidebar(); get_footer(); 

Как вы можете видеть, я включил две части шаблона, news-special.php и news-loop.php . Теперь основы двух настраиваемых шаблонов:

  • news-special.php -> Эта часть шаблона будет тем, что вы хотите отобразить на первой странице. Добавьте сюда свою персональную статическую информацию. Будьте очень осторожны, чтобы не вызывать цикл в этом шаблоне, так как на нем отображались сообщения первой страницы.

  • news-loop.php -> Это шаблон, в котором мы будем вызывать цикл. Этот раздел будет выглядеть примерно так:

     global $wp_query; while ( have_posts() ) { the_post(); // Your template tags and markup } 

ВАРИАНТ 2

Создайте отдельный шаблон со статическим содержимым и просто используйте фильтр category_template чтобы использовать этот шаблон, когда мы просматриваем первую страницу категории news . Кроме того, не забудьте использовать цикл по умолчанию в этом шаблоне. Кроме того, убедитесь, что ваше соглашение об именах здесь не сталкивается с именами шаблонов в иерархии шаблонов

Надеюсь, это полезно. Не стесняйтесь комментировать замечания

РЕДАКТИРОВАТЬ

Благодаря OP, в классе WP_Query есть определенная ошибка, проверьте билет trac № 34060 . Код, который я опубликовал, из WordPress v4.4, и ошибка исправлена ​​в этой версии.

Я вернулся к исходному коду v4.3, где ошибка, и я могу подтвердить, что 0 игнорируется при установке как значение для offset поскольку код просто проверяет, является ли параметр offset empty . 0 принимается пустым в PHP. Я не уверен, что это поведение (ошибка) найдено только в версии 4.0 или только во всех предыдущих версиях (согласно биту, эта ошибка находится в версии 4.0), но есть исправление для этой ошибки, которую вы можете проверить в билетной кассе. Как я уже сказал, эта ошибка определенно исправлена ​​в версии 4.4

Обновить:

 add_action('pre_get_posts', 'category_query_offset', 1 ); function category_query_offset($query) { // Before anything else, make sure this is the right query if (!$query->is_category('news')) { return; } // Next, determine paged $ppp = get_option('paged'); } // Next, handle paged if($ppp > 1){ $query->set('paged', $ppp-1); } 

Попробуйте что-нибудь вроде

 $paged = ( get_query_var('paged') ) ? get_query_var('paged')-1 : 1; $args = array ( 'paged' => $paged, );