web-dev-qa-db-fra.com

WP_Query order by se casse-t-il quand vous vivez AJAX?

Je rencontre un petit problème.

J'ai une fonction appelée get_press(), elle récupère les articles de presse les plus récents. C'est à l'intérieur d'un plugin:

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();
    }
}

Si j'appelle cette fonction directement dans un fichier modèle via: echo EWPress::get_press(), la sortie est parfaitement correcte:

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
        )

)

Afin de faire une demande AJAX, je:

  • commenter la echo EWPress::get_press() au niveau du modèle
  • mettre en commentaire le return $query->posts dans la fonction get_press()
  • commenter la echo json_encode($query->posts)
  • commenter la die();

Cependant, lorsque je fais la demande AJAX à la fonction SAME, les données renvoyées sont différentes (à savoir, elles ignorent order = 'ASC' ou 'DESC).

Fonction 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);

Le fichier 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]

Est-ce que quelqu'un sait pourquoi cela se produirait?

2
tr3online

Je crois que Milo a raison, c'est probablement un filtre qui affecte ceci. Les demandes Ajax ressemblent à des demandes d'administration (c'est-à-dire que is_admin() renvoie true). Il est donc possible que quelque chose vérifie si is_admin() et ajoute le filtre dans ces cas.

Vous pouvez définir 'suppress_filters' => true dans votre tableau args et cela fonctionnera probablement. Notez que cela peut empêcher la mise en cache d'une requête ou empêcher les plug-ins de faire ce qu'ils doivent avec une requête. Il est possible que cela ne vous affecte pas, mais que vous gardiez à l’esprit.

3
Matthew Boynes

Pour une raison étrange, WP_Query est à l'origine de ce problème.

Lors de l'exécution d'une demande AJAX à une fonction renvoyant un objet WP_Query, l'objet $query->posts ignore complètement les arguments fournis dans $args.

Un moyen simple de contourner le problème consistait à utiliser get_posts à la place avec le même $args qu'au WP_Query

Un inconvénient regrettable de cette méthode est la perte des fonctionnalités de Nice d'un objet WP_query, tel que $query->max_num_pages.

0
tr3online