web-dev-qa-db-fra.com

Erreur "Impossible d'utiliser la valeur renvoyée par la fonction dans un contexte d'écriture"

J'ai mis à jour mon plugin, Disable Blogging , vers la dernière version disponible dans le référentiel WordPress.

Tout fonctionne comme il se doit. Cependant, l'un de mes utilisateurs a rencontré une erreur lors de la mise à jour de mon plugin.

Erreur fatale : Impossible d’utiliser la valeur renvoyée par la fonction dans le contexte d’écriture dans .../wp-content/plugins/disable-blogging/includes/functions-extra.php sur ligne 74

Ils exécutent ce plugin sur deux autres sites qu'ils possèdent et il n'y a aucun problème. La seule différence est la version PHP:

  • Celui qui a le erreur est un serveur GoDaddy et qui pourrait être PHP 5.4.45
  • Les autres sont sur Digital Ocean et PHP 5.6.25

En regardant dans mon code source, voici le code de renvoi à la ligne 74 qui fait partie d'une fonction:

'meta' => array( 'class' => empty( get_avatar( get_current_user_id(), 28 ) ) ? '' : 'with-avatar', ),

Mais voici le code complet de cette fonction. Cette fonction supprime simplement le message d'accueil "Howdy" dans la barre d'administration.

public function admin_greeting( $wp_admin_bar ) {
    # Remove admin greeting in all languages
    if ( 0 != get_current_user_id() ) {
        $wp_admin_bar->add_menu( array(
            'id' => 'my-account',
            'parent' => 'top-secondary',
            'title' => wp_get_current_user()->display_name . get_avatar( get_current_user_id(), 28 ),
            'href' => get_edit_profile_url( get_current_user_id() ),
            'meta' => array( 'class' => empty( get_avatar( get_current_user_id(), 28 ) ) ? '' : 'with-avatar', ),
        ) );
    }
}

À mon avis, cela pourrait être un problème de compatibilité avec PHP 5.4? J'ai développé le plugin sur 5.6 et selon PHP, la version 5.4 n'est plus supportée .

Si tel est le cas, j'aimerais avoir une confirmation à ce sujet. De cette façon, je peux relayer cela à l'utilisateur et même ajouter une fonction pour vérifier la version PHP de tout site WordPress avant qu'il ne soit activé.

2

Comme indiqué par Dave Romsey et JHoffmann , j'ai implémenté une logique plus simple sans utiliser empty():

'meta' => array( 'class' => empty( get_avatar( get_current_user_id(), 28 ) ) ? '' : 'with-avatar', ),

est maintenant:

'meta' => array( 'class' => ( get_avatar( get_current_user_id(), 28 ) ) ? 'with-avatar' : '', ),

J'ai également inclus une return à la fin de la fonction:

return $wp_admin_bar;

Voici le code complet:

public function admin_greeting( $wp_admin_bar ) {
    # Remove admin greeting in all languages
    if ( 0 != get_current_user_id() ) {
        $wp_admin_bar->add_menu( array(
            'id' => 'my-account',
            'parent' => 'top-secondary',
            'title' => wp_get_current_user()->display_name . get_avatar( get_current_user_id(), 28 ),
            'href' => get_edit_profile_url( get_current_user_id() ),
            'meta' => array( 'class' => ( get_avatar( get_current_user_id(), 28 ) ) ? 'with-avatar' : '', ),
        ) );
        return $wp_admin_bar;
    }
}
3

La cause du comportement inconsistant sur les hôtes a ses racines dans les différentes versions de PHP. Si vous vérifiez la construction __ PHP manual pour le langage empty(), vous pouvez voir dans le journal des modifications:

5.5.0 empty () supporte maintenant les expressions plutôt que seulement les variables.

C'est donc uniquement depuis PHP 5.5 qu'il est possible d'utiliser des expressions à l'intérieur de empty()) comme cela est fait dans votre plugin. Dans ce cas, l'utilisation de empty() n'est pas nécessaire et le code devrait simplement fonctionner sans elle:

'meta' => array( 'class' => get_avatar( get_current_user_id(), 28 ) ? 'with-avatar' : '', ),
3
JHoffmann