web-dev-qa-db-fra.com

add_action dans une fonction, est-ce possible?

J'essaie d'ajouter quelques js à la tête en utilisant add_action('wp_head', 'js_func'); qui fonctionne juste après la fonction. Cependant, je ne veux pas qu'elle soit affichée sur toutes les pages, mais uniquement sur la page pour laquelle il est pertinent et j'essaie de le faire comme

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

Cependant, quand il s'appelle comme si le js n'est pas placé du tout, casser la page.

Est-il possible de faire cela?

4
Joshua

Si vous voulez savoir si vous êtes sur une page, une publication, une archive de catégorie, etc., alors le noyau doit offrir Balises conditionnelles pour cela.

Si vous souhaitez associer une définition de script js, la meilleure façon de procéder est la suivante:

// 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' );

EDIT

Vous pouvez résumer/rassembler toutes vos petites fonctions, qui sont accrochées quelque part et placer les appels add_action dans une fonction qui est chargée sur le premier hook disponible pour les thèmes: after_setup_theme. L'important est que les thèmes enfants functions.php soient chargés en premier, puis les thèmes parents, puis le crochet after_setup_theme. Vous pouvez donc laisser la possibilité de changer des choses de l'intérieur de votre thème parent ou enfant.

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>";
}

Mais pour répondre à votre question: oui, vous pouvez appeler chaque fonction globale dans une autre fonction.

5
kaiser