web-dev-qa-db-ja.com

同じクラスの別のパブリック関数にネストされている関数に$ thisを渡します。

私はDevinVinsonによる WordPress Plugin Boilerplate を使ってプラグインを作成しています。

私はいくつかのリソース(jsとcss)が必要なときに必要なときだけスクリプトをエンキューしたいので、ショートコードが返される直前にスクリプトをエンキューする必要があるので、パブリックショートコード関数を追加します。 。

おかげで Fayazの答え 私は主な問題を解決しましたが、まだ小さな問題があります。$ this-> plugin_nameをshortcode関数に渡すことはできません。変数wp_enqueue_script関数でリソースに正しく名前を付ける必要があります。

Boilerplateはadd_action関数でちょうどdefine_public_hooksフックを提供しているので、私はそれを使いました、そしてその中にadd_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
bluantinoo

これを実現するには複数の方法があります。私は、あなたがそれをしている方法を根本的に変えない方法をあなたに示しています:

最初の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という名前の新しいメソッドを作成します。 WordPressの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クラスの範囲内であるため、ショートコードハンドラ関数内でMy_Plugin_Publicにアクセスできるようになります。

1
Fayaz