Как добавить JavaScript-сниппет в футер, который требует jQuery
Я знаю, что могу добавить файл скрипта в футер wordpress, который требует jquery, используя этот код:
<?php
function my_scripts_method() {
// регистрируем расположение скрипта, зависимости и версию
wp_register_script('custom_script',
get_template_directory_uri() . '/js/custom_script.js',
array('jquery'),
'1.0',
true);
// подключаем скрипт
wp_enqueue_script('custom_script');
}
add_action('wp_enqueue_scripts', 'my_scripts_method');
?>
Но что если я хочу добавить обычный сниппет jquery непосредственно в код, а не в файл. Как это можно сделать?
Редактирование
Я знаю, что могу использовать этот скрипт для добавления чего-либо в футер:
<?php
function myscript() {
?>
<script type="text/javascript">
// Это зависит от jquery
</script>
<?php
}
add_action('wp_footer', 'myscript');
Но как указать, что используемый скрипт требует jquery для работы?

Самый простой способ сделать это — это комбинация функций wp_enqueue_script
и действий в футере, о которых уже упоминали Saif и v0idless. Я часто использую jQuery в своих темах и плагинах, но при этом помещаю все остальные скрипты в футер.
Лучший способ добавить скрипты в очередь выглядит так:
function myscript() {
?>
<script type="text/javascript">
if ( undefined !== window.jQuery ) {
// скрипт, зависящий от jQuery
}
</script>
<?php
}
add_action( 'wp_footer', 'myscript' );
function myscript_jquery() {
wp_enqueue_script( 'jquery' );
}
add_action( 'wp_head' , 'myscript_jquery' );
Но этот фрагмент кода предполагает, что именно вы добавляете скрипт в очередь, то есть делаете это в своём собственном плагине или теме.
На данный момент нет способа добавить встроенный скрипт в футер WordPress и одновременно загрузить его с зависимостями. Но есть альтернатива, если вы готовы её рассмотреть.
Альтернативный вариант
Когда WordPress работает со скриптами, он загружает их во внутренний объект для отслеживания. В этом объекте есть три основных списка:
- зарегистрированные (registered)
- в очереди (queue)
- выполненные (done)
- ожидающие выполнения (to_do)
Когда вы впервые регистрируете скрипт с помощью wp_register_scripts()
, он помещается в список зарегистрированных. Когда вы вызываете wp_enqueue_script()
, скрипт копируется в очередь. После того как он выводится на страницу, он добавляется в список выполненных.
Таким образом, вместо того чтобы добавлять ваш футерный скрипт в очередь с зависимостью от jQuery, вы можете задокументировать, что он должен использовать jQuery, и просто программно проверить, загружен ли jQuery.
Для этого используется функция wp_script_is()
, чтобы проверить, в каком списке находится скрипт.
function myscript() {
if( wp_script_is( 'jquery', 'done' ) ) {
?>
<script type="text/javascript">
// скрипт, зависящий от jQuery
</script>
<?php
}
}
add_action( 'wp_footer', 'myscript' );
Вы можете попробовать использовать этот же код для принудительной загрузки jQuery в футере, но я это не тестировал... так что результат может отличаться.

соответствует ли предоставленный вами фрагмент кода стандартам разработки плагинов WordPress? Если да, то я буду использовать его в своем плагине... пожалуйста, дайте ответ по этому поводу...

Последний фрагмент? Нет. Плагины WordPress всегда должны подключать скрипты через систему очередей. Принудительная загрузка jQuery вне этой системы — это то, что вы можете делать только на своем собственном сайте, где полностью контролируете окружение. Для плагина это никогда не будет правильным решением.

Начиная с WordPress 4.5 вы можете добавлять встроенные скрипты с помощью wp_add_inline_script()
. Чтобы добавить фрагмент JavaScript в подвал (footer), который требует jQuery, этот код поможет вам:
function enqueue_jquery_in_footer( &$scripts ) {
if ( ! is_admin() )
$scripts->add_data( 'jquery', 'group', 1 );
}
add_action( 'wp_default_scripts', 'enqueue_jquery_in_footer' );
function theme_prefix_enqueue_script() {
if(!wp_script_is('jquery', 'done')) {
wp_enqueue_script('jquery');
}
wp_add_inline_script( 'jquery-migrate', 'jQuery(document).ready(function(){});' );
}
add_action( 'wp_enqueue_scripts', 'theme_prefix_enqueue_script' );

Я понимаю, что OP хочет указать требование на jQuery, и авторы WordPress должны были разрешить вставку сниппетов рядом с файлами скриптов, но они этого не сделали, поэтому я не рекомендую пытаться форсировать это. Если вы, как и я, не хотите возиться с очередью или её порядком (потому что использую другие плагины, которые объединяют и оптимизируют скрипты), то решение действительно заключается в использовании хука wp_footer
следующим образом:
<?php
add_action(
'wp_footer'
, function() {
?>
<script>
if (window.jQuery) {
// ваш сниппет
}
</script>
<?php
}
, 21 # после подключенных скриптов в футере
);

Вы можете использовать действие wp_footer
для этого. Ознакомьтесь с кодексом для wp_footer.

Я понимаю, но как можно указать, что добавляемый в футер скрипт зависит от jQuery. Посмотрите мою правку, чтобы быть более конкретным.

Вы вообще утруждаетесь читать документацию, прежде чем минусовать ответы людей? Вы когда-нибудь читали про аргумент in_footer
в wp_enqueue_script
? Вот почитайте: http://codex.wordpress.org/Function_Reference/wp_enqueue_script. Там объясняется, как использовать его с действием wp_footer
.
