Вопрос или проблема
У меня есть пользовательский цикл на основе этих аргументов (ниже), и по какой-то причине, когда он запускается, 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 не смог найти подходящие записи, основываясь на текущих параметрах. Убедитесь, что:
- Публикации с указанным статусом (например,
draft
) существуют в базе данных. - Убедитесь, что категория, на которую вы ссылаетесь (например,
de
,ch
), действительно привязана к постам. - Проверьте метаданные (
review_rating
иreview_id
) к постам, чтобы убедиться, что они правильные и соответствуют вашим условиям.
Дополнительно можно использовать var_dump
или print_r
для отладки значений переменной $args
перед выполнением WP_Query
, чтобы удостовериться, что в вашем массиве не содержится неожиданных значений.
Следуя этим рекомендациям, вы должны сможете решить вашу проблему и избежать добавления ненужного условия в SQL запросы.