Я сделал очень подробное объяснение по этой теме на WPSE, и ради ценности и пользы, которые это может иметь для пользователей SO, вот полный пост, скопированный с этого вопроса на WPSE. Для интереса, вот ссылка на полный пост на WPSE: Some doubts about how the main query and the custom query works in this custom theme?
Ваш фактический вопрос в основном заключается в том, когда запускать пользовательский запрос и когда использовать основной запрос. Позволяет разбить его на три части
ЧАСТИ ПЕРВОЙ
Когда запустить пользовательский запрос (Это не окончательный список)
Для создания ползунков пользовательского контента
Чтобы создать отображаемую область содержимого на странице
На странице.шаблоны PHP, если вам нужно отобразить сообщения
Если требуется пользовательский контент на статической главной странице
связанных дисплея, популярные или информационные сообщений
Любое другое среднее или дополнительное содержание выходит за рамки основной запрос
Когда нужно использовать основной запрос.
Для отображения основного контента на
На главной странице и страницы установки в качестве blogpage в бэкэнде
Всех страниц архива, который включает в себя шаблоны, как archive.php, category.php, author.php, taxonomy.php, Tag.php и date.php
ЧАСТЬ ВТОРАЯ
Чтобы выбрать все признаки сообщения, которые я использую эту строку, создать новый объект WP_Query, которые определяют запрос, имеющий конкретный тег признаков:
Таким образом, от того, что я понимаю, это не в WordPres основного запрос, но это новый запрос, созданный мной. Из того, что я понял, лучше создать новый запрос (как сделано), а не использовать основной запрос, когда я хочу выполнить этот вид операций.
Исправить. Это выходит за рамки основного запроса. Это дополнительный или дополнительный контент, который не может быть создан с помощью основного запроса. You ДОЛЖНЫ ВСЕГДА использовать либо WP_Query
, либо get_posts
для создания ваших пользовательских запросов.
НИКОГДА НЕ ИСПОЛЬЗУЙТЕquery_posts
, чтобы создавать пользовательские запросы или даже любые другие запросы. Мой акцент.
Примечание: Эта функция не предназначена для использования плагинов или темы. Как поясняется ниже, есть более эффективные, более эффективные варианты для изменения основного запроса. query_posts() является слишком упрощенным и проблематичным способом изменения основного запроса страницы путем замены его новым экземпляром запроса. Он неэффективен (повторно запускает SQL-запросы), и в некоторых случаях он будет неудачным (особенно часто при работе с разбивкой по страницам).
Перемещение по
Ok, происходит я показать все посты, которые не признакам тег, чтобы сделать это я использую этот фрагмент кода, который, напротив изменить основной запрос:
query_posts(array('tag__not_in' => array ($term->term_id)));
Так что я думаю, что это довольно ужасно. Это правда?
Это неверно, и ваше заявление, к сожалению, верно. Как было сказано ранее, NEVER использовать query_posts
. Он выполняет полный новый запрос, что плохо для производительности, и в большинстве случаев разбивает разбиение на страницы, что является неотъемлемой частью основного запроса на правильность работы страницы.
Это ваш основной контент, так что вы должны использовать основной запрос с контуром по умолчанию, который должен выглядеть так, и это все, что вам нужно
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
Вы можете полностью избавиться от этой части , удалить его, записать его и забыть о нем
<?
// get the term using the slug and the tag taxonomy
$term = get_term_by('slug', 'featured', 'post_tag');
// pass the term_id to tag__not_in
query_posts(array('tag__not_in' => array ($term->term_id)));
?>
OK после того, как вы сделали это, вы увидите, что сообщения из художественного тега появятся в вашей домашней странице с помощью основного запроса и по умолчанию цикла.
Правильный способ удаления этого тега с домашней страницы - pre_get_posts
. Это правильный способ изменить основной запрос, и крючок должен быть всегда использовать для внесения изменений в ваш основной цикл содержимого.
Таким образом, код с pre_get_posts
является правильным, и это функция, которую вы должны использовать. Только одно: всегда проверяйте, что вы не на странице администратора, потому что pre_get_posts
изменяет задний конец. Так что это правильный код для использования в functions.php для удаления сообщений с тегами признакам с домашней страницы
function exclude_featured_tag($query) {
if (!is_admin() && $query->is_home() && $query->is_main_query()) {
$query->set('tag__not_in', 'array(ID OF THE FEATURED TAG)');
}
}
add_action('pre_get_posts', 'exclude_featured_tag');
ЧАСТЬ ТРЕТЬЯ
Дополнительный материал для чтения, которое будет полезно в будущем
Спасибо, что поделились этим Питером. Некоторые вопросы. Вы говорите: «Проверьте, что вы не на странице администратора», но что такое страница администратора?----- Если в single.php у вас есть основной цикл и вторичный цикл (для связанных записей), вы должны использовать этот код для второго цикла: ----- $ the_query = new WP_Query ($ args); ----- верный? Кроме того, вы перезагружаетесь с помощью wp_reset_postdata() для вторых циклов? Нужно ли восстанавливать оба цикла или только второй цикл? – leko
Страница администратора ссылается на любую страницу заднего плана. Вы совершенно правильно относитесь к своим предположениям о связанных сообщениях, которые должны быть настраиваемым запросом, и да, вы ** должны ** сбросить каждый пользовательский запрос, иначе вы нарушите другие запросы на той же странице. Не нужно перезагружать основной запрос, который встроен. –