我需要帮助使用Pre_Get_Comments来限制评论管理屏幕中的评论

时间:2021-07-03 作者:Fabian Amran

我试图将“评论管理”屏幕中的评论限制为:

显示当前用户的所有评论显示当前用户帖子上的所有评论


if(!current_user_can(\'edit_others_posts\')) {
    
    add_action(\'pre_get_comments\', function($wp_query) {

        global $user_ID;

        // all current user comments
        $wp_query->set( \'user_id\', $user_ID );

        // FIXME: condition to get comments made on current user\'s post
        
    });
}
我面临两个问题:

代码为所有用户生成注释,似乎忽略了$wp_query->set( \'user_id\', $user_ID )

  • 我想不出FIXME语句的条件,非常感谢您的帮助!非常感谢。

    不幸的是,“post\\u in”、“user\\u is”和类似的参数限制了查询,而不是扩展查询。因此,我使用了很长的appraoch来获得我想要的结果。然而,在我接受答案之前,我正在等待我的appraoch的改进版本。

    以下是我修改的内容:

    add_action(\'pre_get_comments\', function($wp_comment_query) {
    
        global $wpdb;
        $user_ID = get_current_user_id();
        
        $post_ids = "
            SELECT $wpdb->posts.ID 
            FROM $wpdb->posts
            WHERE $wpdb->posts.post_author = $user_ID 
        ";
        $post_ids = $wpdb->get_results($post_ids, ARRAY_N);
        $post_ids = array_column($post_ids, \'0\');
        $post_ids = implode(\',\', $post_ids);
    
        $comment_ids = "
            SELECT $wpdb->comments.comment_ID 
            FROM $wpdb->comments
            WHERE $wpdb->comments.user_id = $user_ID
            OR $wpdb->comments.comment_post_ID IN ($post_ids)
        ";
        
        $comment_ids = $wpdb->get_results($comment_ids, ARRAY_N);
        $comment_ids = array_column($comment_ids, \'0\');
        
        $wp_comment_query->query_vars[\'comment__in\'] = $comment_ids;
    
    });
    

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

    更新

    为了响应更新问题中的新代码,您实际上可以使用$wpdb->get_col() 通过JOIN子句使用单个SQL命令,如下所示:

    $query = "SELECT c.comment_ID FROM $wpdb->comments c
        JOIN $wpdb->posts p ON p.ID = c.comment_post_ID
    WHERE c.user_id = $user_ID
        OR p.post_author = $user_ID";
    
    $comment_ids = $wpdb->get_col( $query );
    
    但是,不是通过pre_get_comments hook你可以用comments_clauses hook 将上述JOIN子句和WHERE条件添加到由生成的SQL命令中WP_Comment_Query.

    add_filter( \'comments_clauses\', function ( $pieces ) {
        global $wpdb;
    
        $user_ID = get_current_user_id();
    
        if ( false === strpos( $pieces[\'join\'], "JOIN $wpdb->posts ON" ) ) {
            $pieces[\'join\'] .= " JOIN $wpdb->posts ON {$wpdb->posts}.ID = comment_post_ID";
        }
    
        $pieces[\'where\'] .= " AND (user_id = $user_ID OR {$wpdb->posts}.post_author = $user_ID)";
    
        return $pieces;
    } );
    
    因此,请尝试,它应该返回:

    当前用户在任何帖子上发表的评论,以及

    其他用户的评论,但仅限于当前用户是作者的帖子。

    原始答案pre_get_comments hook 实际上是WP_Comment_Query class 而不是WP_Query, 所以$wp_query->set() 不起作用,因为WP_Comment_Query 没有set() 方法

    但您可以直接访问$query_vars 中的属性WP_Comment_Query 要更改查询参数的值,如user_id. 例如,对于该参数,您可以使用$wp_query->query_vars[\'user_id\'] = $user_ID;.

    至于FIXME 部分,请尝试post_author arg: $wp_query->query_vars[\'post_author\'] = $user_ID; 如果您确实试图在当前用户是作者的帖子上只显示当前用户的评论,那么这应该是可行的。

    PS:我会重命名$wp_query$query 或者也许$wp_comment_query.. 我也会使用$user_ID = get_current_user_id(); 而不是依赖$user_ID 全局

    相关推荐

    ADMIN/BACKEND和GET_OPTION的动态CSS文件导致未捕获错误:调用未定义的函数GET_OPTION()

    我尝试用动态css设置管理区域的样式。我需要配置一些关于前端用户定义的元素。他可以选择一种颜色,这种颜色应该反映在管理区域的某些元素中(例如,管理区域中的按钮)。我的方法是:设置evacolor。css,但让apache将其解释为php文件。这适用于以下情况:。htaccess与我的颜色位于同一目录中。css:<FilesMatch "\\.css$"> SetHandler application/x-httpd-php Header se