Вопрос или проблема
Я создал пользовательский тип записи (CPT) и связанную с ним пользовательскую таксономию. Допустим, имя пользовательской таксономии – Спорт. Я добавил термины – футбол, баскетбол.
Теперь я хочу получить заголовки постов, помеченных футболом и баскетболом отдельно на одной странице. (Примечание: я использую пользовательский шаблон страницы для отображения списка статей из CPT).
$args = array(
'post_type' => 'sports',
'tax_query' => array(
array(
'taxonomy' => 'sports_category',
'field' => 'slug',
'terms' => 'football'
),
),
);
$myquery = new WP_Query($args);
Итак, я успешно получил посты для футбола, но если я хочу получить посты для баскетбола, нужно ли мне создавать другой запрос с ‘terms’ => ‘basketball’?
Существует ли способ динамически передать ‘terms’ в WP_Query вместе с установленными $args, чтобы не писать одни и те же аргументы дважды?
Что я могу предложить в качестве решения, так это создать функцию и сохранить термины в переменной, которая будет получать свое значение из переданного значения при вызове функции.
Я хочу узнать специфическое для WP или эффективное решение.
Вы можете сделать так:
$thiscat = $wp_query->get_queried_object();//вставьте этот код
$args = array(
'post_type' => 'sports',
'tax_query' => array(
array(
'taxonomy' => 'sports_category',
'field' => 'slug',
'terms' => $thiscat->slug // Передайте это в slug
),
),
);
$myquery = new WP_Query($args);
Тогда вы сможете получить заголовки постов, помеченных футболом и баскетболом отдельно на одной странице.
Ответ или решение
Чтобы получить посты, относящиеся к пользовательской таксономии в WordPress, вы можете использовать класс WP_Query вместе с параметрами, которые позволяют фильтровать записи по определённым терминам таксономии. В вашем случае это относится к пользовательскому типу записи (CPT) «sports» и таксономии «sports_category» с терминами «football» и «basketball».
Основной подход
Если вы хотите извлечь посты для обоих терминов—футбол и баскетбол—на одной странице, существует несколько эффективных способов сделать это, не дублируя код.
1. Использование WP_Query с динамическими терминами
Вы можете использовать один и тот же объект WP_Query
и передавать разные термины в качестве переменной. Например:
// Получаем текущий термин
$current_term = get_queried_object();
// Массив для хранения термина
$terms_list = ['football', 'basketball'];
// Массив для хранения результатов
$results = [];
// Проходим по каждому термину
foreach ($terms_list as $term) {
$args = array(
'post_type' => 'sports',
'tax_query' => array(
array(
'taxonomy' => 'sports_category',
'field' => 'slug',
'terms' => $term,
),
),
);
// Выполняем WP_Query для каждого термина
$myquery = new WP_Query($args);
// Сохраняем результаты
if ($myquery->have_posts()) {
while ($myquery->have_posts()) : $myquery->the_post();
$results[$term][] = get_the_title(); // Сохраняем заголовки
endwhile;
wp_reset_postdata();
}
}
// Теперь вы можете вывести результаты
foreach ($results as $term => $titles) {
echo '<h2>' . ucfirst($term) . '</h2>';
echo '<ul>';
foreach ($titles as $title) {
echo '<li>' . $title . '</li>';
}
echo '</ul>';
}
2. Использование функции для переиспользования кода
Если вы хотите сделать ваш код более структурированным, вы можете создать отдельную функцию для обработки запросов:
function get_posts_by_term($term) {
$args = array(
'post_type' => 'sports',
'tax_query' => array(
array(
'taxonomy' => 'sports_category',
'field' => 'slug',
'terms' => $term,
),
),
);
return new WP_Query($args);
}
// Определяем массив терминов
$terms_list = ['football', 'basketball'];
// Результаты
$results = [];
// Получаем посты для каждого термина
foreach ($terms_list as $term) {
$myquery = get_posts_by_term($term);
if ($myquery->have_posts()) {
while ($myquery->have_posts()) : $myquery->the_post();
$results[$term][] = get_the_title();
endwhile;
wp_reset_postdata();
}
}
// Выводим результаты
foreach ($results as $term => $titles) {
echo '<h2>' . ucfirst($term) . '</h2>';
echo '<ul>';
foreach ($titles as $title) {
echo '<li>' . $title . '</li>';
}
echo '</ul>';
}
Заключение
Эти подходы не только устраняют необходимость дублирования кода, но и упрощают его поддержку и расширение в будущем. Вы можете легко добавлять новые термины в массив terms_list
, и код будет продолжать работать без изменений. Использование функций делает код более читаемым и повторно используемым, что является хорошей практикой в разработке на WordPress.
Использование базовых принципов организации кода, как указано выше, помогает поддерживать чистоту и эффективность вашего проекта, что, в свою очередь, способствует лучшей оптимизации по SEO.