注释不尊重DISPLAY_NAME设置,如何使插件克服这一点

时间:2011-10-21 作者:Maxim Krizhanovsky

当我在Wordpress上发布某些内容时,它会以我的显示名发布。但是,如果我更改显示名称,我发布的帖子将使用新作者进行更新。注释将保留旧名称。

由于在我的wordpress网站中,评论仅对注册用户可用,并且显示名称字段是隐藏的-他们有自定义配置文件,因此我希望覆盖使用的显示名称(它应始终与first\\u name+last\\u name匹配)。所以我尝试了the\\u author钩子,但没有成功。

查看源代码,我发现author\\u链接中的作者名称生成如下:

function get_comment_author( $comment_ID = 0 ) {
    $comment = get_comment( $comment_ID );
    if ( empty($comment->comment_author) ) {
        if (!empty($comment->user_id)){
            $user=get_userdata($comment->user_id);
            $author=$user->user_login;
        } else {
            $author = __(\'Anonymous\');
        }
    } else {
        $author = $comment->comment_author;
    }
    return apply_filters(\'get_comment_author\', $author);
}
这意味着,如果comment\\u作者被写入数据库,我将无法以任何方式使用它。如果没有-注释作者的当前用户登录名将被传递到get\\u comment\\u author挂钩,在那里我可以查询DB以获取行以及名字和姓氏。我不喜欢需要新的查询,但如果这是唯一的方法,我可以接受。但我应该执行哪些步骤才能让它工作。目前,comment\\u作者总是写入数据库。

2 个回复
SO网友:Otto

此代码使用筛选器执行此操作。不在乎评论上说作者的名字是什么。

没有什么特别棘手的。应该不言自明。

add_filter(\'get_comment_author\', \'wpse31694_comment_author_display_name\');
function wpse31694_comment_author_display_name($author) {
    global $comment;
    if (!empty($comment->user_id)){
        $user=get_userdata($comment->user_id);
        $author=$user->display_name;    
    }

    return $author;
}

SO网友:soulseekah

您必须记住,每个配置文件都有自己的配置文件display_name 设置,并且为了强制执行它,您可以钩住pre_user_display_name 过滤器,使您有机会在更新或插入用户之前对其进行更改。然而不幸的是,pre_user_display_name 除此之外,不传递任何信息display_name 通常是user_login. 你甚至不能用static 函数中要等待的数据pre_user_first_namepre_user_last_name 因为他们只是在display_name.

从你发布的代码中可以看到(http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/comment-template.php#L23)如果comment_author 列为空,则user 通过获取get_userdata() (随user_id 属性),它通过数据库查询生成用户数据。

据我所知,您希望避免额外的查询(尤其是如果get_userdata() 必须签发才能获得$author), 所以comment_author 的属性$comment (由get_comment() 调用)应已包含格式良好的显示名称,以避免任何进一步的查询。

因此comment_author 必须从存储注释的那一刻起,以所需的格式将其自身存储到数据库中。

wp_new_comment() http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/comment.php#L1302 是一个开始寻找的好地方wp-comments-post.php 只要你发表评论。

你首先看到的是preprocess_comment 筛选应用程序,以便您可以更改comment_author 立即将更改后的版本存储在数据库中。

你有你的user_ID, 您可以使用它为用户获取数据并相应地更改名称。避免user_ID, 但是,您可以尝试使用global $current_user, 它已经被用户元数据预先水合。

下面是一个简单的概念证明:

function wpse31694_alter_comment_author( $commentdata ) {
    global $current_user;
    $commentdata[\'comment_author\'] = $current_user->user_firstname.\' \'.$current_user->user_lastname;
    return $commentdata;
}
add_filter( \'preprocess_comment\', \'wpse31694_alter_comment_author\' );
为了改变comment_author 以前输入的数据,其中包含用户名而不是所需的表单,您可以安排一个简单的Cron 因为在深夜,它会逐一浏览每一条评论,并改变comment_author 形成所需的一个。此外,您还可以wp_update_user() 并切换display_name 通过相同的Cron运行,这取决于您。

结束

相关推荐

是否从_Author_meta中删除“http://”?

默认情况下,WordPress在用户在其配置文件中添加的URL前面打印http://<?php the_author_meta(\'user_url\'); ?> 有没有人能给我提供默认情况下去掉这些URL“HTTP://”的代码?(虽然仍然是一个链接,不接触WP的后端…我想这可能是一个功能?)