Разный цикл для страниц тегов?

У меня есть тема, которая использует один файл шаблона для отображения индекса блога, цикл является основным:

if ( have_posts() ) : while ( have_posts() ) : the_post(); 

Я хочу использовать другой настраиваемый цикл для всех моих is_tag( '' ) .

 if ( is_tag() ) { if ( have_posts() ) : while ( have_posts() ) : the_post(); } else { $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $query_args = array( 'post_type' => 'post', 'post_status' => array( 'private', 'publish' ), 'posts_per_page' => 20, 'paged' => $paged, ); $the_query = new WP_Query( $query_args ); if ( $the_query->have_posts() ) : <!-- the new loop --> while ( $the_query->have_posts() ) : $the_query->the_post(); } 

Это не работает вообще. Он отображает все ниже заголовка. Любые идеи, как я могу сделать это простым способом?

EDIT: Я понимаю, что is_tag() может не работать вне цикла, поэтому это не работает? Какое хорошее решение?

Solutions Collecting From Web of "Разный цикл для страниц тегов?"

Ваш код пытается использовать операторы if для контроля того, какие операторы используются и т. Д., Что является метапрограммированием. Это не сработает, и он никогда не сможет работать.

 <?php if ( is_tag() ) { if ( have_posts() ) { while ( have_posts() ) { the_post(); } else { $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; $query_args = array( 'post_type' => 'post', 'post_status' => array( 'private', 'publish' ), 'posts_per_page' => 20, 'paged' => $paged, ); $the_query = new WP_Query( $query_args ); if ( $the_query->have_posts() ) { <!-- the new loop --> while ( $the_query->have_posts() ) { $the_query->the_post(); } 

Вышеприведенный код эквивалентен тому, что вы написали, и имеет следующие проблемы:

  • В середине вашего PHP-кода есть комментарий HTML, это недопустимый синтаксис и не PHP
  • Вы никогда не закрываете свой первый оператор if или ваш второй.
  • Ваш первый цикл сообщений на самом деле ничего не делает
  • В вашем другом выражении отсутствует закрывающая скобка
  • Вы pre_get_posts создать совершенно новый запрос, а не модифицировать существующий с pre_get_posts фильтра pre_get_posts . Это означает, что вы делаете это в шаблоне страницы и пытаетесь отображать сообщения, вместо того, чтобы полагаться на знание иерархии шаблонов. Знаете ли вы, что WordPress предоставляет шаблоны для категорий тегов и пользовательских типов сообщений, вплоть до отдельных дат и определенных категорий? Читайте о иерархии шаблонов, это избавит вас от огромного количества времени, вы можете потратить впустую тысячи впустую в оплачиваемые часы, не зная об этом.

Из-за всех этих синтаксических ошибок PHP отказывается и отправляет ошибку. Вот почему вы не получаете ничего ниже своего заголовка, потому что PHP, который происходит после вашего заголовка, недействителен. Чтобы сделать то, что вы пытались сделать, вам понадобится препроцессор, который PHP не имеет

Вы указали, что этот шаблон предназначен для домашней страницы, но он также используется в архивах тегов, что означает, что на самом деле это index.php .

Поэтому вместо этого давайте определим две проблемы:

  1. Вам нужно изменить то, что показано на главной странице
  2. Вам нужно показать что-то еще, когда в архивах тегов

Решение проблемы 1

До сих пор ваше решение заключалось в том, чтобы игнорировать то, что WordPress извлечено из базы данных и сделать второй запрос к базе данных. Это дорого и эквивалентно этому:

Вы отправляете свой ПА каждое утро, чтобы принести вам чашку чая. Вы отправляете их на место в 30 минутах езды, и каждый день, когда они возвращаются, вы бросаете чай на пол и говорите: «На самом деле я хочу латте»,

Достаточно сказать, что это дорого и тратит много времени. Ваш новый WP_Query эквивалентен query_posts . Люди говорят, что не используйте query_posts из-за того, что он делает, что здесь происходит, это немного более элегантный способ сделать то же самое, он по-прежнему принципиально дорог.

Вместо этого вы можете использовать pre_get_posts :

 function exclude_category( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'posts_per_page', '20' ); $query->set( 'post_status', array( 'private', 'publish' ); } } add_action( 'pre_get_posts', 'exclude_category' ); 

Этот фильтр изменит запрос до того, как он произойдёт на вашей домашней странице, что позволит вам использовать стандартный обычный цикл сообщений, а не настраиваемый цикл WP_Query . Pagination будет просто работать из коробки, и никаких дополнительных запросов не будет. Это эквивалентно:

Перед тем, как PA выйдет, чтобы получить чашку чая, вы нажимаете их на плечо и говорите: «Этот порядок неправильный, извините, что вы можете взять меня вместо латте?». PA получает латте в первый раз, чай не бросается на пол, и вы получаете свой напиток намного быстрее

В стороне, index.php является резервным шаблоном. Для вашей домашней страницы рассмотрите возможность использования home.php .

Как и все фильтры, это происходит в functions.php , а не в вашем шаблоне.

Решение проблемы 2

Используйте tag.php , это так просто. Не пытайтесь использовать один и тот же шаблон для отображения нескольких вещей с условными обозначениями во всем мире, просто следуйте иерархии шаблонов и дайте WordPress выполнить работу