Wie werden jQuery- und JavaScript-Dateien korrekt eingebunden?

16

Ich mache es gerade mit dem folgenden Code:

function uw_load_scripts() {
    // De-register the built in jQuery
    wp_deregister_script('jquery');
    // Register the CDN version
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    // Load it in your theme
    wp_enqueue_script( 'jquery' );
}
add_action( 'wp_enqueue_scripts', 'uw_load_scripts' );

Das funktioniert, aber sollte ich das für alle tun, so oder für alle außer dem Administrator (damit das Backend die WordPress-Version verwendet?):

if (function_exists('load_my_scripts')) {  
function load_my_scripts() {  
    if (!is_admin()) {  
    wp_deregister_script( 'jquery' );  
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    wp_enqueue_script('jquery');   
    }  
}  
}  
add_action('init', 'load_my_scripts');

Diese Version funktioniert eigentlich gar nicht, ich bekomme die WordPress jQuery-Version und nicht die Google.

Sollte ich daher die in WordPress enthaltene jQuery abmelden?

Wie füge ich meine eigenen Skripte (Slider-Skripte, modernizr und meine eigenen custom.js) auf die richtige Weise hinzu? Ich denke, ich sollte dies auch über functions.php tun und nicht wie jetzt im Header, aber ich bin mir nicht sicher, wie ich das tun würde.

Johan Dahl
quelle

Antworten:

20

Erste Faustregel: Heben Sie die Registrierung von Core-Bundleskripten auf und ersetzen Sie sie nicht durch andere Versionen , es sei denn, Sie sind sich absolut sicher, dass kein Theme, Plug-In oder Core selbst aufgrund der Versionsänderung beschädigt wird. Wirklich, es sei denn, Sie benötigen unbedingt eine alternative Version eines Kern-gebündelten Skripts, verwenden Sie einfach das, was mit dem Kern gebündelt ist.

Zweitens empfehle ich dringend, sich wp_enqueue_scriptsfür das Registrieren und Einreihen von Skripten anzumelden, anstatt init. (Es funktioniert bei init, aber aus der Perspektive des Zusammenspiels mit anderen ist es am besten, den semantisch korrektesten Hook zu verwenden.)

Drittens verwenden Sie die gleichen Methoden wie oben, um Ihre eigenen benutzerdefinierten Skripts in die Warteschlange einzureihen:

<?php
function wpse45437_enqueue_scripts() {
    if ( ! is_admin() ) {
        $script_path = get_template_directory_uri() . '/js/';
        // Enqueue slider script
        wp_enqueue_script( 'wpse45437_slider', $script_path . 'slider.js', array( 'jquery' ) );
        // Enqueue modernizr script
        wp_enqueue_script( 'wpse45437_modernizr', $script_path . 'modernizr.js', array( 'jquery' ) );
    }
}
add_action( 'wp_enqueue_scripts', 'wpse45437_enqueue_scripts' );
?>

Fügen Sie einfach die Skripte hinzu, die Sie zum Einreihen benötigen.

Chip Bennett
quelle
4
+1 auf das unbedingt nötigste ! Zu viele (normalerweise "Premium") Themen registrieren eine veraltete Version von jQuery. Es bricht Plugins.
Stephen Harris
Das Hinzufügen dieses Skripts zu meiner Funktionsdatei (ohne die PHP-Deklarationen, da diese bereits vorhanden sind) gibt mir einen "HTTP-Fehler 500 (Interner Server-Fehler)". Gibt es irgendwo einen Fehler?
Johan Dahl
Ja; Bei den wp_enqueue_script()Aufrufen ist ein Syntaxfehler aufgetreten .
Chip Bennett
Danke, jetzt funktioniert es! Es wird jedoch weiterhin in der Kopfzeile ausgegeben. Ist es nicht besser wenn es in der Fußzeile steht? Wenn ja, kann ich den Code so ändern, dass er es tut?
Johan Dahl
Sie können sicherlich in der Fußzeile einreihen. Setzen Sie einfach den $in_footerParameter in Ihrem Aufruf von auf true wp_enqueue_script().
Chip Bennett
4

