add_filter priority problem

时间:2016-06-03 作者:kenarsuleyman

我在wordpress中使用基本用户头像来使用本地头像。我的函数中有一个简单的函数。php获取头像直接链接。我的问题是,如果我在函数php中使用get\\u avatar函数,它会返回gravatar img,但如果我在前端页面中使用get\\u avatar函数,它会返回本地avatar。这是插件的代码

public function __construct() {

    // Text domain
    $this->load_textdomain();

    // Actions
    add_action( \'admin_init\',                array( $this, \'admin_init\'               )        );
    add_action( \'show_user_profile\',         array( $this, \'edit_user_profile\'        )        );
    add_action( \'edit_user_profile\',         array( $this, \'edit_user_profile\'        )        );
    add_action( \'personal_options_update\',   array( $this, \'edit_user_profile_update\' )        );
    add_action( \'edit_user_profile_update\',  array( $this, \'edit_user_profile_update\' )        );
    add_action( \'bbp_user_edit_after_about\', array( $this, \'bbpress_user_profile\'     )        );

    // Shortcode
    add_shortcode( \'basic-user-avatars\',     array( $this, \'shortcode\'                )        );

    // Filters
    add_filter( \'get_avatar\',                array( $this, \'get_avatar\'               ), 10, 5 );
    add_filter( \'avatar_defaults\',           array( $this, \'avatar_defaults\'          )        );
}

public function get_avatar( $avatar = \'\', $id_or_email, $size = 96, $default = \'\', $alt = false ) {

    // Determine if we recive an ID or string
    if ( is_numeric( $id_or_email ) )
        $user_id = (int) $id_or_email;
    elseif ( is_string( $id_or_email ) && ( $user = get_user_by( \'email\', $id_or_email ) ) )
        $user_id = $user->ID;
    elseif ( is_object( $id_or_email ) && ! empty( $id_or_email->user_id ) )
        $user_id = (int) $id_or_email->user_id;

    if ( empty( $user_id ) )
        return $avatar;

    $local_avatars = get_user_meta( $user_id, \'basic_user_avatar\', true );

    if ( empty( $local_avatars ) || empty( $local_avatars[\'full\'] ) )
        return $avatar;

    $size = (int) $size;

    if ( empty( $alt ) )
        $alt = get_the_author_meta( \'display_name\', $user_id );

    $author_class = is_author( $user_id ) ? \' current-author\' : \'\' ;
    $avatar       = "<img alt=\'" . esc_attr( $alt ) . "\' src=\'" . $local_avatars[\'full\'] . "\' class=\'avatar avatar-{$size}{$author_class} photo\' height=\'{$size}\' width=\'{$size}\' />";

    return apply_filters( \'basic_user_avatar\', $avatar );
}
我尝试在add\\u filter(“get\\u avatar”)中使用较低优先级,但如果使用较低优先级的插件,则无法正常工作。可能是因为return语句中的apply\\U过滤器。但我不知道到底是什么问题。如何解决此问题?谢谢

1 个回复
SO网友:dan9vu

get_avatar 过滤器接受6个参数,而不是5个。

$id_or_email 也可以是的实例WP_Post, WP_User 或md5哈希字符串。所以最好是提取$user_id 像这样:

 if ( is_numeric( $id_or_email ) ) {
     $user_id = $id_or_email;
 } elseif ( is_string($id_or_email) ) {
     if ( is_email($id_or_email) ) {
         $user = get_user_by(\'email\', $id_or_email);
         $user_id = $user->ID;
     } else { // md5 hash string
         // Do something.
     }
 } elseif ( is_object($id_or_email) ) {
     if ($id_or_email instanceof \\WP_User) {
         $user_id = $id_or_email->ID;
     } elseif ($id_or_email instanceof \\WP_Post) {
         $user_id = $id_or_email->post_author;
     } else {
         $user_id = $id_or_email->user_id;
     }
 } else {
     return $avatar;
 } 
确保get_user_meta( $user_id, \'basic_user_avatar\', true ) 归还一些东西。如果未返回任何内容,则默认为$avatar 将使用