私はちょっとした問題に遭遇しています。
私は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]
なぜこれが起こるのか誰か知っていますか?
私はミロが正しいと思います、それはおそらくこれに影響を与えるフィルタです。 Ajaxリクエストは管理者リクエストのように見えます(つまり、is_admin()
がtrueを返す)ので、何かがis_admin()
をチェックし、そのような場合にフィルタを追加している可能性があります。
Args配列に'suppress_filters' => true
を設定することができ、それはおそらくうまくいくでしょう。そうすることで、クエリがキャッシュされたり、プラグインがクエリを使って必要なことを行えなくなる可能性があります。これはあなたには影響しないかもしれませんが、それでも覚えておくべきことがあります。
奇妙な理由でWP_Query
がこの問題の原因となっています。
WP_Query
オブジェクトを返す関数に対してAJAX要求を実行すると、$query->posts
オブジェクトは$args
に指定された引数をすべて無視します。
簡単な回避策は、get_posts
と同じ$args
で代わりにWP_Query
を使用することでした。
このメソッドの1つの残念な欠点は、WP_query
のような$query->max_num_pages
オブジェクトのNice機能が失われることです。