如何在PHP / Wordpress中的回调函数中引用类方法而不是函数?

时间:2017-07-21 18:53:54

标签: php wordpress plugins

免责声明,我几周都在使用Wordpress / PHP,所以请随时为我解决问题。

我一直在为自定义Wordpress插件构建设置页面。我的插件的所有功能都存在于类中,所以我这样做:

add_action('init', array($this, 'custom_func'));

而不是

add_action('init', 'custom_func');

认为这是有效的,因为add_action的第二个参数接受数组或函数的字符串名称或匿名函数

我目前的问题是我无法在设置页面上使用此功能。

代码:

public function plugin_admin_init () {

    //Register group of options
    register_setting( 'exp_wp_plugin_options', 'exp_wp_plugin_options', array( $this, 'plugin_options_validate' ) );

    //Add a section to group
    add_settings_section('exp_wp_plugin_main', 'Main Settings', function () {

    //plugin_settings_text
    echo '<p>Main description of this section here.</p>';

       }, $this->screen );

    //Add a field to the section
    add_settings_field('exp_wp_plugin_text_string', 'Plugin Text Input', array( $this, 'plugin_setting_string' ), $this->screen, 'plugin_main');

   }

public function plugin_setting_string() {

    $options = get_option('plugin_options');

    echo "<input id='plugin_text_string' name='plugin_options[text_string]' size='40' type='text' value='{$options[ 'text_string' ]}' />";

}
  1. register_settings函数调用允许我传递数组($ this,&#39; func_name&#39;)语法

  2. 第二个函数调用add_settings_section正在使用匿名函数(但如果可能的话,我宁愿将其移到另一个方法中)。

  3. 第三个函数add_settings_field使用数组($ this,&#39; func_name&#39;)语法失败,并且抛出的错误是它正在寻找一个字符串。

  4. 这些方法是WP的Settings API的一部分。我不确定这是一个PHP问题,还是一个Wordpress问题,但如果有人能告诉我如何让这个工作,我会感激任何帮助。

    编辑:这是我的IDE(PHP Storm)抛出的错误:

      

    预期的字符串,得到数组。调用参数类型不是   与声明兼容。

1 个答案:

答案 0 :(得分:1)

PHPStorm将其警告基于方法的docblock注释中的类型提示集。自Wordpress 4.5起,add_settings_field()函数的docblock已修复,表示它接受callable,之前它用于表示string

如果您在Wordpress 4.4.10 (last 4.4.x version)Wordpress 4.5中查看该功能的docblock评论,您会发现他们已将其从@param string $callback更改为@param callable $callback。您可能还注意到函数的内部工作方式没有改变,实际的实现总是接受一个可调用的。

忽略PHPStorm的此警告可能是安全的,但我建议您先在非生产环境中进行尝试。如果PHP本身很好,你可以在PHPStorm中选择suppress the warning

更好的选择是将Wordpress升级到最新版本(如果可能)。 Wordpress为互联网的很大一部分提供支持,因此它是黑客非常受欢迎的目标。如果您运行的是旧版本,那么 vulnerabilities in your site,如果黑客决定瞄准您的公司或只是随机寻找可能会被滥用要添加到僵尸网络的服务器。