Ich hoffe, das hilft. wp_enqueue_scriptsWeitere Informationen finden Sie im Codex .

  1. Dont verwenden initzu enqueue . Verwenden Sie wp_enqueue_scriptsfür Front-End-Sachen und admin_enqueue_scriptsfür die Admin-Seite. Sie können initjedoch Skripte registrieren .
  2. Der Haken wird wp_enqueue_scriptsnur am Front-End (und nicht auf der Anmeldeseite) ausgelöst, sodass Sie nicht überprüfen müssen is_admin().
  3. Sofern Sie keinen bestimmten Grund haben, etwas anderes zu tun, würde ich vorschlagen, Skripte zu registrieren und in eine Warteschlange zu stellen, die functions.phpfür Themen oder in einem Plug-In verwendet werden. Sie sagen einfach:

     function myprefix_load_scripts() {
       // Load scripts here
     }
     add_action( 'wp_enqueue_scripts', 'myprefix_load_scripts' );
  4. Wenn das Ziel ist, ein Skript wp_enqueue_scriptin die Warteschlange zu stellen, wenn ein Shortcode verwendet wird, möchten Sie ihn möglicherweise im Shortcode-Rückruf verwenden, um ihn nur bei Bedarf in die Warteschlange zu stellen (dies druckt ihn seit 3.3 in der Fußzeile aus ).

  5. Sie sollten die vorhandene jQuery auf der Administratorseite nicht erneut registrieren. Sie können etwas brechen: D.

  6. Plug-Ins sollten die vorhandene jQuery nicht erneut registrieren.

  7. Sie sollten die Vor- und Nachteile einer erneuten Registrierung von jQuery abwägen. Zum Beispiel können einige Plug-Ins beschädigt werden, wenn Sie eine alte Version registrieren (möglicherweise nicht jetzt, aber in Zukunft ...)

Stephen Harris
quelle
1
Ad 5) die erneute Registrierung spielt keine Rolle. Deshalb haben wir die Enqueue- und Register-Funktionen. :)
Kaiser
2

Faire Warnung: Das Abmelden der WP-Paketversion von jQuery zugunsten Ihrer eigenen kann zu Problemen führen, insbesondere wenn Sie nicht besonders vorsichtig sind, um sicherzustellen, dass Sie die Version ändern, auf die Sie zeigen, wenn WP ihre Version aktualisiert. Dies gilt doppelt für Plugins, die häufig (oder zumindest häufig) ihre Plugins schreiben, um maximale Kompatibilität mit der WP-Version von jQuery zu gewährleisten.

Das heißt, Ihre erste Version ist richtig - es ist süchtig nach wp_enqueue_scripts. Ihre zweite Funktion ist mit verknüpft init, weshalb sie möglicherweise nicht richtig funktioniert.

Fügen Sie auf ähnliche Weise Ihre eigenen Skripte hinzu:

function bbg_enqueue_scripts() {
    // You should probably do some checking to see what page you're on, so that your
    // script only loads when it needs to
    wp_enqueue_script( 'bbg-scripts', get_stylesheet_directory_url() . '/js/bbg-scripts.js', array( 'jquery' ) );
}
add_action( 'wp_enqueue_scripts', 'bbg_enqueue_scripts' );

Ich gehe hier davon aus, dass Sie Skripte aus einem jsVerzeichnis in Ihrem aktuellen Themenverzeichnis laden . Ändern Sie den URI-Parameter, wenn dies nicht der Fall ist. Der dritte Parameter array( 'jquery' )besagt, dass dies von bbg-scriptsabhängt jqueryund daher später geladen werden sollte. Weitere Informationen finden Sie unter https://codex.wordpress.org/Function_Reference/wp_enqueue_script .

Boone-Schluchten
quelle
1
if (function_exists('load_my_scripts')) {  
function load_my_scripts() {  
    if (!is_admin()) {  
    wp_deregister_script( 'jquery' );  
    wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', array(), null, false); 
    wp_enqueue_script('jquery');   
    }  
}  
}  
add_action('init', 'load_my_scripts');

Das wird nichts ... Ich vermute, Sie meinen

