Intereting Posts
просмотр подкатегорий по идентификатору Каков наиболее эффективный способ иметь два «блогов» на одном сайте? Очистить постоянную ссылку URL для настраиваемого типа сообщения Файл изображения запроса другого размера Как вызвать пользовательскую функцию вне страницы администратора? список всех дочерних категорий, которые применяются к текущему сообщению, даже если эти кошки пусты? Как импортировать XML в WordPress как почтовые и пользовательские поля? Рейтинг звезд для пользовательских типов сообщений Лучший способ контроля версий файлов WordPress? Seo WordPress Страницы на google Добавить раскрывающееся меню с помощью «add_filter => wp_nav_menu_items» Различные шаблоны для одного и того же контента, целевая страница с разных URL-адресов (общий, простой) Отображать URL-адрес в пользовательском поле Фильтруйте get_terms и получите только первую (самую важную категорию) Изменение параметров настройки Javascript для параметра «Настройка шаблона темы»

Комментарии не соответствуют настройке 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, это зависит от вас.