web-dev-qa-db-de.com

add_action in einer Funktion, ist das möglich?

Ich versuche, einige js mit add_action('wp_head', 'js_func'); zum Head hinzuzufügen, was funktioniert, wenn es direkt nach der Funktion gepostet wird. Ich möchte jedoch nicht, dass es auf jeder Seite gepostet wird, nur auf der Seite, für die es relevant ist, und ich versuche, es so zu tun

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

Wenn es jedoch so heißt, wird das js überhaupt nicht platziert, wodurch die Seite zerstört wird.

Ist das möglich?

4
Joshua

Wenn Sie herausfinden möchten, ob Sie sich auf einer bestimmten Seite, in einem Beitrag, in einem Kategoriearchiv usw. befinden, bietet Ihnen core Bedingte Tags dafür an.

Wenn Sie eine js-script-Definition einbinden möchten, ist der folgende Weg der bessere:

// 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

Sie können all Ihre kleinen Funktionen, die irgendwo hängen bleiben, zusammenfassen/sammeln und die add_action-Aufrufe in eine Funktion einfügen, die beim ersten Hook geladen wird, der für Themen verfügbar ist: after_setup_theme. Wichtig ist, dass zuerst die untergeordneten Themes functions.php geladen werden, dann die übergeordneten Themes und dann der Hook after_setup_theme. So können Sie sich die Möglichkeit eröffnen, Dinge aus Ihrem Eltern- oder Kinderthema heraus zu ändern.

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

Aber um Ihre Frage zu beantworten: Ja, Sie können jede globale Funktion innerhalb einer anderen Funktion aufrufen.

5
kaiser