web-dev-qa-db-ja.com

AJAXを使用するとWP_Queryの順序が壊れる

私はちょっとした問題に遭遇しています。

私は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()をコメントアウトする
  • get_press()関数のreturn $query->postsをコメントアウトする
  • 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
tr3online

私はミロが正しいと思います、それはおそらくこれに影響を与えるフィルタです。 Ajaxリクエストは管理者リクエストのように見えます(つまり、is_admin()がtrueを返す)ので、何かがis_admin()をチェックし、そのような場合にフィルタを追加している可能性があります。

Args配列に'suppress_filters' => trueを設定することができ、それはおそらくうまくいくでしょう。そうすることで、クエリがキャッシュされたり、プラグインがクエリを使って必要なことを行えなくなる可能性があります。これはあなたには影響しないかもしれませんが、それでも覚えておくべきことがあります。

3
Matthew Boynes

奇妙な理由でWP_Queryがこの問題の原因となっています。

WP_Queryオブジェクトを返す関数に対してAJAX要求を実行すると、$query->postsオブジェクトは$argsに指定された引数をすべて無視します。

簡単な回避策は、get_postsと同じ$argsで代わりにWP_Queryを使用することでした。

このメソッドの1つの残念な欠点は、WP_queryのような$query->max_num_pagesオブジェクトのNice機能が失われることです。

0
tr3online