web-dev-qa-db-ger.com

wp_register_script (... $ in_footer = true) funktioniert nicht

Ich möchte einige Javascript-Dateien in meine Fußzeile laden. Ich habe versucht, es in functions.php so zu erreichen:

function my_init() {
        // LOAD JQUERY
        wp_deregister_script('jquery');
        wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',$deps = array(),$in_footer = true);
        wp_enqueue_script('jquery');

        // LOAD STUTS
        wp_register_script('stuts',get_bloginfo('template_url') . '/js/spss-tutorials-custom-functions.js',$deps = array('jquery'),$in_footer = true);
        wp_enqueue_script('stuts');

        // CONDITIONALLY LOAD MATHJAX
        wp_register_script('mathjax','//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML',$deps = array(),$in_footer = true);
        $url = explode('?', 'http://'.$_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
        $ID = url_to_postid($url[0]);
        $mathjax = get_post_meta($ID,'mathjax',true);
            if($mathjax == 'y'){
                wp_enqueue_script('mathjax');
            }
}

add_action('init', 'my_init');

Alle Skripte werden jedoch weiterhin in meinem Header geladen.

Ich habe die Lösungen hier , hier und hier ausprobiert, aber sie haben das Problem nicht gelöst.

Ichtuehabe

<?php wp_footer(); ?>
</body>

in meiner footer.php Datei. Irgendwelche Vorschläge?

1
RubenGeert

Wählen Sie den richtigen Ort in (Render-) Zeit

Zunächst legen Sie bei init fest, während Sie Ihren Rückruf zu wp_enqueue_script hinzufügen möchten.

Beispiel:

add_action( 'wp_enqueue_script', function() {
    wp_deregister_script( 'jquery' );
    // Rest of logic
} );

Mit core auf dem Laufenden bleiben

Möglicherweise möchten Sie auch die korrekte Version verwenden, die der Core verwendet. Ich weiß, das ständige Anschauen ist umständlich und niemand möchte Vermögenswerte/Abhängigkeiten überwachen. Zum Glück können Sie die Informationen verwenden, die bereits im Kern vorhanden sind. Gleiches gilt für die benötigten Abhängigkeiten eines Assets. Beispiel:

add_action( 'wp_enqueue_script', function() {

    $version      = $GLOBALS['wp_scripts']->registered['jquery']->ver;
    $protocol     = 'sprintf( 'http%s://', is_ssl() ? 's' : '' );
    $dependencies = $GLOBALS['wp_scripts']->registered['jquery']->deps;

    wp_enqueue_script( 
        'jquery',
        "{$protocol}cdn.example.com", 
        $dependencies,
        $version,
        TRUE
    );
} );

Verschieben Sie registrierte Skripte in die Fußzeile

Es gibt auch eine einfachere Möglichkeit, ein bereits registriertes Skript in die Fußzeile zu verschieben: Bearbeiten Sie die Informationen direkt in der Skriptregistrierung. Betrachten Sie das folgende Plugin (MU):

<?php
/* Plugin Name: Moves registered scripts to the footer */
add_action( 'wp_enqueue_scripts', function() {
    foreach ( apply_filters( 'wp_scripts.footer', [] as $script )
        $GLOBALS['wp_scripts']->add_data( $script, 'group', 1 );
}, PHP_INT_MAX -1 );

Jetzt können Sie einfach ein Array an den obigen Filter anhängen und die Skripte in die Fußzeile verschieben:

add_filter( 'wp_scripts.footer', function( Array $scripts ) {
    return [ 
        'jquery', 
        # Other scripts
    ];
} );

Zusätzliche Notizen konnte ich nicht mehr aufschreiben ...

Es gibt auch mehrere sehr merkwürdige (aber funktionierende) Dinge an Ihrem Code zu beachten:

  • Sie weisen Variablen zu, wenn Sie sie nicht benötigen. Insbesondere bei einem Funktionsaufruf ist es nicht erforderlich, myFunction( $var = 'foo' ) zu verwenden. Einfach den Wert hinzufügen und fertig.
  • Wenn Sie //url.tld/script.js verwenden, kann der Client die Route bestimmen: HTTPS vs HTTP. Dies kann für verteilten Code in Ordnung sein (selbst dann ist es besser, das Protokoll im Voraus abzurufen und zu verwenden). Wenn Sie jedoch wissen, wie Sie Ihre Site bedienen, verwenden Sie es einfach. Es ist schneller und wenn HTTPS verfügbar ist, dann um Himmels willen: Verwenden Sie es!
  • Die Registrierung von WP Kernskripten nicht aufheben. Benutze sie. Sie werden für angemeldete Personen zwischengespeichert, die sich bereits in ihren Clients/Browsern befinden. Für alle anderen liefern Sie eine single kompatible Version.
  • Sich auf $_SERVER zu verlassen ist nur in Ordnung, wenn Ihr Skript immer nur über einen Client ausgeführt wird. In der Befehlszeile ist die Verwendung von Daten aus diesem Array nicht zuverlässig. In einigen Fällen ändert es sich, in anderen ist es nicht gesetzt. WP verfügt über einige Fallbacks, die Sie stattdessen verwenden können.
1
kaiser