将$this传递给嵌套在同一类的另一个公共函数中的函数

时间:2017-03-16 作者:bluantinoo

我正在使用WordPress Plugin Boilerplate by DevinVinson.

我正在为wich添加一个公共快捷码函数,我需要一些资源(js和css),我只想在必要时将脚本(放在页脚中)排队,所以我需要在返回快捷码之前将脚本排队。

幸亏Fayaz answer 我解决了主要问题,但仍有一个小问题:我无法将$this->plugin\\u name传递给shortcode函数,我需要在wp_enqueue_script 作用

正如样板提供的add_action 钩住define_public_hooks 函数,我确实使用了它,并在其中嵌套了add\\u shortcode挂钩,如下所示:

class My_Plugin {
   $plugin_public = new My_Plugin_Public( $this->get_plugin_name(), $this->get_version() );

   $this->loader->add_action( \'init\', $plugin_public, \'my_plugin_ajax_register_shortcode\' );

}
然后在my-plugin-public.php 文件:

class My_Plugin_Public {

  public function __construct( $plugin_name, $version ) {

        $this->plugin_name = $plugin_name;
        $this->version = $version;

    }

  public function my_plugin_ajax_register_shortcode(){


     function the_actual_shortcode($atts){

        $content = \'shortcode content\';

        wp_enqueue_script( $this->plugin_name.\'_google_maps_api\' ); // we don\'t know what $this->plugin_name is!

        return $content;    
     }
     add_shortcode(\'my_shortcode\', the_actual_shortcode);
 }

}
正如你所想象的the_actual_shortcode 函数,忽略$this->plugin_name, 我怎样才能通过呢?

1 个回复
最合适的回答,由SO网友:Fayaz 整理而成

有多种方法可以实现这一点。我向您展示的方法不会从根本上改变您的做法:

先进的My_Plugin 类别:

class My_Plugin {
    // ...
    private function define_public_hooks() {
        $plugin_public = new My_Plugin_Public( $this->get_plugin_name(), $this->get_version() );
        $this->loader->add_action( \'init\', $plugin_public, \'init\' );
        // ...
    }
    // ...
}
然后在My_Plugin_Public 类,创建一个名为init. 在这里,你可以做你想做的事情init 触发动作挂钩。因此,添加短代码将进入init 方法:

class My_Plugin_Public {

    public function __construct( $plugin_name, $version ) {

        $this->plugin_name = $plugin_name;
        $this->version = $version;

    }

    public function init() {
        add_shortcode( \'my_shortcode\', array( $this, \'my_plugin_ajax_register_shortcode\' ) );
    }

    public function my_plugin_ajax_register_shortcode( $atts ) {
        $content = \'shortcode content\';
        wp_enqueue_script( $this->plugin_name . \'_google_maps_api\' );
        return $content;
    }
}
因此,基本上不是在类方法中创建内部函数my_plugin_ajax_register_shortcode, 我们正在使用另一种名为init 在班级内。现在我们可以访问$this->plugin_name 在shortcode处理程序函数中,因为现在它在My_Plugin_Public

相关推荐

redirect if shortcode exists

WordPress初学者。我试图检查用户请求的页面中是否存在短代码,如果存在,则在用户未登录时重定向。function redirect_to_home() { if (has_shortcode(get_the_content(), \'shortcode\')) { if(!is_admin() && !is_user_logged_in()) { //redirect exit(); }