Сценарий постановки в очередь только при использовании шорткода с шаблоном плагина 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
все работает нормально.
Есть идеи, почему?
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-адресе.
Дальнейшее чтение:
В этом ответе содержится интересное обсуждение сценариев и стилей постановки в очередь только при наличии шорткода.
Таким образом, проблема в том, что первым аргументом для вызова 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 );
}
Затем, когда ваш короткий код, ваш скрипт должен быть зарегистрирован, готовый к постановке в очередь.
Надеюсь, это поможет!