Single php query posts

query_posts() — модификация основного цикла

Когда я писал про циклы, я говорил, что если хотите как-то «по-особому» вывести записи, например в случайном порядке, используйте query_posts() .

Итак, query_posts() видоизменяет основной цикл WordPress, то есть, если раньше на главной показывались последние 10 записей с блога, то теперь там может показываться что угодно и сколько угодно.

Обычные примеры

Этот код выведет заголовки всех записей из рубрики с >

query_posts("cat=22"); while (have_posts()) : the_post(); echo'

'; the_title(); echo'

'
; endwhile; wp_reset_query();

Как и в случае с wp_list_categories(), параметры можно указывать в скобках, а можно выносить в отдельную переменную-массив (кстати, советую использовать именно двойные кавычки, как в примере).

Выводим записи из всех рубрик кроме и >

Выводим записи, опубликованные в текущем месяце.

$curr_year = date('Y'); // текущий год $curr_month = date('m'); // текущий месяц query_posts("year=$curr_year&monthnum=$curr_month");

Записи из рубрики с опубликованные в текущем месяце и отсортированные по заголовкам (в алфавитном порядке) по возрастанию:

$args = array( 'cat' => 2, 'year' => $curr_year, 'monthnum' => $curr_month, 'orderby' => 'title', 'order' => 'ASC' ); query_posts($args);

Примеры с модификацией основного цикла страницы

Честно говоря, все предыдущие примеры вообще как-то не в тему к этой функции, они больше подходят к использованию через WP_Query(). Ну да ладно, прост пост я писал давно, а сейчас жалко все это удалять. Короче я покажу, для чего на самом деле нужна функция query_posts() .

Сортируем посты на странице по имени:

global $query_string; // глобальные параметры в виде строки query_posts( $query_string . '&orderby=name' ); // делаем сортировку постов по имени, объединив параметры

Тот же самый пример, но только через массивы:

global $wp_query; // глобальные параметры, которые уже стоят по умолчанию на странице $args = array_merge( $wp_query->query_vars, array( 'orderby' => 'name' ) ); // добавляем к ним сортировку по имени query_posts( $args );

Вы наверное понимаете, что таким образом можно вытворять всё, что угодно, например сортировать товары по цене (и по возрастанию и по убыванию).

P.S. в самой документации WordPress не рекомендуется использовать несколько query_posts() на странице, они говорят, что это приводит к багам, хотя лично я ничего такого не замечал.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 31

Привет Миша! Помоги решить задачу.
На главную нужно вывести из трех кат.(например с по три записи(c как осуществить, что удалить может. Спасибо. вот код —>

Здравствуйте.
Собственно, ситуация следующая.
На главной странице использую плагин для пагинации — PageNavi, все работает корректно.
Сейчас создал свою страницу для одной из категорий, и решил подключить стандартную пагинацию, т.к. шаблоны страниц слегка отличаются. Использовал код — max_num_pages > 2 ) : ?> На сайте ограничение стоит на 10 записей, всего в базе — 12.
Пагинация выводит три номера страницы и дублирует одни и те же записи. В чем может заключаться проблема?

Добрый день!
Если у вас в настройках сайта стоит 10 записей, а выводится другое количество, это значит, что в цикле параметр posts_per_page переопределяется, вам нужно найти где.

Спасибо большое! Нашел, где идет перераспределение) Одна лишняя страница исчезла, но осталась ещё одна, которая дублирует записи на предыдущей странице.
В базе — 12 записей, она дубликатом выдает 20. Какой здесь подвох? Безумно буду благодарен за совет!)

Проблема найдена! И она крылась намного глубже)) Дело даже не в posts_per_page, как оказалось, wp_query был лишним и вызывал сбой в работе. Михаил, огромное Вам спасибо за наводку. И огромное спасибо за ресурс и статьи!

столкнулся с проблемой неработающей пагинации:
если в запросе query_posts указано меньшее число постов чем в настройках вордпресса, то навигация не работает
мне для отдельной категории нужен отдельный шаблон,
в запросе указано:

 if (is_category('club')): {query_posts('category_name=club&showposts=4&orderby=date');} ?>

// далее идёт цикл сама навигация отображается, но при клике на ссылку второй страницы вижу 404 (
есть решение?

function club_post_queries( $query ) { if (!is_admin() && $query->is_main_query()){ if(is_category('club')){ $query->set('posts_per_page', 4); } } } add_action( 'pre_get_posts', 'club_post_queries' );

