Bedingtes wp_enqueue_script auf einer Seite

7

Aus Effizienzgründen versuchen wir, einige JS-Skripte nur mit einer bestimmten Seitenvorlage eines Themas zu verknüpfen, das ein Formular enthalten soll: page-with-form.php

In der Theme functions.php haben wir eine init_method als solche definiert:

function my_init_method(){

    $dir = get_bloginfo('stylesheet_directory')."/js/jquery.js";
    wp_deregister_script('jquery');
        wp_register_script('jquery',$dir);
    wp_enqueue_script('jquery');

    $dir = get_bloginfo('stylesheet_directory')."/js/jquery.validate.min.js";
    wp_deregister_script('jquery.validate.min');
        wp_register_script('jquery.validate',$dir);
    wp_enqueue_script('jquery.validate.min');

    $dir = get_bloginfo('stylesheet_directory')."/js/funcion.js";
    wp_deregister_script('funcion');
        wp_register_script('funcion',$dir);
    wp_enqueue_script('funcion');
}    

Wir haben dann erwartet, dass wir einfach in der ersten Zeile der Seitenvorlage page-with-form.php (vor get_header ()) hinzufügen können:

add_action('init', 'my_init_method');
  • Ist das nicht möglich
  • Müssen wir der Funktion functions.php eine if-Regel hinzufügen, um festzustellen, dass wir uns auf dieser Seite befinden?

Codeänderungen basierend auf Antworten: Laden Sie auf der Seitenvorlage die Funktion direkt, ohne dass add_action ("init" ...

my_init_method();
...
get_header();
luison
quelle
Zur Verdeutlichung, weil ich glaube, dass die Antwortenden diesen Punkt in Ihrer Frage übersehen haben. Beziehen Sie sich auf das Ausführen des obigen Codes auf einer Seite, an die eine bestimmte Seitenvorlage angehängt ist? (So ​​habe ich den ersten Teil Ihrer Frage gelesen). In diesem Fall wäre es wahrscheinlich idealer, is_page_template()anstelle von is_page()...
t31os
Ja, so oder so würde es funktionieren, aber ich bezog mich auf page_template
luison

Antworten:

7

init ist viel früher als das Laden von Seitenvorlagen und kein geeigneter Ort für Warteschlangen (trotz vieler Tutorials und Dokumente, die es dafür verwenden).

Schließen Sie Ihre Funktion an wp_enqueue_scriptsund stellen Sie sicher, dass Sie diese Verbindung herstellen, bevor Sie wp_head()die Vorlage aufrufen.

Selten
quelle
Verstanden jetzt, da die Seitenvorlage für Init-Aktionen zu spät ist und Sie eine personalisierte Funktion aufgerufen haben. Wir haben jetzt my_init_method () als solches ohne Init-Aktion aufgerufen und es funktioniert. Andere Alternativen zum bedingten Laden, wenn die Seite oder die Seitenvorlage ebenfalls funktionieren sollen, aber wir haben sie nicht getestet.
Luison
@luison Nur die Hooking-Funktion in der Vorlage wird funktionieren, aber gemäß meiner Antwort ist es die beste Vorgehensweise, Warteschlangen an den Hook anzuschließen wp_enqueue_scripts.
Rarst
Und der Punkt ist, dass Sie is_page_template()innerhalb des Rückrufs aufrufen wp_enqueue_scriptsund den korrekten Rückgabewert (wahr / falsch) erhalten können, wobei als init zu früh gewesen wäre, um aufzurufen is_page_template()oder dergleichen. Nur zu klären, falls es nicht klar ist.
t31os
Ich werde den wp_enqueue_scriptsCodex-Eintrag heute aktualisieren , ungefähr zu der Zeit, als diese schlechten Beispiele ersetzt wurden (da dies die Benutzer dazu ermutigt, sich bei init in die Warteschlange zu stellen).
t31os
@ t31os freue mich darauf! Ich bin in letzter Zeit hauptsächlich damit beschäftigt , fehlende Seiten als Funktionsreferenz zu erstellen , sodass keine Auflösung mehr für die Bearbeitung übrig bleibt. :)
Rarst
3

Zusätzlich zur Verwendung des richtigen Hooks (wie von @Rarst hervorgehoben) müssen Sie Ihren Funktionscode nach verschieben functions.phpund den Funktionsinhalt in eine if ( is_page( 'page-with-form' ) )Bedingung einschließen .

Chip Bennett
quelle
Umzug functions.phpnicht wirklich erforderlich. Wenn es bequemer ist, dies in der Vorlage zu behalten, gibt es kein Problem damit.
Rarst
Ich stimme dir nicht zu. aus verschiedenen Gründen gehören Funktionsdefinitionen in functions.php.
Chip Bennett
Ich sage lediglich technische Nuancen und behaupte nicht, dass alles in der Vorlage eine bewährte Methode wäre. Auch als pro Original - Funktionsdefinition Frage selbst ist in functions.php, sie wollen nur Haken Richtlinie Vorlage (die nur gut für mich ist).
Rarst
Ich hätte klarstellen sollen: Das OP gibt an, dass sich der add_action()Aufruf in der Vorlagendatei befindet . das ist derjenige, zu dem verschoben werden sollte functions.php. Aber selbst bei der technischen Nuance von WRT wird die Vorlage an einem anderen Punkt in der Ausführung geladen als beim functions.phpLaden, sodass das Hinzufügen von add_action()Aufrufen in der Vorlagendatei aus technischer Sicht möglicherweise nicht funktioniert , je nachdem, welcher Hook aufgerufen wird.
Chip Bennett
1
Ich bin nicht einverstanden , dass add_action() muss sein in functions.php. Obwohl es gängige (und bewährte) Praxis ist, ist es nicht immer möglich / wünschenswert / einfach, alle Adds zentral zu haben. Ich erwähnte in meiner Antwort, dass es vor dem wp_head()Anruf gestellt werden sollte, wenn es in der Vorlage aufbewahrt wird.
Rarst
3

Beim Laden Ihrer Vorlagendatei haben Sie den 'template_redirect'zu späten Hook bereits übergeben (siehe: Plugin / Action API-Referenz ).

Sie müssen den add_actionAufruf in Ihrer Datei functions.php festlegen , die vor dem after_setup_themeHook geladen wird. Dies ist der erste verfügbare Hook für Themen.

Kaiser
quelle