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

时间:2015-02-18 21:05:27

标签: php wordpress comments shortcode

我设法使用以下代码显示带有短代码的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,短代码中的一个位置以及帖子底部(默认位置)。我尝试使用相同的代码独立显示wp_list_comments但没有成功。

3 个答案:

答案 0 :(得分:1)

如果你没有提供一系列评论w w__list_comments,那么它希望找到一个查询已经完成(即在循环中)。

如果要显示独立于循环的帖子的注释,可以使用以下内容:

    $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)来调用它。

答案 1 :(得分:1)

我设法得到了我需要的结果,但部分是通过在我的子主题上删除了我无法通过代码删除的部分。 我模仿用于短代码的代码 - 显示comment_form(问题上方)以短代码显示comments_template(在下面这里)。它显示在我需要的地方,但它没有从帖子底部删除它的“幽灵”,就像之前的代码为comment_form所做的那样。所以我将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 );
?>

有效。不确定这是最好的方式,我很好奇。我不再需要在帖子底部发表评论了;我的评论表单现在是另一种形式,并且也是不同的位置,以防这是唯一的问题。

这是我用来短代码显示comments_template的代码。我需要它只显示注释而不是表单,所以我从child-theme中的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 ); 

答案 2 :(得分:0)

如果您在主题中的此部分之前运行[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 http://stackoverflow.com/a/28644134/2078474
 */
 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;
}

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

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