屏蔽WordPress网站中暴漏的登录用户名


问题:在文章评论和用户页面都会以 class 类的形式暴漏用户名。

方法 1:直接修改 WordPress 程序

查到函数comment_class(),进一步发现是被这个函数get_comment_class()(大约在 wp-includescomment-template.php 的 419 行)暴露了管理员的登录用户名。该函数内容如下:

function get_comment_class( $class = '', $comment_id = null, $post_id = null ) {
    global $comment_alt, $comment_depth, $comment_thread_alt;
    $comment = get_comment($comment_id);
    $classes = array();
    // Get the comment type (comment, trackback),
    $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;
    // Add classes for comment authors that are registered users.
    if ( $comment->user_id > 0 && $user = get_userdata( $comment->user_id ) ) {
        $classes[] = 'byuser';
        $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );
        // For comment authors who are the author of the post
        if ( $post = get_post($post_id) ) {
            if ( $comment->user_id === $post->post_author ) {
                $classes[] = 'bypostauthor';
            }
        }
    }
    if ( empty($comment_alt) )
        $comment_alt = 0;

管理员用户名正是被其中的第 14 行暴露的… 在此,我们只需将这一行中的$user->user_nicename改为$user->user_id即可安全的隐藏管理员的登录名了,也隐藏了注册用户的登录用户名了!取而代之显示的是注册用户(包括管理员)的 ID。
查到函数body_class(),进一步发现是被这个函数get_body_class()(大约在 wp-includespost-template.php 的 634 行)暴露的登录用户名。该函数部分内容如下:

elseif ( is_author() ) {
    $author = $wp_query->get_queried_object();
    $classes[] = 'author';
    if ( isset( $author->user_nicename ) ) {
        $classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );
    $classes[] = 'author-' . $author->ID;
    }
}

其中该函数的第 5 行也暴露了博主的登录名,将这一行删掉或注释掉即可成功解决。

方法 2:过滤掉 “Comment-Author-” 和 “Author-“

comment_class()函数里输出的 comment-author-用户名 这个 class 去掉,也将body_class()函数里输出的 author-用户名 这个类的 class 去掉。因为这个是通过 functions.php 来解决的,所以不用担心 wordpress 程序升级的问题。方法是,将以下代码加入 functions.php 中

function remove_comment_body_author_class($content){
    $pattern = "/(.*?)([^>]*)author-([^>]*)(.*?)/i";
    $replacement = '$1$4';
    $content = preg_replace($pattern, $replacement, $content);
    return $content;
}
add_filter('comment_class', 'remove_comment_body_author_class');
add_filter('body_class', 'remove_comment_body_author_class');
或
function remove_comment_body_author_class( $classes ) {
    foreach( $classes as $key => $class ) {
        if(strstr($class, "comment-author-")||strstr($class, "author-")) {
            unset( $classes[$key] );
        }
    }
    return $classes;
}
add_filter( 'comment_class' , 'remove_comment_body_author_class' );
add_filter('body_class', 'remove_comment_body_author_class');

方法 3:改为输出用户 ID 或用户昵称

function change_comment_or_body_classes($classes, $comment_id) {
	global $wp_query;
	$comment = get_comment($comment_id);
	$user = get_userdata($comment -> user_id);
	$comment_author = 'comment-author-' . sanitize_html_class($user -> user_nicename, $comment -> user_id);
	$author = $wp_query -> get_queried_object();
	$archive_author = 'author-' . sanitize_html_class($author -> user_nicename, $author -> ID);
	$archive_author_id = 'author-' . $author -> ID;
	foreach ($classes as $key => $class) {
		switch( $class ) {
			case $comment_author :
				// $classes[$key] = 'comment-author-' . sanitize_html_class( $comment->comment_author, $comment->comment_author );
				$classes[$key] = 'comment-author-' . sanitize_html_class($comment -> user_id);
				break;
			case $archive_author :
				// $classes[$key] = 'author-' . sanitize_html_class( get_the_author_meta( 'display_name' ), get_the_author_meta( 'display_name' ) );
				$classes[$key] = 'author-' . sanitize_html_class($author -> ID);
				break;
			case $archive_author_id :
				$classes[$key] = '';
				break;
		}
	}
	return $classes;
}
add_filter('comment_class', 'lxtx_change_comment_or_body_classes', 10, 4);
add_filter('body_class', 'lxtx_change_comment_or_body_classes', 10, 4);

注:注释的两行代码为替换成昵称


<< 将 WordPress 作者存档页链接中的用户名改为昵称或 ID(支持中文昵称) WordPress直接调用用户头像地址,而不是 img 标签 >>
  • 作者 建站迷

    建站迷

    让天下没有难做的网站!
    解决中小型企业的无站之伤。



没有账号? 忘记密码?

社交账号快速登录