web-dev-qa-db-ja.com

ショートコードが使用されている場合にのみスクリプトをエンキューします。 WP プラグイン定型文

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

1つ以外はすべてうまくいきます。

私は、ショートコードがページにあるときだけ、スクリプトとcssをエンキューしようとしています。

define_public_hooks関数に、スクリプトを登録する代わりに、スクリプトを登録するためのローダーへの呼び出しを追加しました。

private function define_public_hooks() {
    // ...
    $this->loader->add_action( 'wp_register_script', $plugin_public, 'register_styles' );
    $this->loader->add_action( 'wp_register_script', $plugin_public, 'register_scripts' );
    // ...
}

それからclass-my-plugin-public.phpファイルに2つのパブリック関数register_styles()register_scripts()を作成しました。これらの関数の中では、それらをエンキューする代わりに、スクリプトとスタイルを登録するだけです。これは基本的なことです。

public function register_scripts() {    
    wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key .'&v=3&libraries=places', array( 'jquery' ), '3', true );
}

それから私はそれらをshortcode return関数に入れたいのですが、それらはまったく登録されません。

wp_script_is( $this->plugin_name . '_google_maps_api', 'registered' )で確認したところ、falseが返されました。

enqueueの代わりにregisterを使っても同じことをすれば、すべてうまくいきます。

何かアイディアは?

4
bluantinoo

なぜうまくいかないのか

あなたは wp_enqueue_scripts actionフックを使う必要があります。あなたはwp_register_scriptをアクションフックとして使いましたが、WordPressコアにはwp_register_scriptという名前のアクションフックはありません。

これが愚かな間違いであれば、あなたはすでに答えを持っています。このトピックに関する詳細情報が必要な場合はお読みください。


wp_enqueue_scriptsaction hook )にコールバック関数をつけることはあなたのスクリプトやスタイルがエンキューされることを意味するのではなく、単に コールバック関数 を実行したい時を意味します。

元の登録とエンキューは、 hook ではなく)wp_register_script()wp_register_stylewp_enqueue_script()wp_enqueue_style()などの関数によって行われます。

関数とフックの役割の違いに注意してください。

正しいコード

だからあなたの修正されたコードは以下のようになるはずです。

private function define_public_hooks() {
    // ...
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_styles' );
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_scripts' );
    // ...
}

その後、

public function register_scripts() {
    wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true );
}

その後、ショートコードハンドラ関数内からスクリプト(&style)をエンキューします。

public function your_shortcode_handler( $atts ) {
    // shortcode related CODE
    wp_enqueue_script( $this->plugin_name . '_google_maps_api' );
    // more shortcode related CODE
}

このCODEでは、your_shortcode_handler関数からエンキューされたスクリプト/スタイルは、その特定のURLにショートコードがある場合にのみあなたのサイトに追加されます。

参考文献:

_(この答え はショートコードがあるときだけスクリプトとスタイルをキューに入れることについて興味深い議論をしています。

6
Fayaz

それで問題はadd_action呼び出しへの最初の引数が WordPress action名である必要があるということです...だから、WPアクションではない "wp_register_script"は決して呼ばれません。

登録呼び出しをプラグインのenqueue_scripts関数に追加するだけです。define_public_hooksを使用したり、新しいregister_scripts関数を作成したりする必要はありません。既存のenqueue_scripts関数を使用するだけですが、そこに登録を追加してください。

public function enqueue_scripts() {
    wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/plugin-name-public.js', array( 'jquery' ), $this->version, false );

    // NOTICE this is a *registration* only:
    wp_register_script( $this->plugin_name.'_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true ); 
}

次に、短いコードを入力したら、スクリプトを登録して、キューに入れる準備をします。

お役に立てれば!

0
MacPrawn