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.

Смотрите мой ответ ниже.

Author: Dwayne Charrington, 2011-03-26

2 answers

Виновником был плагин "Порядок типов сообщений ". Как указывал Скрибу выше, плагин фильтрует необработанный SQL-запрос, который он не должен делать. В результате аргумент 'suppress_filters' не останавливал изменение запроса, а аргумент 'orderby' полностью игнорировался.

Что касается того, как можно остановить это поведение, я не уверен. Я решил свою проблему, отключив плагин, так как он даже не использовался. Однако вы можете установить порядок из ваших пользовательских меню типов записей в коде register_post_types вместо этого используйте аргумент "menu_position", который определяет, где будет размещено меню.

Документацию для заказа типов сообщений в меню администратора Wordpress можно найти здесь в официальной документации Wordpress.

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

 2
Author: Dwayne Charrington, 2011-03-27 06:26:31

Похоже, что ваш параметр 'orderby' полностью игнорируется.

Попробуйте установить 'suppress_filters' => true, чтобы убедиться в отсутствии помех.

 1
Author: scribu, 2011-03-26 13:36:22