私は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
を無視しますが、どうすればそれを渡すことができますか?
これを実現するには複数の方法があります。私は、あなたがそれをしている方法を根本的に変えない方法をあなたに示しています:
最初の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
にアクセスできるようになります。