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:
echo EWPress::get_press()
au niveau du modèlereturn $query->posts
dans la fonction get_press()
echo json_encode($query->posts)
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?
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.
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
.