Комментарии не соответствуют настройке display_name, как сделать плагин для преодоления этого

Когда я публикую что-то в WordPress, он публикуется с моим отображаемым именем. Однако, если я изменю свое отображаемое имя, сообщения, отправленные мной, будут обновляться новым автором. Комментарии останутся со старым именем.

Поскольку на моих комментариях на WordPress комментарии доступны только для зарегистрированных пользователей, а поле отображаемого имени скрыто – у них есть настраиваемые профили, я бы хотел перезаписать используемое имя display_name (оно всегда должно совпадать с first_name + last_name). Таким образом, я пробовал hook the_author без везения.

Посмотрев исходный код, я обнаружил, что имя автора в author_link генерируется следующим образом:

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_author записывается в базу данных, я не могу использовать его каким-либо образом. Если нет – текущий user_login автора комментария будет передан в hook_ get_comment_author, где я могу запросить БД, чтобы получить строку и, следовательно, имя и фамилию. Мне не нравится, что новый запрос будет необходим, но я могу жить с этим, если это единственный способ. Но какие шаги я должен выполнить, чтобы заставить его работать. Прямо сейчас comment_author всегда записывается в базу данных.

Solutions Collecting From Web of "Комментарии не соответствуют настройке display_name, как сделать плагин для преодоления этого"

Этот код выполняет работу с фильтром. Не волнует, что в комментарии говорится имя автора.

Ничего особенного в этом нет. Должно быть понятно.

 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; } 

Вы должны помнить, что каждый профиль задает свой собственный параметр display_name , и для его принудительного применения вы можете подключиться к фильтру pre_user_display_name который дает вам возможность вносить изменения в него до того, как пользователь будет обновлен или вставлен. К сожалению, однако, pre_user_display_name не передает никакой информации, кроме display_name которая обычно является user_login . И вы даже не можете взломать static данные в своих функциях, чтобы ждать pre_user_first_name и pre_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 для поздней ночи, которая будет проходить каждый комментарий по одному и изменять комментарий_автор для формирования требуется один. Кроме того, вы можете wp_update_user() и переключить display_name помощью этого же запуска Cron, это зависит от вас.