it-swarm.com.de

Skript nur einreihen, wenn Shortcode verwendet wird, mit WP Plugin Boilerplate

Ich baue ein Plugin mit dem WordPress Plugin Boilerplate von DevinVinson .

Alles funktioniert gut, bis auf eine Sache:

Ich versuche, Skripte und CSS nur dann in die Warteschlange zu stellen, wenn auf der Seite ein Shortcode vorhanden ist.

In der Funktion define_public_hooks habe ich dem Loader einen Aufruf hinzugefügt, um Skripte zu registrieren, anstatt sie in die Warteschlange zu stellen:

private function define_public_hooks() {
    // ...
    $this->loader->add_action( 'wp_register_script', $plugin_public, 'register_styles' );
    $this->loader->add_action( 'wp_register_script', $plugin_public, 'register_scripts' );
    // ...
}

Dann habe ich in der Datei class-my-plugin-public.php zwei öffentliche Funktionen register_styles() und register_scripts() erstellt. Innerhalb dieser Funktionen registriere ich nur Skripte und Stile, anstatt sie in eine Warteschlange zu stellen. Es ist etwas Grundlegendes, so:

public function register_scripts() {    
    wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key .'&v=3&libraries=places', array( 'jquery' ), '3', true );
}

Dann möchte ich sie in die Shortcode-Return-Funktion einreihen, aber sie werden überhaupt nicht registriert.

Ich habe wp_script_is( $this->plugin_name . '_google_maps_api', 'registered' ) überprüft und es wird false zurückgegeben.

Wenn ich das gleiche Material mache, aber mit enqueue anstelle von register, funktioniert alles einwandfrei.

Irgendeine Idee warum?

4
bluantinoo

Warum es nicht funktioniert:

Sie müssen den wp_enqueue_scripts Aktions-Hook verwenden. Sie haben wp_register_script als Aktions-Hook verwendet. Es gibt jedoch keinen Aktions-Hook mit dem Namen wp_register_script in WordPress Core.

Wenn dies nur ein dummer Fehler war, dann haben Sie bereits die Antwort. Lesen Sie weiter, wenn Sie weitere Informationen zum Thema benötigen:


Das Anhängen einer Rückruffunktion an wp_enqueue_scriptsAktions-Hook bedeutet nicht, dass Ihre Skripte und Stile in die Warteschlange gestellt werden. Es bedeutet lediglich, dass Sie diese Rückruffunktion ausführen möchten.

Die ursprüngliche Registrierung und Einreihung erfolgt durch Funktionen wie: wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style() usw., nicht durch einen hook .

Beachten Sie den Unterschied zwischen der Rolle von Funktionen und Hooks:

  • Eine Funktion führt beim Aufruf einen CODE aus, um vordefinierte Aufgaben auszuführen.

    Beispiel: Dies sind alles WordPress-Kernfunktionen: wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style().

  • Ein hook fügt nur eine aufrufbare Funktion (die später ausgeführt wird) an einem vordefinierten Punkt der CODE-Ausführung hinzu.

    Beispiel: Dies ist ein WordPress-Core-Hook (Aktion): wp_enqueue_scripts - Beachten Sie die s (Plural) am Ende.

    Double Check:wp_enqueue_script() ist eine Funktion und wp_enqueue_scripts ist ein Aktions-Hook.

Der richtige Code:

Ihr korrigierter CODE sollte also lauten:

private function define_public_hooks() {
    // ...
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_styles' );
    $this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_scripts' );
    // ...
}

Dann,

public function register_scripts() {
    wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true );
}

Danach rufen Sie das Skript (& style) in Ihrer Shortcode-Handler-Funktion auf:

public function your_shortcode_handler( $atts ) {
    // shortcode related CODE
    wp_enqueue_script( $this->plugin_name . '_google_maps_api' );
    // more shortcode related CODE
}

Mit diesem CODE werden Ihre Skripte/Stile, die sich in der Funktion your_shortcode_handler befinden, nur dann zu Ihrer Site hinzugefügt, wenn in dieser bestimmten URL ein Shortcode vorhanden ist.

Weitere Lektüre:

Diese Antwort hat eine interessante Diskussion zum Einreihen von Skripten und Stilen nur, wenn ein Shortcode vorhanden ist.

6
Fayaz

Das Problem ist also, dass das erste Argument für den Aufruf von add_action ein WordPress Aktionsname sein muss ... "wp_register_script", also keine WP -Aktion, wird niemals aufgerufen.

Ich würde vorschlagen, alles, was Sie wirklich tun müssen, ist, Ihre registrierenden Aufrufe zur enqueue_scripts-Funktion Ihres Plugins hinzuzufügen - Sie müssen sich nicht mit define_public_hooks herumärgern oder eine neue register_scripts-Funktion erstellen. Gehen Sie einfach mit der vorhandenen enqueue_scripts-Funktion, aber fügen Sie Ihre Registrierungen dort hinzu:

public function enqueue_scripts() {
    wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/plugin-name-public.js', array( 'jquery' ), $this->version, false );

    // NOTICE this is a *registration* only:
    wp_register_script( $this->plugin_name.'_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true ); 
}

Wenn Sie dann Ihren Funktionscode eingegeben haben, sollte Ihr Skript registriert sein und in die Warteschlange gestellt werden.

Hoffe das hilft!

0
MacPrawn