Wordpress Заказ По Числовому Значению Не Работает
Я пытаюсь получить все продукты из типа публикации wpsc-product, а затем отобразить их в пользовательском мета-поле под названием release_date_year. Однако, похоже, он не упорядочивает мои сообщения по этому пользовательскому мета-значению.
Я прочитал бесчисленное количество сообщений в блогах, сообщений поддержки на форумах Wordpress и множество вопросов и ответов здесь, на Wordpress Answers. Однако я не смог найти решение своих проблем.
Вот код, который я использую, чтобы получить продукты, а затем упорядочить их по пользовательскому мета-полю. Игнорируйте аргумент each_connected, как это для сообщений плагина в сообщениях Scribu. Краткое примечание: я также попытался удалить часть each_connected, чтобы посмотреть, исправила ли она проблему, но, как я и подозревал, это ничего не изменило.
Похоже, что приведенный ниже код позволяет получить продукты в порядке, проблема не в этом. Проблема, по-видимому, заключается в том, что они упорядочиваются по дате их публикации, а не по пользовательскому значению мета-поля что является числовым значением.
$products = new WP_Query(array(
'post_type' => 'wpsc-product',
'nopaging' => true,
'meta_key' => 'release_date_year',
'each_connected' => array(
'post_type' => 'artists',
'nopaging' => true,
),
'suppress_filters' => false,
'orderby' => 'meta_value_num',
'order' => 'asc',
));
Затем я посмотрел, какие запросы выполнялись, и в результате получилось следующее:
SELECT wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND wp_posts.post_type = 'wpsc-product' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'release_date_year' GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order, wp_posts.post_date DESC
Теперь это только я или в части "ЗАКАЗАТЬ ПО" моего запроса должен быть wp_postmeta.meta_key? Потому что мне кажется, что это заказ по порядку меню, а затем дата публикации по убыванию. Другая странная вещь заключается в том, что я также вижу сообщения, упорядоченные по убыванию, а не по возрастанию.
Как я уже сказал, я также попытался использовать meta_query в своем запросе WP_Query, поскольку я я использую Wordpress 3.1, используя следующий код, и он все еще упорядочивал сообщения по post_date:
$products = new WP_Query(array(
'post_type' => 'wpsc-product',
'nopaging' => true,
'meta_key' => 'release_date_year',
'meta_query' => array(array(
'key' => 'release_date_year',
'type' => 'NUMERIC'
)),
'each_connected' => array(
'post_type' => 'artists',
'nopaging' => true,
),
'suppress_filters' => false,
'orderby' => 'meta_value',
'order' => 'desc',
));
Я неправильно отформатировал свой оператор WP_Query или здесь что-то еще играет роль? Я также подтвердил, что в таблице wp_postmeta есть данные, и там есть значения для каждого продукта.
Обновление и решение
Немного повозившись, я нашел виновника. Плагин под названием "Порядок типов сообщений", который изменял мои запросы Wordpress и, следовательно, в результате чего аргумент suppress_filters будет полностью проигнорирован, среди прочего, например, orderby.
Смотрите мой ответ ниже.
2 answers
Виновником был плагин "Порядок типов сообщений ". Как указывал Скрибу выше, плагин фильтрует необработанный SQL-запрос, который он не должен делать. В результате аргумент 'suppress_filters' не останавливал изменение запроса, а аргумент 'orderby' полностью игнорировался.
Что касается того, как можно остановить это поведение, я не уверен. Я решил свою проблему, отключив плагин, так как он даже не использовался. Однако вы можете установить порядок из ваших пользовательских меню типов записей в коде register_post_types вместо этого используйте аргумент "menu_position", который определяет, где будет размещено меню.
Документацию для заказа типов сообщений в меню администратора Wordpress можно найти здесь в официальной документации Wordpress.
Урок, извлеченный здесь, заключается в том, что вы всегда должны предполагать, что плагин что-то сломал, особенно если вы используете код из официальной документации, который работает.
Похоже, что ваш параметр 'orderby' полностью игнорируется.
Попробуйте установить 'suppress_filters' => true
, чтобы убедиться в отсутствии помех.