web-dev-qa-db-ja.com

関数の中でadd_action、それは可能ですか?

私はadd_action('wp_head', 'js_func');を使用して頭にjsを追加しようとしていますが、これは関数の直後に投稿されたときに動作します。

function things_to_do_on_this_page() {
    add_action('wp_head', 'js_func');
    //other functiony things
}

しかし、jsがまったく配置されていないため、このように呼び出されると、ページが壊れます。

これは可能ですか?

4
Joshua

特定のページ、投稿、カテゴリアーカイブなどにいるかどうかを知りたい場合は、 Conditional Tags を提供する必要があります。

Js-scriptの定義をフックしたい場合は、次のようにします。

// Assuming that you drop your js code into a separate file instead of just between <script>-tags

// 1st: Register during init hook
function add_my_script()
{
    wp_register_script( $name, $url, $dependency, filemtime( $path ), true )
}
add_action( 'init', 'add_my_script' );

// 2nd: Enqueue during enqueue hook
function enqueue_my_script()
{
    // Choose your conditions:
    // On Admin, check against "global $hook_suffix, $pagenow, $typenow"
    if ( 'post-new.php' !== $typenow )
        return;
    // On public pages, choose your conditions from the list of Conditional Tags
    // Example: Only on pages
    if ( ! is_page() )
        return;
    // ...Nothing to do on login

    // print the script to the screen
    wp_enqueue_script( $name );
}
// Choose where you need it
add_action( 'wp_enqueue_scripts', 'enqueue_my_script' );
add_action( 'admin_enqueue_scripts', 'enqueue_my_script' );
add_action( 'login_enqueue_scripts', 'enqueue_my_script' );

_編集_

どこかにフックされているすべての小さな関数をまとめて集めることができ、add_action呼び出しをテーマで利用可能な最初のフック:after_setup_themeにロードされる関数に入れることができます。重要なのは、子テーマfunctions.phpが最初にロードされ、次に親テーマ、そしてafter_setup_themeフックがロードされることです。そのため、親や子のテーマの中から変更する可能性を広げることができます。

function theme_bootstrap_fn() 
{
    add_action( 'wp_head', 'js_func' );
    // other functiony things
}
add_action( 'after_setup_theme', 'theme_bootstrap_fn' );

// Define your function:
function js_func()
{
    echo "
        <script type='text/javascript>
            // do stuff
            // Add variables like this:
            {$some_var}
        </script>";
}

しかし、あなたの質問に答えるために:はい、あなたは他の関数の中にすべてのグローバル関数を呼び出すことができます。

5
kaiser