如何在 Wordpress 中显示带有简码的 comments_template?

How to display the comments_template with a shortcode, in Wordpress?

我使用下面的代码设法显示带有短代码的 comment_form(同时将其从默认位置删除):

`add_shortcode( 'wpse_comment_form', function( $atts = array(), $content = '' )
{
    if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
    {
        ob_start();
        comment_form();
        print(  '<style>.no-comments { display: none; }</style>' );
        add_filter( 'comments_open', '__return_false' );
        return ob_get_clean();
    }
    return '';
}, 10, 2 );

birgire 在这个答案中建议的代码:https://wordpress.stackexchange.com/a/177289/26350

为了更清楚,这里是我想要得到的地方:我需要通过短代码在不同的位置显示评论表单和评论列表。我设法模仿上面的相同代码来显示 comments_template(后来编辑 comments.php 以从中删除 comment_form,因为我真正需要显示的是评论列表)但是评论列表显示 2x,一个在短代码位置,一个在 post(默认位置)的底部。我尝试使用相同的代码独立显示 wp_list_comments 但没有成功。

如果您不提供评论数组 wo wp_list_comments,那么它会发现查询已经完成(即在循环中)。

如果您想独立于循环显示 post 的评论,您可以使用类似的东西:

    $comments = get_comments( array( 'post_id' => $id ) );
    wp_list_comments( array( 'per_page' => how many to show ), $comments);

因此,要将其放入短代码中,您可以执行以下操作(未测试):

add_shortcode( 'wpse_comment_list', function( $atts = array(), $content = '' )
{
    if( isset($atts['id']) && post_type_supports( $atts['id'], 'comments' ) )
    {
        ob_start();
        $comments = get_comments( array( 'post_id' => $atts['id'] ) );
        wp_list_comments( array( 'per_page' => how many to show ), $comments);
        return ob_get_clean();
    }
    return '';
}, 10, 2 );

你可以用 [wpse_comment_list id="33"](或任何 id)来调用它。

我设法得到了我需要的结果,但部分是通过在我的子主题上删除我无法通过代码删除的部分。 我模仿了用于简码显示 comment_form (问题上方)的代码,以简码显示 comments_template (下方)。它在我需要的地方显示它,但它没有像以前的代码对 comment_form 所做的那样从 post 的底部删除它的 "ghost"。所以我将 single.php 复制到我的子主题并删除了所有这些:

<?php
`// If comments are open or we have at least one, load up
    the comment template
    if ( comments_open() || '0' != get_comments_number() )
    comments_template( '', true );
?>

成功了。虽然不确定这是最好的方法,但我对此很好奇。我不再需要 post 底部的评论;我的评论表单现在是一种不同的表单,并且也有不同的位置,以防这是唯一的问题。

这是我用来简码显示 comments_template 的代码。我需要它只显示评论而不是表格,所以我从我的子主题中的 comments.php 中删除了 comments_form 调用。

add_shortcode( 'wpse_comments_template', function( $atts = array(), $content = '' )
{
    if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
    {
        ob_start();
        comments_template();
        print(  '<style>#comments-title { display: none; }</style>' );
        return ob_get_clean();
    }
    return '';
}, 10, 2 ); 

如果您是 运行 主题中此部分之前的 [wpse_comments_template] 简码:

<?php
    if ( comments_open() || '0' != get_comments_number() )
        comments_template( '', true );
?>

然后它正在尝试使用:

add_shortcode( 'wpse_comments_template', function( $atts = array(), $content = '' )
{
    if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
    {
        ob_start();
        comments_template();
        add_filter( 'comments_open',         '__return_false'             );
        add_filter( 'get_comments_number',   '__return_zero'              );
        return ob_get_clean();
    }
    return '';
}, 10, 2 );

但这可能会干扰稍后出现的与评论相关的内容,例如在边栏中。

所以使用更准确:

/**     
 * Display the comment template with the [wpse_comments_template] 
 * shortcode on singular pages. 
 *
 * @see 
 */
 add_shortcode( 'wpse_comments_template', function( $atts = array(), $content = '' )
 {
    if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
    {
        ob_start();
        comments_template();
        add_filter( 'comments_open',       'wpse_comments_open'   );
        add_filter( 'get_comments_number', 'wpse_comments_number' );
        return ob_get_clean();
    }
    return '';
}, 10, 2 );

function wpse_comments_open( $open )
{
    remove_filter( current_filter(), __FUNCTION__ );
    return false;
}

function wpse_comments_number( $open )
{
    remove_filter( current_filter(), __FUNCTION__ );
    return 0;
}

而且您不必从主题中删除任何代码。

我在 2015 主题上对此进行了测试,它似乎按预期工作。