web-dev-qa-db-ja.com

コメントテンプレートの外側で$ commentsを取得する

私は "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が初期化されていないようです。私はここで何をしていますか?

2
Alex

$commentsまたは$wp_query->commentsは、comments_template()によって初期化されます。コメントサブテンプレートファイルをロードするときに、テンプレートファイルで呼び出します。そのため、template_redirectの時点ではまだ初期化されていません。 Chrisが言ったように、あなたはget_comments()を呼び出し、それにあなたの現在の投稿のpost_idを渡すべきです。

管理者側からでなくてもAJAX呼び出しを行う場合は wp-admin/admin-ajax.phpを使用して特別なアクションフック を使用できます。これは通常の投稿クエリをショートカットします。

0
Jan Fabry

私はこの機能を使用して、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を使って、テンプレートにレンダリングしたいものをすべて設定します。

0
Chris