Сценарий постановки в очередь только при использовании шорткода с шаблоном плагина WP


Я создаю плагин, используя шаблон плагина WordPress от DevinVinson.

Все работает нормально, кроме одного:

Я пытаюсь ставить в очередь скрипты и css только тогда, когда на странице присутствует шорткод.

В функции define_public_hooks я добавил вызов загрузчика для регистрации сценариев вместо их постановки в очередь:

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' );
    // ...
}

Затем в файле class-my-plugin-public.php я создал две общедоступные функции register_styles() и register_scripts(). Внутри этих функций я просто регистрируйте сценарии и стили вместо того, чтобы ставить их в очередь. Это что-то базовое, вроде этого:

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 );
}

Затем я хотел бы поставить их в очередь в функции возврата шорткода, но они вообще не регистрируются.

Я проверил с помощью wp_script_is( $this->plugin_name . '_google_maps_api', 'registered' ), и он возвращает false.

Если я сделаю то же самое, но с enqueue вместо register все работает нормально.

Есть идеи, почему?

Author: bluantinoo, 2017-03-10

2 answers

Почему это не работает:

Вам необходимо использовать wp_enqueue_scripts крючок действия. Вы использовали wp_register_script в качестве крючка действия, однако в ядре WordPress нет крючка действия с именем wp_register_script.

Если это была просто глупая ошибка, то у вас уже есть ответ. Читайте дальше, если вам нужна дополнительная информация по этой теме:


Прикрепление функции обратного вызова к wp_enqueue_scripts крючок действия не означает, что ваши сценарии и стили будут поставлены в очередь, это просто означает, когда вы хотите выполнить эту функцию обратного вызова .

Первоначальная регистрация и постановка в очередь выполняются такими функциями, как: wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style() и т.д., а не каким-либо крючком.

Обратите внимание на разницу между ролью функций и крючков:

  • А функция выполняет некоторый КОД для выполнения предопределенных задач при вызове.

    Пример: все это основные функции WordPress: wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style().

  • А крюк только присоединяет вызываемую функцию (которая будет выполнена позже) в заранее определенной точке выполнения КОДА.

    Пример: это крючок ядра WordPress (действия): wp_enqueue_scripts - обратите внимание на s (множественное число) в конце.

    Двойная проверка: wp_enqueue_script() является функцией, а wp_enqueue_scripts - крючком действия.

Правильный КОД:

Так что ваш исправленный КОД должен быть таким:

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' );
    // ...
}

Затем,

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 );
}

После этого вы ставите в очередь скрипт (&стиль) из функции обработчика шорткода:

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

С помощью этого КОДА ваши сценарии/стили, поставленные в очередь из функции your_shortcode_handler, будут добавлены на ваш сайт только при наличии шорткода в этом конкретном URL-адресе.

Дальнейшее чтение:

В этом ответе содержится интересное обсуждение сценариев и стилей постановки в очередь только при наличии шорткода.

 7
Author: Fayaz, 2017-04-13 12:37:50

Таким образом, проблема в том, что первым аргументом для вызова add_action должно быть имя действия WordPress... Таким образом, "wp_register_script", не являющийся действием WP, никогда не вызывается.

Я бы предложил, чтобы все, что вам действительно нужно сделать, это добавить ваши вызовы регистрации в функцию enqueue_scripts вашего плагина - не нужно возиться с define_public_hooks или создавать новую функцию register_scripts. Просто воспользуйтесь существующей функцией enqueue_scripts, но добавьте свои регистрации там:

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 ); 
}

Затем, когда ваш короткий код, ваш скрипт должен быть зарегистрирован, готовый к постановке в очередь.

Надеюсь, это поможет!

 0
Author: nibnut, 2017-03-10 21:10:03