“无法在写入上下文中使用函数返回值”错误

时间:2016-11-25 作者:Ethan O\'Sullivan

我已经更新了插件,Disable Blogging, 至WordPress存储库中提供的最新版本。

一切正常。然而,我的一个用户在更新插件时遇到了一个错误。

Fatal error: 无法在中的写入上下文中使用函数返回值.../wp-content/plugins/disable-blogging/includes/functions-extra.php 在第74行

他们在另外两个自己的网站上运行这个插件,没有问题。唯一的区别是PHP版本:

出现错误的服务器是GoDaddy服务器,可能是PHP 5.4.45PHP 5.6.25

\'meta\' => array( \'class\' => empty( get_avatar( get_current_user_id(), 28 ) ) ? \'\' : \'with-avatar\', ),
但这里是该函数的完整代码。此函数仅删除管理栏中的“Howdy”问候语。

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\', ),
        ) );
    }
}
据我猜测,这可能是PHP 5.4的兼容性问题?我一直在开发5.6版本的插件,根据PHP,version 5.4 is no longer being supported.

如果是这样的话,我想确认一下。通过这种方式,我可以将其转发给用户,甚至可以添加一个函数,在任何WordPress站点激活之前检查其PHP版本。

2 个回复
最合适的回答,由SO网友:Ethan O\'Sullivan 整理而成

如所述Dave RomseyJHoffmann, 我实现了一个更简单的逻辑,没有使用empty():

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

\'meta\' => array( \'class\' => ( get_avatar( get_current_user_id(), 28 ) ) ? \'with-avatar\' : \'\', ),
我还包括return 函数结束时:

return $wp_admin_bar;
以下是完整的代码:

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;
    }
}

SO网友:JHoffmann

主机上不协调行为的原因源于不同的PHP版本。如果您检查PHP manual 对于empty() 语言构造,您可以在变更日志中看到:

5.5.0 empty()现在支持表达式,而不仅仅是变量。

因此,只有在PHP 5.5之后,才有可能在empty()) 就像插件中所做的那样。在这种情况下empty() 不需要,代码应该在没有它的情况下简单地工作:

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