WordPress.org

Ready to get started?Download WordPress

Forums

Add Local Avatar
get_avatar Filter Hook Missing 5th. Argument (9 posts)

  1. vicchi
    Member
    Posted 1 year ago #

    Hi,

    One of my plugins uses the get_avatar filter hook and is often used in conjunction with Add Local Avatar.

    But Add Local Avatar doesn't call the get_avatar filter hook correctly, it's missing the 5th. argument.

    If you look at /wp-content/plugins/add-local-avatar/avatars.php at line 1412, you'll see this ...

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default);

    ... this is the wrong filter signature, it's missing the $alt argument. Compare and contrast with what the filter signature should be, according to the WordPress core in /wp-includes/pluggable.php for v3.4 onwards ...

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);

    ... this means that I'm getting support requests about PHP warning messages along the lines of

    Warning: Missing argument 5 for WP_Biographia::get_avatar() in/var/www/wp-content/plugins/wp-biographia/wp-biographia.php on line 498

    There's a clash between the filter signatures. So I've created a patch for you which will resolve this ... you'll find it as a Gist on GitHub here: https://gist.github.com/4038938

    Could you update your plugin and push out a new version which implements get_avatar correctly please? I did post about this about a month ago on a parallel thread here on the forums (http://wordpress.org/support/topic/plugin-add-local-avatar-another-plugin-has-broken-this-one?replies=2) ... but you maybe didn't notice.

    Thanks

    -Gary

    http://wordpress.org/extend/plugins/add-local-avatar/

  2. peterwsterling
    Member
    Plugin Author

    Posted 1 year ago #

    Negative, there is no missing argument.

  3. vicchi
    Member
    Posted 1 year ago #

    Hi ... thanks for getting back to me on this ...

    From my reading of the WordPress source and the source of your plugin, there is a missing argument and it's the 5th argument.

    Based on the current 3.5.1 release of WordPress, /wp-includes/pluggable.php calls the get_avatar filter with 5 arguments, $avatar, $id_or_email, $size, $default and $alt.

    See pluggable.php at line 1668 ...

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);

    From looking at your 11.1 release of Add Local Avatar, /wp-content/plugins/add-local-avatar/avatars.php calls the get_avatar filter with only 4 arguments, omitting to specify the final $alt argument.

    See avatar.php at line 1413 ...

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default);

    ... so as a result, I'm not sure why you're saying there is no missing argument.

    Now granted, this only appears if I enable WP_DEBUG in my wp-config.php file, but it's still an issue. I keep WP_DEBUG disabled on my public facing, production systems, but have it enabled on my local development installations ... quite a few people though do have WP_DEBUG enabled on their production systems. Whether this is a good idea or not is another discussion. But this does mean that I get enough support requests, either on the forums or by email on the get_avatar filter to make me go on about this (I'm afraid).

    Using WP 3.5.1 and Add Local Avatars 11.1 I've just enabled the plugin on a local install, with WP_DEBUG enabled.

    On the Dashboard, after enabling Add Local Avatars, I get warnings for deprecated WordPress API calls ...

    Notice: has_cap was called with an argument that is deprecated since version 2.0! Usage of user levels by plugins and themes is deprecated. Use roles and capabilities instead. in /Applications/MAMP/htdocs/vicchi.org/wp-includes/functions.php on line 2923
    
    Notice: get_usermeta is deprecated since version 3.0! Use get_user_meta() instead. in /Applications/MAMP/htdocs/vicchi.org/wp-includes/functions.php on line 2839
    
    Notice: get_usermeta is deprecated since version 3.0! Use get_user_meta() instead. in /Applications/MAMP/htdocs/vicchi.org/wp-includes/functions.php on line 2839

    ... which appear to stem from avatars.php at line 1349.

    Loading a post with an avatar in the comments, generates these Notice messages

    Notice: Undefined offset: 0 in /Applications/MAMP/htdocs/vicchi.org/wp-content/plugins/add-local-avatar/avatars.php on line 725
    
    Notice: Undefined offset: 0 in /Applications/MAMP/htdocs/vicchi.org/wp-content/plugins/add-local-avatar/avatars.php on line 725
    
    Notice: get_user_by_email is deprecated since version 3.3! Use get_user_by('email') instead. in /Applications/MAMP/htdocs/vicchi.org/wp-includes/functions.php on line 2839
    
    Notice: get_usermeta is deprecated since version 3.0! Use get_user_meta() instead. in /Applications/MAMP/htdocs/vicchi.org/wp-includes/functions.php on line 2839
    
    Warning: Missing argument 5 for WP_Biographia::get_avatar() in /Applications/MAMP/htdocs/vicchi.org/wp-content/plugins/wp-biographia/wp-biographia.php on line 498

    ... that looks like a missing 5th. argument to me I'm afraid; unless I'm missing something (which is entirely possible).

    -Gary

  4. peterwsterling
    Member
    Plugin Author

    Posted 1 year ago #

    Look at line 1282, the local definition of get_avatar has 4 args.

  5. vicchi
    Member
    Posted 1 year ago #

    You're right; that definition of get_avatar does have 4 args, but here's what I think is happening (with apologies in advance if this looks like I'm lecturing you; that's not the intention).

    With Add Local Avatars disabled ...

    1. My plugin loads and calls add_filter for get_avatar specifying 5 arguments, which is what WP expects

    2. All plugins have finished loaded so WP invokes pluggable.php, finds that there's no definition of get_avatar so it defines the WP standard version, which takes 4 arguments, of which only the 1st argument, $id_or_email is mandatory.

    3. My plugin runs, calls (via a direct function call) get_avatar which is calling the version of this function defined in pluggable.php; this function calls apply_filters for get_avatar, specifying 5 arguments.

    4. The call to apply_filters in turn calls all filters registered for get_avatar, which includes my plugin's filter hook code. Filter (and action) hooks are not called by direct function call but via _wp_call_all_hook (defined in plugin.php which devolves to a call to call_user_func_array where the number of arguments needs to match. My get_avatar filter hook takes 5 arguments. All is well.

    Now I enable Add Local Avatar ...

    1. My plugin loads and calls add_filter for get_avatar specifying 5 arguments, which is what WP expects

    2. Add Local Avatar loads and plugs get_avatar (your template tag at line 1282 in avatar.php) with 4 arguments. Again, only the 1st argument is mandatory.

    3. All plugins have loaded, WP invokes pluggable.php but this time there's already a definition (yours) of get_avatar so the WP version doesn't get defined.

    4. My plugin runs, calls (via a direct function call) get_avatar which is calling the Add Local Avatar version of this function; this function calls apply_filters for get_avatar, specifying 4 arguments.

    5. The call to apply_filters again devolves to a call to call_user_func_array which sees my get_avatar filter hook, tries to invoke it, but there's a mismatch on the number of arguments so PHP complains, giving the warning message in my original post.

    So, after all that, the issue here is not that your plugged version of get_avatar has 4 arguments but that you're effectively redefining the argument count for the get_avatar filter.

    Crucially, there's a difference between the (plugged) version of the get_avatar API call and the filter get_avatar; they may share the same name but they're different functions and take differing numbers of arguments; at least as far as the WordPress API is concerned.

    If Add Local Avatar is the sole source of the (redefined) definition of and call to the get_avatar filter then this problem never occurs. But the moment that another theme or plugins uses the get_avatar filter then they will (hopefully) code against the WordPress version of the filter (with 5 arguments) and not the redefined version in Add Local Avatar.

    Basically, the fix is trivial, just change your invocation of the get_avatar filter to agree with WordPress and all should be well.

    Hope this all makes sense

    -Gary

  6. peterwsterling
    Member
    Plugin Author

    Posted 1 year ago #

    You write, "your plugin", are you saying the is another plugin in this scenario?

  7. vicchi
    Member
    Posted 1 year ago #

    That's precisely what I'm saying ... to copy-and-paste from the initial lines of the first post of this thread ...

    One of my plugins uses the get_avatar filter hook and is often used in conjunction with Add Local Avatar.

    This is where the issue lies; there's the WordPress implementation (argument wise) of the get_avatar filter, there's my plugin's implementation of the same filter and there's your plugin's implementation of the same filter. My plugin's definition of this filter agrees with the WordPress reference implementation, 5 arguments, yours only has 4 arguments.

    Where my plugin is http://wordpress.org/extend/plugins/wp-biographia/ (I'm the plugin's author) and your plugin is, of course, http://wordpress.org/extend/plugins/add-local-avatar/

    -Gary

  8. britne
    Member
    Posted 1 year ago #

    Another plugin I am using also causes Add Local Avatar to throw this error. Has it been fixed yet? I would really like to use Add Local Avatar in conjunction with the other plugins I have already implemented.

  9. vicchi
    Member
    Posted 1 year ago #

    Gentle nudge ... any further thoughts or progress on this? I'd love to be able to tell the users of my plugin that this has been resolved; for now I'm recommending that they hack your plugin's source, which is not a viable or pleasing solution.

    -Gary

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic