Проблема с WP_Query на пользовательском виджете

Вопрос или проблема

У меня всё работает в моём виджете, кроме результатов! Я создал таксономию, называемую “названия стран”, которую мы используем для нескольких пользовательских типов постов. Я создал этот виджет для отображения туристических гидов (CPT) из выбранной страны.

Виджет работает корректно на серверной части, но я не получаю результатов на клиентской части (например, “Список не найден”). Я вывел $instance на экран, и он корректный, так что мои args или query должны быть неверными. Может кто-то сказать, почему?

Вот код:

function widget($args, $instance) {  
extract($args);   
$title = apply_filters('widget_title', $instance['title']);
$thiscountry = $instance['thiscountry'];
$before_widget="';
echo $before_widget;
if ($title) {
    echo $before_title . $title . $after_title;
}
$this->getTourGuides($thiscountry);
echo $after_widget;
}

function getTourGuides($thiscountry) { //html
global $post;
$args = array(
'posts_per_page' => -1,
'post_type' => array('tourguides'),
'tax_query' => array(
      array(
       'taxonomy' => 'countryname',
       'field' => 'name', // также пробовал 'slug'
        'terms' => $thiscountry,
    ),    
  ),
);

//echo $thiscountry;
$listings = new WP_Query($args);
if($listings->found_posts > 0) {
    echo '
    '; while ($listings->have_posts()) { /* Получить поля пользовательского типа поста */ $ecpt_website = get_post_meta(get_the_ID(), 'ecpt_website', true); $listings->the_post(); $listItem = '
  • '; $listItem .= ''; $listItem .= get_the_title() . ''; $listItem .= '
  • '; echo $listItem; } // конец while echo '
'; wp_reset_postdata(); } else { echo '

Список не найден

'; } }

Код для instance:

// конструктор
function __construct() {
parent::__construct(
    'btn_tour_guides_by_country', // Base ID
    'BTN Tour Guides by Country', // Имя
    array('description' => __( 'Отобразить список гидов по странам в боковой панели'))
   );
}
function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['thiscountry'] = strip_tags($new_instance['thiscountry']);
return $instance;
}

// создание формы виджета
function form($instance) {
if($instance) {
    $title = esc_attr($instance['title']);
    $thiscountry = esc_attr($instance['thiscountry']);
} else {
    $title="Операторы туров";
    $thiscountry = '';
}
?>
    

Я нашел ответ здесь. У них была точно такая же проблема:
Использование tax_query меняет аргумент post_type в пользовательском WP_Query

Это проблема с плагином Easy Content Types. Pippin, автор этого плагина, написал следующее: Проблема вызвана функцией в плагине, которая помогает разрешить 404 ошибки архивов таксономии. У этой функции есть несколько проблем, и из-за них есть настройка для отключения функции. Перейдите в Типы контента > Настройки и установите "Отключить исправление архива таксономии". – Pippin 11 мая '12 в 0:03

Ответ или решение

Конечно! Вот подробное решение вашей проблемы с WP_Query в вашем пользовательском виджете WordPress.

Основные этапы решения проблемы

Определение проблемы

Вы описали, что создаете виджет для отображения тургидов с использованием пользовательского типа записи (CPT) и таксономии "country names". Весь функционал работает корректно в бэкэнде, но на фронтенде вы получаете сообщение "No listing found". Вы сомневаетесь в правильности ваших аргументов для WP_Query.

Анализ кода

Ваш код содержит несколько критических компонентов, которые влияют на работу WP_Query:

  1. Аргументы WP_Query:
    Вы используете tax_query для фильтрации записей типа tourguides по таксономии countryname. Вы проверили, что переменная $instance соответствует ожидаемому значению.

  2. Вывод Query:
    Убедитесь, что таксономия и термин корректно установлены для всех публикаций типа tourguides, которые вы пытаетесь вывести. В вашем случае, вы используете название, а не slug термина. Убедитесь, что используемых терминов в вашем коде соответствует их реальным названиям в админ-панели WordPress.

Возможные решения

  1. Проверка ввода:
    Убедитесь, что все записи tourguides имеют корректно заполненные поля для таксономии countryname. Используйте админ-панель WordPress для ручной проверки.

  2. Диагностика таксономии:
    Выполните дамп (var_dump) вашего массива аргументов $args, чтобы убедиться, что все значения корректны. Это поможет в анализе того, как WP_Query интерпретирует ваш запрос.

  3. Решение проблемы плугина:
    Вы отметили, что проблема может быть связана с плагином Easy Content Types. Воспользуйтесь рекомендацией его автора - попробуйте отключить функцию "Disable Taxonomy Archive Fix" в настройках плагина: перейдите в меню Content Types → Settings и установите отметку.

Заключение

Если после проверки и внесения предложенных изменений проблема остается, вам стоит проверить наличие обновлений для используемых плагинов и возможно временно деактивировать остальные плагины для исключения конфликтов. Также полезной может быть проверка на другой тестовой среде с минимизированным количеством установленного софта для исключения внешних влияний.

Таким образом, осторожное рассмотрение всех деталей и возможностей может привести к успешной настройке вашего виджета. Если у вас возникнут дополнительные вопросы, не стесняйтесь уточнять детали - мы всегда готовы помочь!

Оцените материал
Добавить комментарий

Капча загружается...