I have a ajax request hooked on "template_redirect" (the ajax requests the post's url), and I want to display only the comment template:

function get_comm(){
    $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 :(
add_action('template_redirect', 'get_comm');

the javascript part works and it's like this:

   $("a.show-more-comments").live("click", function(){
      var offset = $(this).attr('rel');
      var list = $(this).closest("#comments");

        url: "<?php echo get_permalink($post->ID); ?>",
        type: "GET",
        data: ({
          get_my_comments: offset
        success: function(data){

The problem is that $comments or $wp_query->comments don't seem to be initialized. What am I doing wrong here?

  • Why don't you use redirect? Why not simply reload the page if you want to load the comment template to show more comments? Or do you want to expand the list of comments on the same page?
    – Steven
    Commented Nov 27, 2010 at 8:45
  • yes, more comments should be retrieved and appended when a link is pressed.
    – Alex
    Commented Nov 27, 2010 at 9:22

2 Answers 2


$comments, or $wp_query->comments, is initialized by comments_template(), which you call in your template file when you want to load the comment sub-template file. So at the time of template_redirect it is not yet initialized. As Chris said, you should call get_comments() and pass it the post_id of your current post.

If you're doing AJAX calls, even not from the admin side, you can use wp-admin/admin-ajax.php and use special actions hooks. This shortcuts the usual post queries, which you don't need anyway.

  • what's the difference between using admin-ajax.php and usual site url?
    – Alex
    Commented Nov 28, 2010 at 7:05
  • @Alex: Depending on the URL you currently use, WP will launch some queries before you reach template_redirect. If you use the regular post URL and then append your get_my_comments, it will still parse the URL according to the rewrite rules and get the post from the database, even if you don't use it later. The regular AJAX methods prevent this, they go straight to your function. But maybe you need the post anyway for the comment formatting?
    – Jan Fabry
    Commented Nov 28, 2010 at 9:34

I use this function to render templates when using 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;

$response = array('text' => ob_get_clean());
echo json_encode($response);

render() is a custom function to load a certain template. But essentially you will need to retrieve the comments yourself to add to the list.

Use get_comments (http://codex.wordpress.org/Function_Reference/get_comments) or do a direct query and then you can either render a template as above or build the html with a php function.

I use the global $data to hod anything I want to render in the template.

  • yes, I've come down to using get_comments() after all. The inconvenient is that now I have to use it on the first page load too, not only on the ajax call...
    – Alex
    Commented Nov 27, 2010 at 12:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.