Вопрос или проблема
Я создаю новый сайт на WordPress и Elementor Pro, и не знаю, как сделать то, что я спросил в заголовке.
В основном, у меня есть 3 пользовательских типа записей, которые я создал с помощью ACF, называемых ‘Новости‘, ‘Артикулы‘ и ‘Рубрики‘, и я пытаюсь создать некую выделенную секцию с циклом, который показывает только последние 5 опубликованных записей из этих 3 CPT.
Моя проблема в том, что из-за разной частоты публикации этих 3, я хотел бы показывать только 1 запись из ‘Новостей‘, 2 из ‘Артикулов‘ и 2 из ‘Рубрик‘, и чтобы они были отсортированы по дате публикации.
Я также хотел бы создать еще один цикл, который показывает все записи, опубликованные в этих 3 пользовательских типах записей, но без пяти записей из вышеуказанного запроса.
Я не знаком с кодом, необходимым для создания пользовательских запросов, поэтому может кто-нибудь помочь мне создать то, что мне нужно?
Вы можете использовать класс WP_Query в WordPress, чтобы получить определенное количество записей из определенных пользовательских типов записей. Вот пример:
$cpts = [
"Новости" => 1,
"Артикулы" => 2,
"Рубрики" => 2,
];
$args = array(
'post_type' => array_keys($cpts),
// Количество записей для извлечения, увеличьте это число при необходимости
'posts_per_page' => 20,
'order' => 'DESC', // Сортировка по последним
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post = $GLOBALS["post"];
if (0 === $cpts[$post->post_type]) {
// если достигнуто количество для этого CPT
continue;
}
$cpts[$post->post_type]--;
// Выведите данные вашей записи здесь
//...
}
wp_reset_postdata(); // Сбросить данные поста после цикла
}
Замените custom_post_type_1 и custom_post_type_2 на ваши желаемые слаги типов записей и при необходимости отрегулируйте posts_per_page.
Ответ или решение
Для создания кастомного запроса в WordPress, который будет выводить последние публикации по указанным произвольным типам записей (CPT), вам потребуется использовать класс WP_Query
. В данном случае, вы хотите получить 5 последних публикаций из трех различных CPT: News
, Articoli
и Rubriche
, при этом выводя только 1 запись из News
, 2 из Articoli
и 2 из Rubriche
. Рассмотрим, как это можно реализовать.
Шаг 1: Настройка массива для определения количества записей
Сначала создайте массив, который будет хранить количество записей, которые необходимо получить из каждого CPT:
$cpts = [
"News" => 1,
"Articoli" => 2,
"Rubriche" => 2,
];
Шаг 2: Настройка аргументов для WP_Query
Теперь зададим аргументы для запроса. Поскольку нам нужно отобрать последние записи, мы установим значение order
на DESC
и укажем posts_per_page
на большее значение, чтобы избежать ограничений:
$args = array(
'post_type' => array_keys($cpts),
'posts_per_page' => 20, // Увеличьте это значение, если это необходимо
'order' => 'DESC', // Сортировка по дате публикации
);
Шаг 3: Выполнение запроса
Далее, выполните запрос и обработайте результаты внутри цикла:
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Получаем тип записи
$post_type = get_post_type();
// Проверяем, достигнуто ли максимальное количество записей для данного CPT
if ($cpts[$post_type] === 0) {
continue; // Пропускаем, если максимальное количество уже достигнуто
}
// Уменьшаем счетчик для текущего CPT
$cpts[$post_type]--;
// Здесь выводим данные о записи
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_the_excerpt() . '</p>';
// Вы также можете добавить ссылку на полное содержание и другие элементы
}
wp_reset_postdata(); // Сбрасываем данные после цикла
}
Шаг 4: Создание второго цикла
Теперь, чтобы вывести все оставшиеся записи, кроме тех, что вы уже вывели, вы можете использовать следующий код. Для этого вам нужно будет отфильтровывать записи по идентификаторам или другим параметрам. Один из простых способов — хранить ID ранее показанных записей и использовать их в WP_Query
с параметром post__not_in
:
// Сохранение ID показанных записей
$shown_ids = [];
// Создайте основной цикл, как ранее, и сохраните ID
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$shown_ids[] = get_the_ID(); // Сохраняем ID
// ...
}
wp_reset_postdata(); // Сбрасываем данные
}
// Теперь создайте второй запрос, который исключает уже показанные записи
$second_args = [
'post_type' => array_keys($cpts),
'posts_per_page' => -1, // Выводим все оставшиеся
'post__not_in' => $shown_ids, // Исключаем показанные записи
'order' => 'DESC',
];
$second_query = new WP_Query($second_args);
if ($second_query->have_posts()) {
while ($second_query->have_posts()) {
$second_query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>' . get_the_excerpt() . '</p>';
// ...
}
wp_reset_postdata(); // Сбрасываем данные
}
Заключение
Этот код реализует запрашиваемую функциональность, позволяя вам выводить определенное количество записей из различных кастомных типов и затем показывать оставшиеся. Убедитесь, что вы вставили данный код в соответствующий шаблон вашей темы WordPress или в дочернюю тему, чтобы избежать потери изменений при обновлении темы.