Вопрос или проблема
У меня есть два пользовательских типа записей: “storefront_location” и “services”
Они связаны пользовательской таксономией “location”
Я создаю шаблон записи для “storefront_location” и хотел бы отобразить список записей “services”, связанных с любым данным магазином.
Что я пытаюсь достичь:
Запись “storefront-location”, Лондон, имеет категорию “london” (таксономия “location”). Я хотел бы, чтобы запись “storefront-location” Лондон отображала все “services”, которые также имеют категорию “london” (таксономия “location”). Пользователи могли бы затем кликнуть на каждую услугу, чтобы прочитать о ней, так как это типы записей.
Я пытаюсь получить информацию о таксономии текущей записи (Лондон) и использовать tax-query, чтобы найти все услуги, которые разделяют ту же таксономию с этой конкретной записью Лондон.
Примечание: это для фильтра WP_query в Elementor, поэтому дополнительный код для запроса Elementor взят из их урока здесь.
Я довольно нов в этом, так что может быть проблема новичка. Я пытался разобраться в этом по другим примерам кода здесь на stack exchange. Я был бы признателен за любую помощь!
add_action( 'elementor/query/my_filter', function( $query ) {
// получить местоположение записи storefront-location
$custom_terms = wp_get_post_terms($post->ID, 'location');
if( $custom_terms ){
// сохраняем параметры tax query
$tax_query = array();
// проходим по местоположениям и создаем tax query
foreach( $custom_terms as $custom_term ) {
$tax_query[] = array(
'taxonomy' => 'location',
'field' => 'slug',
'terms' => $custom_term->slug,
);
}
// объединяем все аргументы WP_Query
$args = array( 'post_type' => 'services',
'posts_per_page' => -1,
'tax_query' => $tax_query );
// наконец, выполняем запрос
$loop = new WP_Query($args);
if( $loop->have_posts() ) {
while( $loop->have_posts() ) : $loop->the_post(); ?>
ИЗМЕНЕНИЕ: Для уточнения, код, показанный выше, кажется, вообще ничего не делает, когда добавляется в functions.php и при использовании 'my_filter' на виджете Записи. Поэтому запись Лондон показывает все "services", а не только услуги, отнесенные к местоположению "london."
Я строил что-то подобное пару лет назад, вот что я сделал, возможно, это поможет ... (изменено для вашего случая использования)
$result = new WP_Query([
'post_type' => 'location',
'orderby' => 'name',
'order' => 'ASC',
'posts_per_page' => -1, // все на одной странице
'tax_query' => [
[
'taxonomy' => 'services',
'field' => 'id',
'terms' => $custom_term->term_id,
'include_children' => true
]
]
]);
Так что вы уже довольно близки. Что я заметил, так это то, что вы используете $custom_term->slug
, но должно быть $custom_term->term_id
, насколько я знаю.
Ответ или решение
Для решения вашей задачи, связанной с выводом постов индивидуальных услуг, связанных с конкретным местоположением "storefront_location" в WordPress, важно учитывать правильную настройку WP_Query и использование таксономий. Давайте рассмотрим, как можно организовать код так, чтобы отобразить все посты "services", относящиеся к определенному местоположению, связанному с текущим постом "storefront_location".
Шаги по реализации
-
Получение термина текущего поста: Вам нужно получить термины таксономии "location" для текущего поста "storefront_location". Это можно сделать с помощью функции
wp_get_post_terms
. -
Формирование запроса: Создайте новый объект
WP_Query
, который будет фильтровать посты "services" на основе полученных терминов. -
Проверка и вывод результатов: Проверьте, есть ли посты, и выведите их на экран.
Пример кода
Вот пример кода, который вы можете использовать в вашем файле functions.php
, чтобы реализовать вышеописанную логику. Обратите внимание на исправления, включая использование $custom_term->term_id
в tax_query
.
add_action( 'elementor/query/my_filter', function( $query ) {
// Получаем термины текущего поста "storefront_location"
if ( is_singular('storefront_location') ) {
global $post;
// Получаем термины таксономии "location"
$custom_terms = wp_get_post_terms($post->ID, 'location');
// Если есть термины
if( !empty($custom_terms) && !is_wp_error($custom_terms) ) {
// Массив для хранения параметров таксономического запроса
$tax_query = array('relation' => 'OR');
// Проходим по терминам и формируем таксономический запрос
foreach( $custom_terms as $custom_term ) {
$tax_query[] = array(
'taxonomy' => 'location',
'field' => 'term_id',
'terms' => $custom_term->term_id, // Используем term_id
);
}
// Параметры WP_Query
$args = array(
'post_type' => 'services',
'posts_per_page' => -1,
'tax_query' => $tax_query,
);
// Выполняем запрос
$loop = new WP_Query($args);
// Проверяем наличие постов и выводим их
if( $loop->have_posts() ) {
while( $loop->have_posts() ) {
$loop->the_post(); ?>
<div class="listing-title"><?php the_title(); ?></div>
<?php
}
wp_reset_postdata(); // Сброс данных поста
} else {
echo '<p>Услуги не найдены.</p>';
}
}
}
});
Объяснение кода
-
Получение терминов: Мы используем
wp_get_post_terms
для извлечения всех терминов из таксономии "location" для текущего поста. -
Проверка на ошибки: Убедитесь, что не возникло ошибок при получении терминов.
-
Формирование таксономического запроса: Создайте массив
tax_query
, который будет содержать условия для нахождения всех постов с нужными терминами из таксономии. -
Запрос и вывод постов: Выполните запрос, а затем переберите посты, выводя заголовки на экран.
Заключение
При использовании кода выше, вы сможете вывести услуги, связанные с конкретным местоположением, когда пользователь просматривает пост "storefront_location". Убедитесь, что вы используете правильные идентификаторы терминов и проверяете наличие ошибок, чтобы избежать неожиданных проблем. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.