но глобально вопрос остался
если будет опубликовано больше 4х статей, то система обрежет лишнее ( появилась мысль сделать выборку по дате.
т.е. выводить на странице посты за одну дату как в архивах, а пагинация должна перебрасывать на следующую страницу с постами у которых общая дата
как это возможно?

у меня материал публикуется блоками, по несколько постов. они могут публиковаться как сразу в один день так и за пару тройку дней. задача разделить навигацию по дням, но дни идут не подряд. т.е. сегодня и завтра я опубликовал 4 материала и это один блок, а через две недели ещё 5 и это второй блок. мне нужно чтобы в одном блоке показывался весь материал и при этом между ними работала постраничная навигация

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

Добрый вечер, я вот в wpmag прочитал что query_posts нежелательно использовать т.к. она заменяет основной цикл и что вроде могут быть ошибки. Могут быть с этой функцией проблемы?

Добрый вечер!
По сути с любой функцией могут 🙂 Что касается query_posts() , то просто следует знать, где её нужно использовать, а где нет. Если вы скажите, для каких целей вы хотите её задействовать, я могу вам подсказать — нужно или нет 🙂

Миша, это снова я.
Напомню. На вордпрессе создана произвольная таксономия, сделана страница архива этой таксономии, скажем, taxonomy-nane.php.
Нужно написать код, который сделает так, чтобы на странице архива не выводились ссылки на посты, принадлежащие дочерним таксономиям (подтаксономиям).
мне вот тут посоветовали вот так код построить:
сначала вот это:

 $the_query = new WP_Query( $args ); $args = array( 'child_of' => 0, 'parent' => '' ) ?>  while ($the_query->have_posts()) : $the_query->the_posts(); ?>
 endwhile; ?>  wp_reset_postdata(); ?>
global $wp_query; $taxonomy_slug = get_query_var('term'); $taxonomy = get_query_var('taxonomy'); $args = array_merge( $wp_query->query_vars, array( 'tax_query', array(array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => array( $taxonomy_slug ), 'include_children' => false ) ) ) ); query_posts( $args );
 global $wp_query; $taxonomy_slug = get_query_var('term'); $taxonomy = get_query_var('taxonomy'); $args = array_merge( $wp_query->query_vars, array( 'tax_query', array(array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => array( $taxonomy_slug ), 'include_children' => false ) ) ) ); query_posts( $args ); ?>

И результата нет
Когда вставляю второй код — он мне выводит то, что у меня уже с Вашей помощью сделано — подтаксономию.
Но ссылки выводятся на все записи, не исключая дочерние

Миша, к сожалению, не могу сказать, так как не знаю, что это такое.
Факт в том, что сделал то, что хотел с помощью одного программиста. Ваши подсказки я ему тоже показывал.

Привет, Михаил. Дублирую из скайпа вопрос: В купленной мной теме есть файл портфолио, которое выводит все записи из избранной рубрики. Так же в нем организован фильтр, который переключает записи по подрубрикам для удобства. Это портфолио я приспособил под каталог. Изначально было предусмотрен вывод 60 записей в виде плитки по три в ряд, что вполне смотрибельно. Но в моем каталоге около 200 записей, так что страница долго загружается и имеет длинную прокрутку. Я пытался сделать пагинацию посредством wp-pagenavi но ничего не вышло — я не программист. Вероятно, требуется внести более серьезные изменения в код, чем я предполагал. Так что сейчас задача такая: Сделать пагинацию, чтобы «все записи», которые выводятся при загрузке портфолио, были разбиты, скажем по 18 штук с постраничной навигацией, хотелось бы, чтобы навигация была и в отфильтрованных подкатегориях, если количество записей в них больше 18. Сам код ниже.

$titan = TitanFramework::getInstance(‘gpress’);?>
echo$titan->getOption(‘filter-title’); ?>

echo$titan->getOption(‘filter-subtitle’); ?>

  • Фильтр:
  • _e(‘Все’, ‘gpress’); ?>$terms = get_terms(‘category’, array(‘parent’ =>$titan->getOption(‘filter-cat’))); $count = count($terms); if($count >0){foreach($termsas$term){echo«
  • .$term->slug.«‘>» . $term->name . «\n«; }}?>
  • $terms_ID_array = array(); foreach($termsas$term){$terms_ID_array[] = $term->term_id; }$terms_ID_string = implode(‘,’, $terms_ID_array); $the_query = newWP_Query(‘posts_per_page=30&cat=’.$terms_ID_string); ?>if($the_query->have_posts()) : ?>

    while($the_query->have_posts()) : $the_query->the_post(); $termsArray = get_the_terms($post->ID, «category»); $termsString = «»; foreach($termsArrayas$term){$termsString .= $term->slug.‘ ‘; }?>
    echo$termsString; ?> filter-block grid-item»>
    $thumb = get_post_thumbnail_id(); $img_url = wp_get_attachment_url($thumb,‘full’); $image = aq_resize($img_url, 400, 400, true, true, true); ?>if($image) : ?>echo$image?>» alt=»the_title(); ?>«>endif; ?>
    the_title(); ?>
    if($image) : ?>echo$img_url?>«>endif; ?>the_permalink()?>«>

    endwhile; ?>

    endif; ?>

    Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

    Источник

    Читайте также:  Создать поток java thread
    Оцените статью