私は "template_redirect"にフックされたajaxリクエストを持っています(ajaxは投稿のURLをリクエストします)、そしてコメントテンプレートだけを表示したいです:
function get_comm(){
if(isset($_GET['get_my_comments'])):
$offset = intval($_GET['get_my_comments']);
echo $offset; // offset will be the same as "cpage"
global $comments, $wp_query, $post, $id;
print_r($comments); // nothing ?
print_r($wp_query->comments); // nothing ??
wp_list_comments('type=comment', $comments); // same :(
exit();
endif;
}
add_action('template_redirect', 'get_comm');
javaScriptの部分は動作し、それはこのようなものです:
$("a.show-more-comments").live("click", function(){
var offset = $(this).attr('rel');
var list = $(this).closest("#comments");
$.ajax({
url: "<?php echo get_permalink($post->ID); ?>",
type: "GET",
data: ({
get_my_comments: offset
}),
success: function(data){
list.append(data);
}
});
});
問題は、$comments
または$wp_query->comments
が初期化されていないようです。私はここで何をしていますか?
$comments
または$wp_query->comments
は、comments_template()
によって初期化されます。コメントサブテンプレートファイルをロードするときに、テンプレートファイルで呼び出します。そのため、template_redirect
の時点ではまだ初期化されていません。 Chrisが言ったように、あなたはget_comments()
を呼び出し、それにあなたの現在の投稿のpost_id
を渡すべきです。
管理者側からでなくてもAJAX呼び出しを行う場合は 、wp-admin/admin-ajax.php
を使用して特別なアクションフック を使用できます。これは通常の投稿クエリをショートカットします。
私はこの機能を使用して、Ajaxを使用するときにテンプレートをレンダリングします
function ajax_render( $template ) {
global $data, $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
ob_start();
render($template);
$response = array('text' => ob_get_clean());
echo json_encode($response);
exit;
}
render()は特定のテンプレートをロードするためのカスタム関数です。しかし、基本的にあなたはリストに追加するためにあなた自身がコメントを検索する必要があるでしょう。
Get_comments(http://codex.wordpress.org/Function_Reference/get_comments)を使用するか直接クエリを実行してから、上記のようにテンプレートをレンダリングするか、またはphp関数を使用してhtmlを構築できます。
グローバルな$ dataを使って、テンプレートにレンダリングしたいものをすべて設定します。