Intereting Posts
Взаимосвязь между двумя таксономиями и специальным типом сообщения фильтр the_excerpt с пустой выдержкой Изменить флажок «Показать название сайта и тегов» в настройке темы URL-адрес страницы не работает из-за физического каталога query_posts -> с использованием meta_compare / где мета значение меньше или больше или равно Количество показов новых участников, зарегистрированных сегодня Customizer: когда использовать customize_preview_init VS customize_controls_enqueue_scripts Отображение изображения по умолчанию для пользовательского логотипа Форма пользовательского поиска WP_Meta_Query – Фильтрация пользовательских полей Как использовать slideToggle внутри сообщения WordPress? Когда следует создавать пользовательские типы сообщений? Запрос пользователя и ошибка поиска Есть ли способ перенаправить незарегистрированный пользователь на страницу регистрации при нажатии ссылки? Получить конкретный ключ ACF и значение из всех сообщений – нет доступа к БД Как установить более одного блога WordPress на EC2?

Пользовательский аватар пользователя в списке пользователей WordPress

По умолчанию WordPress использует Gravatar для пользовательских аватаров.

Я создал настраиваемое поле для загрузки аватаров, и я использую это как аватары пользователей на разных страницах темы.

На странице администрирования всех пользователей есть столбец, который обычно отображает аватар пользователя (см. Ниже). Есть ли способ использовать мое настраиваемое поле вместо поля gravatar по умолчанию?

введите описание изображения здесь

В качестве альтернативы моему другому ответу вы также можете использовать фильтр get_avatar . Подчинитесь Сумиту, чтобы предупредить меня об этом.

Преимущество использования фильтра get_avatar заключается в том, что ваш пользовательский аватар должен применяться везде, где WordPress использует его, а не только в этом списке пользователей, как и в моем другом ответе. Если вы используете плагины, отображающие пользовательские аватары, это решение также должно работать для них, обеспечивая им хорошую игру и использование фильтров WordPress, которые они должны использовать 🙂

Официальные документы для фильтра get_avatar находятся здесь .

В functions.php вашей темы вы хотите настроить свою функцию следующим образом:

 add_filter("get_avatar", "wpse_228870_custom_user_avatar", 1, 5); function wpse_228870_custom_user_avatar($avatar, $id_or_email, $size, $alt, $args){ // determine which user we're asking about - this is the hard part! // ........ // get your custom field here, using the user's object to get the correct one // ........ // enter your custom image output here $avatar = '<img alt="' . $alt . '" src="image.png" width="' . $size . '" height="' . $size . '" />'; return $avatar; } 

Теперь этого много, потому что, возможно, разочарование, WordPress не отправляет хороший чистый пользовательский объект или идентификатор пользователя через этот фильтр – согласно документам, которые он может дать нам:

user_id, хэш-файл gravatar md5, пользовательский адрес электронной почты, объект WP_User, объект WP_Post или объект WP_Comment

Большинство из них мы можем иметь дело – если мы получим хэш Gravatar, который будет немного сложнее, но в остальном мы можем использовать встроенные функции WordPress для получения правильного объекта пользователя.

Вот пример, который начинается с этого в старых документах WordPress . Однако для того, чтобы этот фильтр работал правильно везде, где он используется, вам нужно написать немного больше, чтобы убедиться, что вы также можете обнаружить и обработать объект post или comment (возможно, используя функцию PHP is_a ), а затем получить ассоциированной должности или автора комментария.

Мы могли бы также использовать один из следующих фильтров, доступных с WordPress 4.2:

  • pre_get_avatar_data
  • get_avatar_url
  • get_avatar_data

Что касается того, как получить идентификатор пользователя из $id_or_email мы можем видеть, как это делается в ядре :

 $email_hash = ''; $user = $email = false; if ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) { $id_or_email = get_comment( $id_or_email ); } // Process the user identifier. if ( is_numeric( $id_or_email ) ) { $user = get_user_by( 'id', absint( $id_or_email ) ); } elseif ( is_string( $id_or_email ) ) { if ( strpos( $id_or_email, '@md5.gravatar.com' ) ) { // md5 hash list( $email_hash ) = explode( '@', $id_or_email ); } else { // email address $email = $id_or_email; } } elseif ( $id_or_email instanceof WP_User ) { // User Object $user = $id_or_email; } elseif ( $id_or_email instanceof WP_Post ) { // Post Object $user = get_user_by( 'id', (int) $id_or_email->post_author ); } elseif ( $id_or_email instanceof WP_Comment ) { /** * Filter the list of allowed comment types for retrieving avatars. * * @since 3.0.0 * * @param array $types An array of content types. Default only contains 'comment'. */ $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) ); if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) { $args['url'] = false; /** This filter is documented in wp-includes/link-template.php */ return apply_filters( 'get_avatar_data', $args, $id_or_email ); } if ( ! empty( $id_or_email->user_id ) ) { $user = get_user_by( 'id', (int) $id_or_email->user_id ); } if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) { $email = $id_or_email->comment_author_email; } } 

Было бы проще, если бы идентификатор пользователя был передан обратным вызовам фильтра или если для этого была доступна специальная функция, например

 wp_get_user_from_id_or_email( $id_or_email ) 

EDIT: Мое первоначальное решение ниже, но Сумит предупредил меня в комментариях о существовании фильтра get_avatar . Я опубликовал дополнительный ответ, в котором показано, как реализовать этот вариант.


Да, ты можешь это сделать.

Столбцы, отображаемые в любой из этих таблиц списков в WordPress admin, можно фильтровать – поэтому, используя пользовательскую функцию в функции functions.php вашей темы, вы можете удалить столбцы или добавить свои собственные.

Эта функция позволит вам удалить столбец по умолчанию и добавить пользовательский:

 add_filter("manage_users_columns", "wpse_228870_custom_user_avatar"); function wpse_228870_custom_user_avatar($columns){ $columns = array_slice($columns, 0, 1) // leave the checkbox in place (the 0th column) + array("custom_avatar" => "") // splice in a custom avatar column in the next space + array_slice($columns, 1) // include any other remaining columns (the 1st column onwards) ; return $columns; } 

Есть много способов, которыми вы можете это сделать, но в этом я просто взял массив $columns и массировал его, чтобы привязать свой пользовательский аватар на второй позиции. Вы можете использовать любую функцию массива PHP для выполнения всех этих столбцов.

Затем нам нужно сообщить WordPress, что отображать в этой колонке custom_avatar :

 add_filter("manage_users_custom_column", "wpse_228870_custom_user_avatar_column", 10, 3); function wpse_228870_custom_user_avatar_column($output, $column_name, $user_id){ // bow out early if this isn't our custom column! if($column_name != "custom_avatar"){ return $output; } // get your custom field here, using $user_id to get the correct one // ........ // enter your custom image output here $output = '<img src="image.png" width="50" height="50" />'; return $output; } 

Если изображение не отображается в правильных размерах или не соответствует стилю, вы можете добавлять стили к администратору WordPress, если хотите больше контролировать, как сортируются столбцы и их содержимое.

Вы также можете узнать больше о двух фильтрах, которые я использовал в документации WordPress: manage_users_columns находится в Codex, а manage_users_custom_column – в новой ссылке на код. Аналогичные фильтры существуют для любой из других таблиц, таких как сообщения и страницы.