Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую! eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Очередность вызова хуков

Получаю строку в JS из PHP.
Строка идет как аргумент из do_action().
Суть: почему функция my_fullcalendar() вызывается два раза, причем второй раз строка имеет нулевую длину (в HTML падает вот это:

const php_vars = ""

). А при первом вызове, когда аргумент есть, wp_add_inline_script() не отрабатывает!.
То есть, add_action() отрабатывает и без do_action() и, соответственно, без аргумента.

add_action('rcl_enqueue_scripts','my_fullcalendar',10,1);

function my_fullcalendar($var){
	rcl_enqueue_script('calend_scripts', rcl_addon_url( 'js/fullCalendar.js', __FILE__ ),false,true);
	wp_add_inline_script('calend_scripts', 'const php_vars = ' . '"' . $var . '"', 'before' );
}

do_action('rcl_enqueue_scripts', $arg);
wp_head();

выносил add_action() и my_fullcalendar() в functions.php, тоже самое.

0
lavaekb3
1.6 года назад
  • 2
    Kama 9890

    Скорее всего, проблема возникает из-за того, как работает wp_head() и функция do_action().

    1. Двойной вызов функции: Вероятно, do_action('rcl_enqueue_scripts') вызывается дважды: один раз внутри темы или плагина и второй раз вручную. Это приводит к двойному вызову my_fullcalendar(), при этом во второй раз аргумент $var пустой.

    2. Проблема с wp_add_inline_script(): Функция wp_add_inline_script() добавляет скрипты после регистрации основного скрипта (calend_scripts). Если calend_scripts не зарегистрирован к моменту вызова wp_add_inline_script(), то добавление инлайн-скрипта не сработает.

    Решение

    Попробуйте добавить проверку в my_fullcalendar() и использовать приоритеты wp_head и rcl_enqueue_scripts:

    add_action('rcl_enqueue_scripts','my_fullcalendar', 10, 1);
    
    function my_fullcalendar($var){
    	// Проверяем, чтобы аргумент не был пустым
    	if (empty($var)) return;
    
    	// Подключаем скрипт
    	rcl_enqueue_script('calend_scripts', rcl_addon_url( 'js/fullCalendar.js', __FILE__ ), false, true);
    
    	// Добавляем инлайн-скрипт только если 'calend_scripts' уже зарегистрирован
    	if (wp_script_is('calend_scripts', 'registered')) {
    		wp_add_inline_script('calend_scripts', 'const php_vars = "' . esc_js($var) . '"', 'before' );
    	}
    }
    
    // Вызываем хук с аргументом
    do_action('rcl_enqueue_scripts', $arg);

    Также убедитесь, что do_action('rcl_enqueue_scripts') вызывается только один раз и в нужный момент (например, не дублируется в другом месте кода).

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация