SQL, возвращаемый Wp_Query, имеет wp_posts.ID = -1

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

У меня есть пользовательский цикл на основе этих аргументов (ниже), и по какой-то причине, когда он запускается, SQL возвращает этот фрагмент:

… AND wp_posts.ID = -1 …

И я не получаю никаких результатов из базы данных. Если я запускаю запрос к базе данных без этого фрагмента, я получаю нужные результаты. Не мог бы кто-нибудь указать, что не так в списке аргументов, что вызывает такое поведение?

$args = array (
    'post_status'           => 'draft',
    'posts_per_page'        => 10,
    'category_name'         => $language_sql_param, //фиксировано
    'meta_query'            => array(
        array(
            'key'       => 'review_rating',
            'value'     => '3',
            'compare'   => '>',
            'type'      => 'NUMERIC',
        ),
    ),
    'cache_results'          => false,
    'update_post_meta_cache' => false,
    'update_post_term_cache' => false,
    'suppress_filters' => true,
    'meta_key' => 'review_id',
    'orderby'  => 'meta_value_num',
); 

$wp_query = new WP_Query( $args );

Пересмотренный вопрос:

Я фильтрую сообщения на основе категории(ий), к которым они принадлежат, в моем случае это коды стран. Вот SQL, который WP генерирует, когда я устанавливаю $language_sql_param на следующее:

$language_sql_param = 'us,gb,ca,au,ie'

Все работает нормально, и возвращаются ID для моих сообщений для стран, говорящих на английском.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
    INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE 1=1
        AND ( wp_term_relationships.term_taxonomy_id IN (20,21,28,36,37) )
        AND wp_posts.post_type="post"
        AND (wp_posts.post_status="draft")
        AND (wp_postmeta.meta_key = 'review_id'
        AND (mt1.meta_key = 'review_rating'
        AND CAST(mt1.meta_value AS SIGNED) > '3') )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 DESC
LIMIT 0, 10

Когда я устанавливаю $language_sql_param = "'de,ch'", я получаю следующий SQL:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
    INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE 1=1
        AND wp_posts.ID = -1
        AND ( wp_term_relationships.term_taxonomy_id IN (27,34) )
        AND wp_posts.post_type="post"
        AND (wp_posts.post_status="draft")
        AND (wp_postmeta.meta_key = 'review_id'
        AND (mt1.meta_key = 'review_rating'
        AND CAST(mt1.meta_value AS SIGNED) > '3') )
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value+0 DESC
LIMIT 0, 10

В SQL есть этот лишний AND wp_posts.ID = -1. WordPress, похоже, правильно генерирует IN-клаузу для категорий, которые я фильтрую, как в AND (wp_term_relationships.term_taxonomy_id IN (27,34)), но из-за того, что WordPress каким-то образом добавляет условие AND wp_posts.ID = -1, никакие сообщения не возвращаются.

Откуда берется AND wp_posts.ID = -1?

Если вы используете редактор с подсветкой синтаксиса, вы можете легче заметить эти проблемы.

Измените этот код:

'category_name'         => ",

На этот код:

'category_name'         => '',

Это исправит синтаксическую ошибку в вашем коде.

Вы говорите, что все работает нормально с

$language_sql_param = 'us,gb,ca,au,ie'

но что это не работает с

$language_sql_param = "'de,ch'"

Работает ли с $language_sql_param = 'de,ch'?

Обоснование:

'us,gb,ca,au,ie' != "'us,gb,ca,ie'". В последнем случае у вас есть лишние ' символы в строке, которую вы передаете для $language_sql_param.

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

Проблема, описанная в вашем вопросе, связана с тем, как вы задаете значение переменной $language_sql_param. Когда вы устанавливаете

$language_sql_param = "'de,ch'";

это создает строку, содержащую символы единой кавычки в начале и в конце (то есть, фактически строку "'de,ch'"), что неверно. Однако, когда вы используете

$language_sql_param = 'de,ch';

вы получаете корректную строку, состоящую только из языковых кодов, без лишних символов. Это объясняет, почему ваш запрос работает правильно с us,gb,ca,au,ie, но не с "'de,ch'" — наличие лишних кавычек приводит к ошибкам в SQL.

Чтобы устранить проблему, просто замените ваш код:

$language_sql_param = "'de,ch'";

на правильный вариант:

$language_sql_param = 'de,ch';

Кроме того, вы можете захотеть удостовериться, что переменная $language_sql_param корректно обрабатывается и в других частях вашего кода, чтобы избежать аналогичных ситуаций.

Если вы все еще видите условие AND wp_posts.ID = -1 в SQL запросе, это может быть признаком того, что WP_Query не смог найти подходящие записи, основываясь на текущих параметрах. Убедитесь, что:

  1. Публикации с указанным статусом (например, draft) существуют в базе данных.
  2. Убедитесь, что категория, на которую вы ссылаетесь (например, de, ch), действительно привязана к постам.
  3. Проверьте метаданные (review_rating и review_id) к постам, чтобы убедиться, что они правильные и соответствуют вашим условиям.

Дополнительно можно использовать var_dump или print_r для отладки значений переменной $args перед выполнением WP_Query, чтобы удостовериться, что в вашем массиве не содержится неожиданных значений.

Следуя этим рекомендациям, вы должны сможете решить вашу проблему и избежать добавления ненужного условия в SQL запросы.

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

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