it-swarm.com.de

Wann soll add_action ('init') vs add_action ('wp_enqueue_scripts') verwendet werden?

In der Datei functions.php meines Themas rufe ich eine add_action auf, um ein gewisses Maß an Kontrolle darüber zu erhalten, wo jquery geladen wird (in der Fußzeile zusammen mit den anderen Skripten meines Themas).

Das Problem, das ich habe, ist, dass wenn ich add_action ('wp_enqueue_scripts') verwende, es nur ausgelöst wird, wenn keine Plugins geladen sind. Die Methode add_action ('init') funktioniert jedoch in allen Fällen.

Ich kann mich nicht erinnern warum, aber ich glaube, dass add_action ('wp_enqueue_scripts') in diesem Fall bevorzugt wird. Wenn das stimmt, wie kann ich es in allen Fällen zum Laufen bringen?

In functions.php

//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . '/functions_public.php');   
}

In functions_public.php

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);

wp_enqueue_script('jquery');

}

Die zweite Methode, die add_action ('wp_enqueue_scripts') verwendet, wird anscheinend nicht ausgeführt, wenn ein Plugin vorhanden ist, das Skriptabhängigkeiten zum Thema schreibt.

9
N2Mystic

Viele Plugin-Entwickler machen die Dinge nicht richtig. Der richtige Weg ist, sich mit wp_enqueue_scripts zu verbinden, wie Sie es versuchen.

Hier ist jedoch die Reihenfolge der Haken in einer typischen Anforderung ausgeführt:

  • muplugins_loaded
  • registered_taxonomy
  • registered_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • drin
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_types
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_scripts
  • ... eine Menge mehr

Die Sache ist, dass mehrere Entwickler ursprünglich angewiesen wurden, sich an init zu binden, um ihre Skripte in die Warteschlange zu stellen. Früher, als wir einen wp_enqueue_script-Hook hatten, war dies die "richtige" Methode, um Dinge zu tun, und Tutorials, die die Übung fortsetzen, schweben immer noch im Internet herum und beschädigen ansonsten gute Entwickler.

Meine Empfehlung wäre, Ihre Funktion in zwei Teile aufzuteilen. Führen Sie Ihren wp_deregister_script/wp_register_script im Hook init aus und verwenden Sie den Hook wp_enqueue_scripts, wenn Sie jQuery tatsächlich in die Warteschlange stellen.

Auf diese Weise bleiben Sie in der Welt des richtigen Vorgehens beim Einreihen Ihrer Skripte in die Warteschlange und können sich vor den Hunderten von Entwicklern schützen, die immer noch "daneben gehen", indem Sie jQuery gegen Ihre verkettete Version austauschen, bevor sie sie der Warteschlange hinzufügen .

Sie möchten auch Ihren Hook init mit hoher Priorität hinzufügen:

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}
25
EAMann

Hier gibt es mehrere Probleme, die miteinander zusammenhängen.

  1. Der richtige Aktions-Hook zum Einreihen von Skripten ist wp_enqueue_scripts
  2. Um Skripte in der Fußzeile über wp_enqueue_script() zu drucken, setzen Sie den Parameter $footer auf true
  3. Ihre add_action( $hook, $callback )-Aufrufe sollten in nichts eingeschlossen werden. Lass sie direkt von functions.php ausführen
  4. Sie sollten Ihre is_admin()-Bedingungsprüfungen in Ihren Rückruf einfügen
  5. Sie sollten Core-Bundled-Skripte aus keinem Grund von einem Theme abmelden. Selbst wenn Ihr Ziel die Skriptverkettung ist, ist das Plugin-Gebiet .
  6. Wenn Sie müssen jquery abmelden, dann ist wp_enqueue_scripts zu spät . Teilen Sie Ihren Abmelde-/Registrierungscode in einen Rückruf auf, der mit init verknüpft ist.
  7. Das Aufrufen von other script "jquery" ist wahrscheinlich auch keine gute Vorgehensweise. Ihre bessere Wahl wäre einfach, jQuery zu löschen und dann Ihr benutzerdefiniertes Skript zu laden.
  8. Stellen Sie sicher, dass Ihr Rückruf eine niedrige Priorität hat, damit Sie Plugins überschreiben
  9. Verwende get_template_directory() anstatt TEMPLATEPATH

Alles zusammenfassen:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

Aber nochmal: Das ist wirklich nicht der beste Ansatz. Am besten entfernen Sie einfach die Rückrufe des Plugins add_action (), mit denen Sie die Registrierung von Core-jQuery aufheben.

3
Chip Bennett