如何为评论者和帖子作者设置评论私密化

时间:2022-02-04 作者:Teymur Abbasov

我试图私下发表评论。我的意思是评论必须对帖子作者和评论作者可见。我创建自定义注释节“;更好的评论。php;。我使用了pre\\u get\\u评论,但我无法工作。请帮忙

<?php
// My custom comments output html
function better_comments( $comment, $args, $depth ) {

    // Get correct tag used for the comments
    if ( \'div\' === $args[\'style\'] ) {
        $tag       = \'div\';
        $add_below = \'comment\';
    } else {
        $tag       = \'li\';
        $add_below = \'div-comment\';
    } ?>

    <<?php echo $tag; ?> <?php comment_class( empty( $args[\'has_children\'] ) ? \'\' : \'parent\' ); ?> id="comment-<?php comment_ID() ?>">

    <?php
    // Switch between different comment types
    switch ( $comment->comment_type ) :
        case \'pingback\' :
        case \'trackback\' : ?>
        <div class="pingback-entry"><span class="pingback-heading"><?php esc_html_e( \'Pingback:\', \'textdomain\' ); ?></span> <?php comment_author_link(); ?></div>
    <?php
        break;
        default :

        if ( \'div\' != $args[\'style\'] ) { ?>
            <div id="div-comment-<?php comment_ID() ?>" class="comment-body">
        <?php } ?>
            <div class="comment-author vcard">
                <?php
                // Display avatar unless size is set to 0
                if ( $args[\'avatar_size\'] != 0 ) {
                    $avatar_size = ! empty( $args[\'avatar_size\'] ) ? $args[\'avatar_size\'] : 70; // set default avatar size
                        echo get_avatar( $comment, $avatar_size );
                }
                // Display author name
                printf( __( \'<cite class="fn">%s</cite> <span class="says">says:</span>\', \'textdomain\' ), get_comment_author_link() ); ?>
            </div><!-- .comment-author -->
            <div class="comment-details">
                <div class="comment-meta commentmetadata">
                    <a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ); ?>"><?php
                        /* translators: 1: date, 2: time */
                        printf(
                            __( \'%1$s at %2$s\', \'textdomain\' ),
                            get_comment_date(),
                            get_comment_time()
                        ); ?>
                    </a><?php
                    edit_comment_link( __( \'(Edit)\', \'textdomain\' ), \'  \', \'\' ); ?>
                </div><!-- .comment-meta -->
                <div class="comment-text"><?php comment_text(); ?></div><!-- .comment-text -->
                <?php
                // Display comment moderation text
                if ( $comment->comment_approved == \'0\' ) { ?>
                    <em class="comment-awaiting-moderation"><?php _e( \'Your comment is awaiting moderation.\', \'textdomain\' ); ?></em><br/><?php
                } ?>
                <div class="reply"><?php
                // Display comment reply link
                comment_reply_link( array_merge( $args, array(
                    \'add_below\' => $add_below,
                    \'depth\'     => $depth,
                    \'max_depth\' => $args[\'max_depth\']
                ) ) ); ?>
                </div>
            </div><!-- .comment-details -->
    <?php
        if ( \'div\' != $args[\'style\'] ) { ?>
            </div>
        <?php }
    // IMPORTANT: Note that we do NOT close the opening tag, WordPress does this for us
        break;
    endswitch; // End comment_type check.
}

1 个回复
SO网友:Tom J Nowell

您可以使用pre_get_comments 筛选以在获取注释之前修改注释查询的参数。特别是author_in 参数

我试着写一个例子,虽然我还没有测试过,但它类似于这样:

add_action( \'pre_get_comments\', \'author_and_self_comment_filter\' );

function author_and_self_filter( \\WP_Comment_Query $query ) : void {
    // We need to do some checks first and return early if
    // this filter doesn\'t apply, e.g. if you\'re the post
    // author etc

    // don\'t break the admin UI
    if ( is_admin() ) {
        return;
    }

    // only filter if we\'re grabbing the comments for a post
    if ( $query->query_vars[\'post_id\'] === 0 ) {
        return;
    }

    // only logged in users should see comments
    if ( ! is_user_logged_in() ) {
        // we need to return 0 results so I\'m asking for a
        // comment type that doesn\'t exist so there are no
        //results, there\'s probably a better way to do this:
        $query->query_vars[\'type\'] = \'banana\';
        return;
    }

    // this is already filtered to specific people! Skip!
    if ( ! empty( $query->query_vars[\'author__in\'] ) ) {
        return;
    }

    // Admins + super admins see everything!
    if ( current_user_can( \'manage_options\' ) || is_super_admin() ) {
        return;
    }

    // get my ID
    $my_user_id = get_current_user_id();

    // get the post author ID
    $post_id = $query->query_vars[\'post_id\'];
    $p = get_post( $post_id );
    $post_author_id = $p->post_author;

    // If I\'m the post author then I can see everything
    if ( $my_user_id === $post_author_id ) {
        return;
    }

    // now we need to set the `author_in` to an array with 2
    // values, the authors user ID and the current users ID
    $authors = [];
    $authors[] = $my_user_id; // My user ID
    $authors[] = $post_author_id; // Author ID
    $query->query_vars[\'author_in\'] = $authors;
}
有一系列的检查来确定我们是否需要这样做,然后在最后我们将评论限制为仅针对作者和当前用户。

请注意,如果这样做,注释计数器将永远不会准确,并且可能非常不可靠。如果不取消限制,则无法对此进行修复,因此所有用户都可以看到所有注释。