get_avatar фильтр в WordPress 4.4, как правильно фильтровать

Старый код в моем плагине заменил get_avatar. Он прекратил работу с выпуском WP 4.4, поэтому я решил попытаться научиться использовать add_filter вместо этого.

Существуют и другие сообщения, в которых обсуждается количество передаваемых аргументов / параметров и т. Д. Я даже смотрел плагины WordPress в репозитории, которые используют add_filter, однако даже урезанный файл загружает только $ аватар_defaults, а не местоположение add_filter.

Вот моя «урезанная» версия, чтобы проверить, как фильтровать get_avatar. Вы увидите, что метод set_avatar должен попытаться загрузить test.png, но вместо этого загружает xenforo_logo.og.png для любой учетной записи, отличной от Gravatar.

class XenWord_Avatars { public function construct() { $this->hooks(); } public function hooks() { add_filter( 'get_avatar', array( $this, 'set_avatar' ), 10, 5 ); } public function set_avatar( $avatar, $id_or_email, $size, $default, $alt ) { if ( is_admin() ) { $screen = get_current_screen(); if ( is_object($screen) && in_array( $screen->id, array( 'dashboard', 'edit-comments' ) ) && $default == 'mm') { $default = get_option( 'avatar_default', 'mystery' ); } } if ( $default != 'XenForo' ) { return $avatar; } if ( $default == 'XenForo' ) { $newAvatar = plugins_url( '../admin/images/test.png', __FILE__ ); return $newAvatar; } return $avatar; } } $xenword_avatars = new XenWord_Avatars(); /** * Add Custom Avatar (Discussion Settings) * * @param $avatar_defaults * * @return mixed * @throws Zend_Exception */ function xenword_avatar_defaults( $avatar_defaults ) { // Get Avatar from plugin folder $new_avatar = plugins_url( '../admin/images/xenforo_logo.og.png', __FILE__ ); $avatar_defaults[$new_avatar] = "XenForo"; // Remove default avatars //unset ( $avatar_defaults['mystery'] ); //unset ( $avatar_defaults['blank'] ); //unset ( $avatar_defaults['gravatar_default'] ); //unset ( $avatar_defaults['identicon'] ); //unset ( $avatar_defaults['wavatar'] ); //unset ( $avatar_defaults['monsterid'] ); //unset ( $avatar_defaults['retro'] ); return $avatar_defaults; } add_filter( 'avatar_defaults', 'xenword_avatar_defaults' ); 

Может ли кто-нибудь увидеть что-то явно неправильно с тем, что сделано в вышеуказанном коде? Как только я выясню, что не так, я могу расширить этот метод, чтобы он получил аватар из XenForo на основе учетной записи пользователя.

Надеюсь, это поможет кому-то еще в будущем.

Количество параметров

Измените количество параметров в методе set_avatar на 6. $ args был добавлен как 6-й.

Исправить страницу options-discussion.php

Затем страница options-discussion.php не отображала аватары должным образом, и поэтому необходимо добавить блок кода is_admin.

  public function set_avatar( $avatar, $id_or_email, $size = '96', $default = '', $alt = false, $args ) { if ( ! get_option( 'show_avatars' ) ) { return false; } // Properly show Avatars and Gravatars on the options-discussion.php page if ( is_admin() ) { $screen = get_current_screen(); if ( is_object( $screen ) && in_array( $screen->id, array( 'dashboard', 'options-discussion' ) ) && ( $default != 'XenForo' ) ) { return $avatar; } } } 

Отладка во многих местах, чтобы проверить is_numeric, is_object и т. Д.

Затем Zend_debug показал $ id_or_email объект, который возвращался, и это очень помогло. В каждом из условных выражений работайте с $ id.

После условного использования используйте $ id для захвата userinfo и, в конечном счете, URL ($ out).

Вернуться $ avatar

Ответный аватар является важным, поэтому конечные строки требуют установки url ($ out).

  $avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"; return $avatar; 

Надеюсь, это поможет другим попыткам фильтровать аватары, а не заменять get_avatar.