通过WP_QUERY显示时隐藏帖子注释

时间:2015-07-16 作者:Tom Oakley

我写了一个短代码,当我写文章时,它会在我的网站主页上显示“x”个帖子[blog posts_per_page-"3"]. 这是:

function getBlogPosts($atts) {

  extract(shortcode_atts(array(
    "posts_per_page" => \'\',
  ), $atts));

  $queryArgs = array(
    "posts_per_page" => $posts_per_page
  );

  $queryPosts = new WP_Query($queryArgs);
  $output = "";

  $output .= "<ul class=\'articles-list clearfix\'>";

    if ( $queryPosts->have_posts() ) : while ( $queryPosts->have_posts() ) : $queryPosts->the_post();
      $output .= "<li class=\'clearfix ind-article\'>
        <a class=\'article-container\' href=\'". get_the_permalink() ."\'>";
        if (has_post_thumbnail($post->ID)) {
            $output .= get_the_post_thumbnail($post->ID, \'medium\'); // medium img size = 300x300. => make sure photos uploaded are at least 600x600
        }
        $output .= "<div class=\'article-content\'>";
          $output .= "<h3 class=\'entry-title gamma uppercase\'>". get_the_title() ."</h3>";
          $output .= "<span class=\'entry-meta\'>". get_the_date(\'l jS F\') ."</span>";
      $output .= "</div></a></li>";
    endwhile; endif;

  $output .= "</ul>";

  return $output;
} add_shortcode(\'blog\', \'getBlogPosts\');
然而,当我这样做的时候,博客帖子的评论表单也会显示出来(这肯定是帖子的评论表单,而不是页面-我想最后显示的博客帖子似乎只有一个评论表单)。我希望启用注释,但在使用快捷码时从中删除注释。我该怎么做?

1 个回复
最合适的回答,由SO网友:birgire 整理而成

问题是,您必须记住调用核心函数wp_reset_postdata(), 在while循环之后,恢复全局$post 对象注释表单依赖于该对象,您可以使用$queryPosts->the_post() 呼叫

请注意extract() 不推荐,请检查this answer 例如,作者@toscho。

删除评论要删除评论表单,使用快捷码时,您可以查看我的answer here.

如果要在短代码之后删除注释列表和注释表单,则可以在短代码的回调中尝试以下方法之一:

Method #1 通过过滤器删除查询的注释:

if( is_singular() && post_type_supports( get_post_type(), \'comments\' ) )
{
    // Remove the comment form
    add_filter( \'comments_open\', \'__return_false\' ); 

    // Remove the list of comments
    add_filter( \'comments_array\', \'__return_empty_array\' );
}   
Method #2 武力get_comments() 要返回空数组,请执行以下操作:

if( is_singular() && post_type_supports( get_post_type(), \'comments\' ) )
{
    // Remove the comment form
    add_filter( \'comments_open\', \'__return_false\' );

    // Empty comments SQL query - Run only once
    add_filter( \'comments_clauses\', function( $clauses )
    {
        static $count = 0;
        if( 0 === $count++ )
            $clauses[\'where\'] .= \' AND 1=0 \';
        return $clauses;
     });
}   
这里我们只运行一次过滤器回调,以防止出现这种情况,例如侧栏中的最近评论小部件。

Method #3 通过过滤器修改注释模板。创建空文件comments-empty.php 在您的主题和使用范围内:

if( is_singular() && post_type_supports( get_post_type(), \'comments\' ) )
{
    // Modify the comment template
    add_filter( \'comments_template\', function( $template )   
    {
        if( $tmp = locate_template( \'comments-empty.php\' ) )
            $template = $tmp;
        return $template;
    } );
}   
您可以根据需要修改文件路径。

Method #4 用CSS隐藏它。示例:

if( is_singular() && post_type_supports( get_post_type(), \'comments\' ) )
{
    print \'<style> #comments { display: none } </style>\';
}

结束

相关推荐

$wpdb returns duplicate posts

我创建了一个短代码,显示用户上次登录后创建的帖子。这个短代码工作得很好,但我不知道为什么,但我得到了7个重复的帖子。就像测试一样,我创建了一个名为“示例文章”的帖子,当我呼出帖子的标题时,我得到了这个结果。Sample Article Sample Article Sample Article Sample Article Sample Article Sample Article Sample Article Sample ArticleShortcodefunction latest_posts_af