wp_add_inline_script без зависимостей
У меня есть фрагмент JavaScript, который я хочу внедрить в подвал страницы. Это код отслеживания, скажем, похожий на Google Analytics. У него нет зависимостей, это автономный фрагмент.
Я могу сделать что-то вроде этого
function render_tracking_code(){
wp_enqueue_script( 'depends-js', 'https://rdiv.com/dummy.js', array(), '0.01', true );
wp_add_inline_script( 'depends-js', 'aWholeBunchOfJavascriptCode' );
}
add_action( 'wp_enqueue_scripts', 'render_tracking_code' );
Выглядит немного глупо (dummy.js - это пустой файл), но работает. Есть ли способ обойти зависимость?
wp_add_inline_style() - без зависимостей
Функцию wp_add_inline_style() можно использовать без зависимости от исходного файла.
Вот пример от @Flix:
wp_register_style( 'dummy-handle', false );
wp_enqueue_style( 'dummy-handle' );
wp_add_inline_style( 'dummy-handle', '* { color: red; }' );
где мы подключим это через действие wp_enqueue_scripts.
wp_add_inline_script() - без зависимостей
Согласно тикету #43565, аналогичная функциональность будет поддерживаться для wp_add_inline_script() в версии 4.9.95.0 (спасибо @MarcioDuarte, @dev101 и @DaveRomsey за проверку в комментариях):
wp_register_script( 'dummy-handle-header', '' );
wp_enqueue_script( 'dummy-handle-header' );
wp_add_inline_script( 'dummy-handle-header', 'console.log( "header" );' );
что выведет следующее в заголовке, т.е. между тегами <head>...</head>:
<script type='text/javascript'>
console.log( "header" );
</script>
Для вывода в подвале:
wp_register_script( 'dummy-handle-footer', '', [], '', true );
wp_enqueue_script( 'dummy-handle-footer' );
wp_add_inline_script( 'dummy-handle-footer', 'console.log( "footer" );' );
По умолчанию входной аргумент $position в wp_add_inline_script() имеет значение 'after'. Значение 'before' выводит скрипт выше, чем 'after'.
Функция wp_add_inline_script() без зависимостей все еще рассматривается для версии 4.9.9, но это не означает, что она точно будет добавлена. Поэтому разумно подождать подтверждения перед использованием этой функции.
Marcio Duarte
Функция готова к использованию начиная с WP 5.0.
Dave Romsey
Кто-то удалил мой комментарий отсюда (я подтверждал ответ birgire о том, что это действительно работает в WP 5.0+), и через месяц мне снова понадобился этот код. Я погуглил, нашел этот ответ, бегло просмотрел, не обнаружил своего комментария и перешел к другим результатам. Через час я вернулся сюда, осознав, что это именно тот ответ, который я искал! Модератору: пожалуйста, НЕ УДАЛЯЙТЕ мои полезные комментарии, они служат МНЕ в качестве будущих ссылок и напоминаний, а не только другим. Спасибо.
dev101
Обновление: Начиная с версии 5.0, WordPress добавил поддержку добавления встроенных скриптов и стилей без зависимостей. Подробности реализации смотрите в ответе @birgire.
При использовании wp_add_inline_script(), в конечном итоге для вывода встроенных скриптов будет использоваться WP_Scripts::print_inline_script(). По замыслу разработчиков, print_inline_script() требует наличия корректной зависимости — $handle.
Поскольку в данном случае зависимость отсутствует, wp_add_inline_script() не подходит для решения задачи. Вместо создания фейковой зависимости (и нежелательного дополнительного HTTP-запроса) используйте хуки wp_head или wp_footer для вывода встроенного скрипта:
add_action( 'wp_head', 'wpse_add_inline_script' );
function wpse_add_inline_script() {
echo '<script>' . PHP_EOL;
// aWholeBunchOfJavascriptCode
echo '</script>' . PHP_EOL;
}
Как правило, JavaScript-код следует добавлять в .js-файл и подключать с помощью wp_enqueue_script() на хуке wp_enqueue_scripts. Данные можно передать в скрипт с помощью wp_localize_script(). Однако в некоторых случаях может потребоваться добавить скрипт непосредственно в код страницы.
Один из способов сделать это — создать функцию, которая выводит ваш скрипт внутри тега <script>, и подключить её к действию wp_print_footer_scripts. Важно экранировать всё, что вы не контролируете строго, но в целом это безопасный и простой метод.
Например:
add_action( 'wp_print_footer_scripts', function () {
?>
<script>
(function myFunction() {
/* ваш код здесь */
})();
</script>
<?php
} );