来自特定类别小工具的最新评论

时间:2012-10-17 作者:deathlock

我一直在尝试创建一个边栏小部件来显示特定类别的最近评论。我很难确定Wordpress如何知道评论来自哪些类别。

我查过了the codex on get_comments function 但它似乎不允许从特定类别提取。我找到了some hints from Kovshenin\'s blog, 但似乎无法使其正常工作,因为我的尝试要么显示所有评论(忽略类别),要么根本不显示。

我正在根据Widget_Recent_Comments (从中找到wp-includes/default-widgets.php). 这是我到目前为止的情况。我认为输出是围绕这一区域控制的:

    $output = \'\';
    $title = apply_filters( \'widget_title\', empty( $instance[\'title\'] ) ? __( \'Recent Comments\' ) : $instance[\'title\'], $instance, $this->id_base );

    if ( empty( $instance[\'number\'] ) || ! $number = absint( $instance[\'number\'] ) )
        $number = 5;

    $category_name = empty( $instance[\'category_name\'] ) ? \'\' : $instance[\'category_name\'];

    $comments = get_comments( apply_filters( \'widget_comments_args\', array( \'number\' => $number, \'status\' => \'approve\', \'post_status\' => \'publish\' ) ) );
    $output .= $before_widget;
    if ( $title )
        $output .= $before_title . $title . $after_title;

    $output .= \'<ul id="recentcomments">\';
    if ( $comments ) {
        foreach ( (array) $comments as $comment) {
            $output .=  \'<li class="recentcomments">\' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x(\'%1$s on %2$s\', \'widgets\'), get_comment_author_link(), \'<a href="\' . esc_url( get_comment_link($comment->comment_ID) ) . \'">\' . get_the_title($comment->comment_post_ID) . \'</a>\') . \'</li>\';
        }
    }
    $output .= \'</ul>\';
    $output .= $after_widget;

    echo $output;
以下是完整代码:http://pastebin.com/VH666jty

基本上,我的小部件类似于默认的最近评论小部件。只是它有一个可选的Display comments only from category/categories: ..., 用户可以自己输入。

保留为空将显示所有类别的注释,同时放置一些类别段塞,用逗号分隔(例如:mycategory,othercategory) 将仅显示来自这些选定类别的注释。

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

你可以从Kovshenin的博客上得到答案

替换整个if ( $comments ) 用这个

if ( $comments ) {
    foreach ( (array) $comments as $comment) {
    $comm_post_id = $comment->comment_post_ID;
    if ( $category_name ) {
        if (!in_category( "{$category_name}", $comm_post_id )) {
            continue;
        }
    }
    $output .=  \'<li class="recentcomments">\' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x(\'%1$s on %2$s\', \'widgets\'), get_comment_author_link(), \'<a href="\' . esc_url( get_comment_link($comment->comment_ID) ) . \'">\' . get_the_title($comment->comment_post_ID) . \'</a>\') . \'</li>\';
    }
}

SO网友:Mridul Aggarwal

您可以使用comments_clauses 钩子自定义注释查询

将“连接”零件替换为

INNER JOIN $wpdb->posts ON($wpdb->posts.ID = $wpdb->comments.comment_post_ID)
INNER JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
INNER JOIN $wpdb->term_taxonomy ON($wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id)
INNER JOIN $wpdb->terms ON($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id)
在“where”部分中,根据用户输入为eg追加子句。AND $wpdb->terms.slug = \'uncategorized\'

制作add_filter 就在get_comments 函数(&A);使用remove_filter 之后立即调用,以便不修改页面上的任何其他查询

结束