web-dev-qa-db-ja.com

特定のページにのみコードを含む方法

プラグインとショートコードについて学んでいます。私が自分のプラグインを有効にすると、そのコードが私のすべてのページにロードされることに気付きました。 (私はコンテンツ対管理ページを意味するものではありません)。一部のコンテンツページでは特定のショートコードを使用し、他のコンテンツページでは使用しません。ただし、いずれにせよ、プラグインのコードが読み込まれます。ショートコードが使用されているページにのみプラグインが含まれるようにするにはどうすればよいですか?

より詳しく:

ライトボックスを作るプラグインがあるとしましょう。プラグインを起動します。私の「かっこいい画像」ページでは、ライトボックスを作成するためにショートコードを使用しています。ライトボックスのショートコードを使用していない[バージョン情報]ページで[ソースの表示]を確認すると、ライトボックスプラグインのコードが読み込まれています。自分のプラグインを書くと自分のページが速くロードされるので、そのコードは必要な場所にのみロードされます。これは可能ですか?さもなければ、私は不必要にページにロードされたたくさんのプラグインのためのコードを持つでしょう。何か案は?

14
Laxmidi

WP v3.3では、ページ中央でwp_enqueue_scriptを実行することができました。 チケット9346

これにより、JSをより細かい粒度で含めることがはるかに簡単になりました(少なくともショートコードを使用する場合)。ここでは、jqueryはショートコードが発生したときにのみ含まれます。

function get_slideshow() {
  // Do some stuff...

  // Load up scripts right from within our shortcode function (requires WP 3.3+)
  wp_enqueue_script( 'jquery', array(), null, true  ); 

  return;
}
add_shortcode( 'cool_slideshow', 'get_slideshow' );
8
Dave Romsey

管理UI変数を確認する

1つのメニュー項目は特別な場合です。コメントは、add_WHATEVER_(submenu)page() APIを使用して登録されるため、コメントです。

// All need to be stated as beeing global
global $pagenow, $typenow, $hook_suffix, $parent_file, $submenu_file, $post_type_object;
if ( 'THE-OUTPUT.php' === $WHATEVER_YOU_CHOOSE_TO_CHECK )
    // do stuff

これらは一貫性がなく、wpコアにハードコードされています。すべてのページにすべてが設定されているわけではないことに注意してください。

ページ固有の管理UIフックにフックする

それから、admin-footer.phpadmin-header.phpで見ることができる特別な、ページ特有のフックもあります:

// Examples:
// Header
"admin_head-$hook_suffix"
"admin_print_styles-$hook_suffix"
"admin_print_scripts-$hook_suffix"
// Footer
"admin_footer-$hook_suffix"

実社会でのいくつかの例:ポストスクリーン

// Examples how the result looks like
admin_print_styles-post.php
admin_print_styles-post-new.php

それからあなたがあなたの行動を夢中にしている時に、あなたがスクリプトをキューに入れるためにあなたがチェックすることができる$hook_suffixもあります:

do_action( 'admin_enqueue_scripts', $hook_suffix );

更新

このデータ/情報に簡単に(1クリックで)アクセスするために、 "(WCM)Current Admin Info" という名前の自由に利用できる開発者向けのプラグインを作成しました。 GitHub にあります。プラグインは近い将来 公式のwp.orgリポジトリ にもあります。

スクリーンショット

このプラグインで何が得られるのかをプレビューするには:

Screen

Hooks

Globals

2
kaiser

(header.phpの)行に沿って何かをすることができます:

<?php
        if ( have_posts() && ( is_page() || is_single() ) ) {
            $content = get_the_content(the_post());
            if ( stripos( $content , '[your-shortcode') ) { function_for_scripts(); } 
        }   
?>

現在の読み込みがページか投稿かを確認してから、コンテンツを取得して自分のショートコードを検索します。それが見つかると、それはあなたの機能を実行します。

0
Noel Tock

最も簡単な方法はショートコードをチェックすることです。

function your_scripts()
{ 
    global $post;
    wp_register_script('your-script',$the_path_to_your_script,'0.1',true);
    if ( strstr( $post->post_content, '[your-shortcode' ) ) 
    {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'your_scripts');
0
matchdav

@kaiserは get_shortcode_regex() にこのスレッドで何度か言及しました、私はそれをどのように使用するかの例をあげることを考えました。コードはほとんどget_shortcode_regex() WordPressコードリファレンスページから引用されています。

function enqueue_script_if_shortcode_is_detected() {
    global $post;

    wp_register_script( 'your-script', $the_path_to_your_script, '1.0', true );

    $pattern = get_shortcode_regex();

    if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'your-shortcode', $matches[2] )
    ) {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_script_if_shortcode_is_detected' );
0
Nicolai