Вопрос или проблема
Я хотел бы запросить большинство своих страниц и категорий на главной странице. Пока что мне удается получить страницы и категории (посты), но я не могу отсортировать список так, как хочу. Я хочу получить пользовательский порядок, например, страница, посты из категории, другая страница и посты из другой категории.
Я использую следующее:
<?php
$args = array(
'cat' => $current,
'post_type' => array(
'page', 'post'),
'orderby' => 'ID' && array(2,4,1),
);
query_posts( $args );
while ( have_posts()) : the_post(); ?>
<?php // Включить шаблон содержимого страницы.
if ( is_page() ):
get_template_part( 'content', 'page' );
else:
get_template_part( 'content', 'post' );
endif;
?>
<?php endwhile;
?>
Кстати, я использую twentyfourteen и не хочу создавать множество запросов для этой задачи, если это не создаст нагрузки на веб-сервер. Я хочу сохранить память насколько это возможно.
Прежде всего, никогда не используйте query_posts
, никогда. Это очень важно. Его абсолютно не следует использовать, и его нужно удалить в будущих версиях WordPress. В общем, с точки зрения производительности, я бы сказал, что это даже хуже, чем пользовательский запрос. Вам действительно нужно использовать WP_Query
для выполнения этой задачи.
Примечание: Эта функция не предназначена для использования плагинами или темами. Как объяснено позже, есть лучшие, более производительные варианты для изменения основного запроса. query_posts() – это чрезмерно простой и проблематичный способ изменить основной запрос страницы, заменив его новой инстанцией запроса. Это неэффективно (перезапускает SQL-запросы) и полностью потерпит неудачу в некоторых обстоятельствах (особенно часто при работе с пагинацией постов).
К сожалению, вы не можете сделать это в одном запросе, так как не можете сортировать внутри цикла, и нет родной функции orderby
в WordPress для достижения этого. Кстати, ваше использование orderby
некорректно. Ознакомьтесь с параметрами orderby
в WP_Query
.
Вам нужно будет выполнить как минимум два, возможно, даже больше пользовательских запросов, чтобы достичь желаемого. Как только у вас будут запросы, их необходимо объединить, и именно здесь начинаются ваши настоящие проблемы.
Если вам потребуется пагинация, это, к сожалению, станет довольно сложным.
Я не думаю, что это действительно вопрос, на который здесь можно ответить, поскольку это потребует много кода и т. д. Мне не нравится отвечать на вопрос в таком стиле, но было бы лучше нанять профессионала, чтобы помочь вам с этим. Также вам нужно будет провести собственное исследование и протестировать некоторый код, чтобы выяснить, что работает, а что — нет.
Спасибо за предыдущий ответ. Возможно, произошла недоразумение. Я не думал, что ваш комментарий был грубым, @Pieter Goosen, и мой не имел намерения тоже. В любом случае. Мне удалось придумать следующие запросы. Я делаю запросы категорий внутри страниц. Не знаю, действительно ли это правильный способ, но он работает для меня. Мне все еще нужно будет больше углубиться, чтобы очистить код и посмотреть, есть ли какие-либо негативные последствия. Но на данный момент я получаю именно то, что мне нужно, и с дополнительными правками я смогу стилизовать свои страницы и категории так, как мне нужно.
<?php
$pages = get_pages(array (
'post_type' => 'page',
'sort_column' => 'menu_order',
));
foreach ($pages as $page) {
$apage = $page->post_name; ?>
<?php if ( $apage =='about') { ?>
<article id="<?php echo $page->post_name; ?>">
<header class="entry-header">
<?php if ( (function_exists('has_post_thumbnail')) && (has_post_thumbnail()) ) { the_post_thumbnail(); } ?>
<h2 class="entry-title"><?php echo $page->post_title; ?></h2>
</header>
<div class="entry-summary"><?php echo apply_filters('the_content', $page->post_content); ?></div>
</article>
<!-- ## Теперь сохраняем запрос страниц, чтобы ввести категории ## -->
<?php
// получить все категории из базы данных
$cats = get_categories();
// пройтись по категориям
foreach ($cats as $cat) {
// установить ID категории
$cat_id= $cat->term_id;
// создать заголовок для категории
/* if ( in_category('reviews') ) : */
echo '<header class="entry-header">'.$cat->name.'</header>';
// создать пользовательский запрос WordPress
$args = array('cat=$cat_id&posts_per_page=5');
$the_query = new WP_Query( $args );
// начать цикл WordPress!
if ($the_query->have_posts()) :
while ($the_query->have_posts()) :
$the_query->the_post();
// создаем нашу ссылку, когда пост настроен ?>
<?php if ( (in_category('reviews')) /*& ( category_slug == 'reviews' )*/ ) : ?>
<article id="cat-reviews">
<header class="entry-header">
<?php if ( (function_exists('has_post_thumbnail')) && (has_post_thumbnail()) ) { the_post_thumbnail(); } ?>
<h2 class="entry-title"><?php the_title(); ?></h2>
</header>
<div class="entry-summary"><?php the_excerpt(); ?></div>
</article><!-- #cat-reviews -->
<!-- ## Больше категорий по мере необходимости ## -->
<?php endif; ?>
<?php
endwhile;
endif; // завершен цикл категорий.
/* endif; // завершена конкретная категория */
} // завершен оператор foreach
/*
* возвращаемся к нашему запросу страниц
*/
} elseif ( $apage =='contact') { ?>
<article id="<?php echo $page->post_name; ?>">
<header class="entry-header">
<h2 class="entry-title"><?php echo $page->post_title; ?></h2>
</header>
<div class="entry-summary"><?php echo apply_filters('the_content', $page->post_content); ?></div>
</article>
<!-- ## Больше страниц по мере необходимости ## -->
<?php } // конец if
} // конец foreach ?>
Да, мне нужно будет сбросить запрос!
Ответ или решение
Чтобы упорядочить страницы и категории по ID или имени в одном запросе в WordPress, вы действительно столкнулись с определенными ограничениями. В WordPress нет встроенной функции для сортировки результатов в одном запросе так, как вы этого хотите. Однако, я дам вам подход, который поможет достичь вашего результата, используя несколько запросов и мержируя их вместе. Вам стоит использовать WP_Query
вместо query_posts
, так как он более эффективен и гибок.
Вот пример подхода, который вы можете применить:
<?php
// Получаем страницы
$pages = get_pages(array(
'post_type' => 'page',
'sort_column' => 'menu_order',
));
// Создаем массив для хранения итогового результата
$combined_results = [];
// Заполняем массив страниц
foreach ($pages as $page) {
$combined_results[] = (object) array(
'post_type' => 'page',
'post' => $page,
);
// Получаем посты для определенной категории
// Предположим, у вас есть массив категорий, из которых вы хотите вытянуть посты
$categories = ['category-slug-1', 'category-slug-2']; // замените на свои слаг-категории
foreach ($categories as $category_slug) {
$cat_id = get_cat_ID($category_slug);
$args = array(
'cat' => $cat_id,
'posts_per_page' => 5,
);
// Новый WP_Query для категории
$category_query = new WP_Query($args);
// Добавляем посты к общему результату
while ($category_query->have_posts()) {
$category_query->the_post();
$combined_results[] = (object) array(
'post_type' => 'post',
'post' => get_post(),
);
}
// Сбрасываем посты
wp_reset_postdata();
}
}
// Теперь мы можем упорядочить $combined_results по желаемому критерию
usort($combined_results, function($a, $b) {
// Можно изменить условия сортировки по вашему усмотрению
return $a->post->ID - $b->post->ID; // сортировка по ID
});
// Вывод результатов
foreach ($combined_results as $result) {
if ($result->post_type === 'page') {
// Включаем шаблон для страницы
setup_postdata($result->post);
get_template_part('content', 'page');
} elseif ($result->post_type === 'post') {
// Включаем шаблон для поста
setup_postdata($result->post);
get_template_part('content', 'post');
}
}
// Восстанавливаем оригинальные данные поста
wp_reset_postdata();
?>
Объяснение кода
-
Получение страниц: Мы сначала извлекаем все страницы, используя
get_pages
. -
Массив результатов: Создаем массив
$combined_results
, куда будем помещать результаты всех запросов. -
Получение постов из категорий: Внутри цикла для страниц мы запускаем запрос на извлечение постов из каждой категории, используя
WP_Query
. -
Сортировка: После получения всех постов и страниц мы сортируем их в итоговом массиве с помощью функции
usort
, влияя на порядок отображения. -
Вывод: В конце проходимся по массиву и выводим соответствующие шаблоны для страниц и постов.
Этот подход позволит вам управлять отображением страниц и постов так, как вам нужно, сохраняя при этом производительность благодаря использованию WP_Query
.