WP_Query orderby повреждается при использовании Ajax?

Я работаю в к определенной проблеме.

Мне назвали функцию get_press(), это получает новейшие объекты нажатия. Это в плагине:

class EWPress {
    function __construct()
    {
        load_plugin_textdomain( 'ew', flase, dirname( plugin_basename( __FILE__ ) ) . '/lang' );

        add_action( 'wp_enqueue_scripts', array( &$this, 'register_plugin_scripts' ) );

        // Add JS var ajaxurl to global namespace
        add_action( 'wp_head', array( &$this, 'add_ajax_library' ) );

        add_action( 'wp_ajax_get_press', array( &$this, 'get_press' ) );
        add_action( 'wp_ajax_nopriv_get_press', array( &$this, 'get_press' ) );

    }

    public function get_press()
    {
        $args = array(
            'status' => 'publish',
            'post_type' => 'press',
            'orderby' => 'meta_value',
            'meta_key' => 'press_date',
            'order' => 'DESC',
            'posts_per_page' => 2
        );

        $query = new WP_Query($args);
            return($query->posts);
            //echo json_encode($query->posts);
            //die();
    }
}

Если я вызываю эту функцию непосредственно в шаблонном файле через: echo EWPress::get_press() вывод прекрасен абсолютно:

Array
(
    [0] => WP_Post Object
        (
            [ID] => 229
            [post_author] => 1
            [post_date] => 2013-01-18 00:29:58
            [post_date_gmt] => 2013-01-18 00:29:58
            [post_content] => 
            [post_title] => Rundown
            [post_excerpt] => 
            [post_status] => publish
            [comment_status] => closed
            [ping_status] => closed
            [post_password] => 
            [post_name] => rundown
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2013-01-18 00:29:58
            [post_modified_gmt] => 2013-01-18 00:29:58
            [post_content_filtered] => 
            [post_parent] => 0
            [guid] => http://site.com/?post_type=press&p=229
            [menu_order] => 0
            [post_type] => press
            [post_mime_type] => 
            [comment_count] => 0
            [filter] => raw
        )

    [1] => WP_Post Object
        (
            [ID] => 231
            [post_author] => 1
            [post_date] => 2013-01-18 00:44:35
            [post_date_gmt] => 2013-01-18 00:44:35
            [post_content] => 
            [post_title] => Clean Plates
            [post_excerpt] => 
            [post_status] => publish
            [comment_status] => closed
            [ping_status] => closed
            [post_password] => 
            [post_name] => clean-plates
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2013-01-18 00:44:35
            [post_modified_gmt] => 2013-01-18 00:44:35
            [post_content_filtered] => 
            [post_parent] => 0
            [guid] => http://site.com/?post_type=press&p=231
            [menu_order] => 0
            [post_type] => press
            [post_mime_type] => 
            [comment_count] => 0
            [filter] => raw
        )

)

Для выполнения запроса Ajax, меня:

  • прокомментируйте echo EWPress::get_press() на шаблонном уровне
  • прокомментируйте return $query->posts в get_press() функция
  • не прокомментируйте echo json_encode($query->posts)
  • не прокомментируйте die();

Однако, когда я выполняю запрос Ajax к ТОЙ ЖЕ функции, возвращенные данные отличаются (а именно, это игнорирует order = 'ASC' или 'DESC).

Функция Ajax:

(function($) {
    $(document).ready(function(){
        $.ajax({
            url: ajaxurl,
            type: 'POST',
            dataType: 'json',
            data: {action: 'get_press'},
            complete: function(xhr, textStatus) {
                //
            },
            success: function(data, textStatus, xhr) {
                console.log(data);
            },
            error: function(xhr, textStatus, errorThrown) {
            //called when there is an error
            }
        });
    });
})(jQuery);

console.log:

[Object, Object]
0: Object
    ID: 234
    comment_count: "0"
    comment_status: "closed"
    filter: "raw"
    guid: "http://site.com/?post_type=press&p=234"
    menu_order: 0
    ping_status: "closed"
    pinged: ""
    post_author: "1"
    post_content: ""
    post_content_filtered: ""
    post_date: "2013-01-18 02:33:41"
    post_date_gmt: "2013-01-18 02:33:41"
    post_excerpt: ""
    post_mime_type: ""
    post_modified: "2013-01-18 02:33:41"
    post_modified_gmt: "2013-01-18 02:33:41"
    post_name: "eater"
    post_parent: 0
    post_password: ""
    post_status: "publish"
    post_title: "Eater"
    post_type: "press"
    to_ping: ""
    __proto__: Object
1: Object
    ID: 231
    comment_count: "0"
    comment_status: "closed"
    filter: "raw"
    guid: "http://site.com/?post_type=press&p=231"
    menu_order: 0
    ping_status: "closed"
    pinged: ""
    post_author: "1"
    post_content: ""
    post_content_filtered: ""
    post_date: "2013-01-18 00:44:35"
    post_date_gmt: "2013-01-18 00:44:35"
    post_excerpt: ""
    post_mime_type: ""
    post_modified: "2013-01-18 00:44:35"
    post_modified_gmt: "2013-01-18 00:44:35"
    post_name: "clean-plates"
    post_parent: 0
    post_password: ""
    post_status: "publish"
    post_title: "Clean Plates"
    post_type: "press"
    to_ping: ""
    __proto__: Object
length: 2
__proto__: Array[0]

Кто-либо знает, почему это произошло бы?

2
18.01.2013, 23:21
3 ответа

По некоторой нечетной причине WP_Query преступник позади этой проблемы.

Когда выполнение Ajax запрашивает к функции, которая возвращает a WP_Query объект, $query->posts объект полностью игнорирует любой из аргументов, предоставленных в $args.

Простая работа вокруг должна была использовать get_posts вместо этого с тем же $args как с WP_Query

Один неудачный недостаток этого метода является потерей хороших функций a WP_query объект, такой как $query->max_num_pages.

0
19.02.2020, 22:34
  • 1
    get_posts просто создает a WP_Query экземпляр, Ваша проблема вероятна в другом месте, возможно фильтр, которые подавлены по умолчанию когда get_posts используется. –  Milo 19.01.2013, 01:10
  • 2
    Никакая идея, которая фильтрует? Я хотел бы заглянуть к этому. Это довольно нечетно, что это хорошо работало бы по запросу не-Ajax, но переключателю с запросом Ajax. Я не знаю то, что фильтры втолкнули бы в ту ситуацию, если wp_ajax_action не инициировал что-то, о чем я не знаю. –  tr3online 30.01.2013, 06:55

Я полагаю, что Milo прав, это - вероятно, фильтр, влияющий на это. Запросы Ajax похожи на администраторские запросы (то есть, is_admin() возвращает true), таким образом, возможно, что что-то проверяет если is_admin() и добавление фильтра в тех случаях.

Можно установить 'suppress_filters' => true в Вашем массиве args и это будет, вероятно, работать. Обратите внимание, что выполнение так может препятствовать тому, чтобы запрос кэшировался или препятствовал тому, чтобы плагины делали то, что они должны с запросом. Возможно, что это не может влиять на Вас, но тем не менее что-то для учета.

3
19.02.2020, 22:34
'suppress_filters' => true

Эта работа для меня!

-2
19.02.2020, 22:34

Теги

Похожие вопросы