2014-08-30 2 views
2

Я читаю, что query_posts() следует избегать в пользу wp_query() и pre_get_posts(). Я не уверен в том, что я воюю с Loop и не совсем понимаю код.query_posts() следует избегать?

Использован ли код query_posts()? Если да и с query_posts() следует избегать, можете ли вы предложить метод, который не использует query_posts(), но все-таки выполнить то же самое?

Этот код в functions.php используется для сортировки сообщений по произвольной случайности или по цене.

function my_custom_query($query){ 
if ($query->is_home() && $query->is_main_query()) { 

    $sort= $_GET['sort']; 

    if($sort == "pricelow"){ 
    $query->set('meta_key', 'price'); 
    $query->set('orderby', 'meta_value_num'); 
    $query->set('order', 'ASC'); 
    } 

    if($sort == "random"){ 
    $query->set('orderby', 'rand'); 
    } 

} 
} 
add_action('pre_get_posts', 'my_custom_query'); 

.
Ссылка A (Random) и ссылка B (Цена) размещаются в моем меню с помощью этого кода. Таким образом, посетитель сайта может сортировать сообщения, просто нажав ссылку.

<a href="http://website.com/?sort=A">Random</a> 
<a href="http://website.com/?sort=B">Price</a> 

ответ

4

Я сделал очень подробное объяснение по этой теме на 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'); 

ЧАСТЬ ТРЕТЬЯ

Дополнительный материал для чтения, которое будет полезно в будущем

+0

Спасибо, что поделились этим Питером. Некоторые вопросы. Вы говорите: «Проверьте, что вы не на странице администратора», но что такое страница администратора?----- Если в single.php у вас есть основной цикл и вторичный цикл (для связанных записей), вы должны использовать этот код для второго цикла: ----- $ the_query = new WP_Query ($ args); ----- верный? Кроме того, вы перезагружаетесь с помощью wp_reset_postdata() для вторых циклов? Нужно ли восстанавливать оба цикла или только второй цикл? – leko

+1

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

1

Создание нового объекта WP_Query() всегда прекрасное.

$sort= $_GET['sort']; 

    if($sort == "pricelow"){ 
    $sort_args = array('meta_key' => 'price', 'orderby' => 'meta_value_num', 'order', 'ASC'); 
    $new_query = new WP_Query($sort_args); 
    } 

    blah blah blah... 

Нет, не прошу прощения. Я не видел крюк pre_get_posts.

Код в вашем вопросе подходит для подбора запросов. Как описано в WordPress Plugin API/Action Reference/pre_get_posts:

pre_get_posts запускается до установки WP_Query.

Таким образом, он перехватывает по умолчанию WP_Query(), где вы хотите (в вашем коде он меняет WP_Query на запрос GET).

В файлах шаблонов используйте новый WP_Query ($ args).

+0

Просто чтобы быть ясно ... Код в моем вопросе не должны быть использованы - это потому, что она использует query_posts ()? Вы говорите, что сначала не видели крюк pre_get_posts, почему это изменило ситуацию - не делает ли код в моем вопросе правильным? – leko

+0

Да, ваш код кажется безопасным и безопасным, потому что в документации WordPress сказано (проверьте ссылку в моем ответе). Кстати, вы не использовали функцию query_posts() в своем коде, вы использовали объект $ query. – mht

+0

О, хорошо, спасибо за это. Один вопрос - мне не нужно будет использовать ваш код ..... $ new_query = new WP_Query ($ sort_args); ..... правильно? – leko

Смежные вопросы