if (!function_exists('load_my_scripts')) {

In Ihrem Beispiel wird die Funktion load_my_scripts nur geladen, wenn sie bereits vorhanden ist (was nicht der Fall ist und wenn dies der Fall ist, wird ein Fehler verursacht).

Adam
quelle
0

Wenn Sie aus Performancegründen jquery- und andere Core-js-Dateien von einem CDN laden möchten, stellen Sie sicher, dass Sie dieselbe Version laden, um zu verhindern, dass böse Dinge mit Core- und Plugin-Funktionen passieren. So was:

$wp_jquery_version = $GLOBALS['wp_scripts']->registered['jquery-core']->ver;
$jquery_version = ( $wp_jquery_version == '' ) ? '1.8.3' : $wp_jquery_version; // fallback, just in case 
wp_deregister_script('jquery');
wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/'. $jquery_version .'/jquery.min.js', $jquery_version, false );
wp_enqueue_script('jquery');
cjbj
quelle
-2

Nachdem ich alle verschiedenen Methoden zum Laden von jquery überprüft hatte (nicht nur in diesem Beitrag), stellte ich fest, dass keine von ihnen alle diese Methoden ausführt:

  1. Registrieren (und möglicherweise in die Warteschlange stellen) Sie jquery mithilfe einer Funktion, damit sie von Plugins verwendet werden kann.
  2. Laden Sie es von Google CDN mit protokollbezogener URL.
  3. Fallback auf lokale Kopie, wenn Google offline ist.

Es gibt viele alternative Versionen, die einige davon in der Liste tun, aber nicht alle. Deshalb habe ich meine Version geschrieben, indem ich einige der bereits verfügbaren Methoden gekämmt und modifiziert habe. Hier ist es:

function nautilus7_enqueue_scripts() {

    // Load jquery from Google CDN (protocol relative) with local fallback when not available
    if ( false === ( $url = get_transient('jquery_url') ) ) {

        // Check if Google CDN is working
        $url = ( is_ssl() ? 'https:' : 'http:' ) . '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
        $resp = wp_remote_head($url);

        // Load local jquery if Google down
        if ( is_wp_error($resp) || 200 != $resp['response']['code'] ) {

            $url = get_template_directory_uri() . '/js/vendor/jquery-1.7.2.min.js';
        }

        // Cache the result for 5 minutes to save bandwidth
        set_transient('jquery_url', $url, 60*5);
    }

    // Deregister Wordpress' jquery and register theme's copy in the footer
    wp_deregister_script('jquery');
    wp_register_script('jquery', $url, array(), null, true);

    // Load other theme scripts here

}
add_action('wp_enqueue_scripts', 'nautilus7_enqueue_scripts');

Um Bandbreite zu sparen und Google nicht jedes Mal zu pingen, wenn die Seite neu geladen wird, wird mithilfe der Wordpress Transient-API 5 Minuten lang daran erinnert, ob Google CDN online ist oder nicht.

nautilus7
quelle
Nicht empfohlen. Jetzt müssen Sie das Skript nach jedem WordPress-Update aktualisieren, um der genauen jQuery-Version zu entsprechen, die WordPress verwendet. Außerdem kann Google die Bibliothek in einigen Fällen nicht komprimiert senden, sodass Ihre Seite jetzt langsamer geladen wird.
fuxia
Ich benutze keine WordPress-Abfrage. Lesen Sie bitte den Code. Ich verwende die Version des Themas. Und wenn Sie Google nicht mögen, können Sie eine andere CD verwenden.
Nautilus7
Aber das ist der Punkt: Sie sollten die WordPress-jQuery verwenden, um sicherzustellen, dass die Version korrekt ist.
fuxia
Ich folge dir nicht Ich hole mir die Version, die ich benötige, von Google und bündle dieselbe Version mit meinem Theme. So machen es alle. Wordpress kann (im Admin-Bereich) jede Version verwenden, mit der es geliefert wird.
Nautilus7
1
Sie können jede Version von jQuery verwenden, die Sie möchten. Wenn Sie sie jedoch mit einem Thema bündeln, erzwingen Sie dies für Ihre Benutzer. In einigen Jahren, wenn alle Benutzer jQuery 1.8.2 verwenden, werden Ihre Benutzer nicht mehr mit einer veralteten Version arbeiten, es sei denn, sie halten das Thema auf dem neuesten Stand.
Chris_O