Когда следует использовать wp_register_script() с wp_enqueue_script() против простого wp_enqueue_script()?
У меня возникли трудности с пониманием, когда нужно использовать wp_register_script(). В настоящее время я просто использую что-то вроде:
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
function enqueue() {
$handle = 'some-handle'; // некоторый идентификатор
$js = 'http://example.com/my.js';
wp_register_script( $handle, $js );
wp_enqueue_script( $handle );
}
Я много читал (Codex, блоги и т.д.), но не могу точно понять, когда я должен сначала регистрировать скрипт, а когда просто ставить его в очередь. Например, я заметил, что тема TwentyTwelve не регистрирует стили или скрипты, а просто ставит их в очередь.
На странице Codex для wp_register_script() буквально сказано:
Безопасный способ регистрации JavaScript-файлов в WordPress для последующего использования с
wp_enqueue_script().
Это означает, что если вы хотите зарегистрировать свои скрипты, но не загружать их напрямую на страницах, вы можете зарегистрировать файлы один раз, а затем загружать их, когда они понадобятся.
Например:
У вас есть оператор switch, который загружает некоторую функциональность, но два из трех случаев требуют определенного JavaScript-файла, а один — нет. Вы можете добавлять скрипт в очередь каждый раз, что потребляет больше ресурсов, или добавлять его только при необходимости:
...
wp_register_script( 'my-handy-javascript', ... );
...
switch( $somevar ) {
case 'value':
wp_enqueue_script( 'my-handy-javascript' ); // требует файл
...
break;
case 'value2':
wp_enqueue_script( 'my-handy-javascript' ); // требует файл
...
break;
default:
case 'value3': // не требует файл
...
break;
}
Не обязательно регистрировать скрипт, а затем добавлять его в очередь, но это может добавить логики в ваш код, если вы регистрируете все необходимые скрипты где-то в functions.php, а не по всему коду.
Codex также сообщает следующее:
Используйте действие
wp_enqueue_scriptsдля вызова этой функции илиadmin_enqueue_scriptsдля вызова в административной части.
Это означает, что если вы хотите добавить ваш скрипт в очередь как на фронтенде, так и в бэкенде, вы можете зарегистрировать скрипт один раз, а затем загрузить его на фронтенде с помощью wp_enqueue_script и в бэкенде с помощью admin_enqueue_script.
Таким образом, у вас не будет дублирования кода для добавления в очередь в одной теме, плагине, виджете или чем-то еще.
Спасибо. Теперь стало намного понятнее. Так ты думаешь, что TwentyTwelve не заморачивается с регистрацией сначала, поскольку точно собирается их загрузить?
akTed
Это вполне возможно. Я не знаю, как устроена тема Twenty Twelve, так как никогда её не использовал, но у них наверняка есть причины использовать enqueue вместо register.
Mike Madern
Насколько я понимаю, функция register технически не является обязательной, она существует просто для удобства: чтобы сохранить немного времени на написание кода. Если это так, то в документации это должно быть чётко указано.
Jan-Philip Gehrcke
В этом смысле я не согласен с утверждением "Вы можете подключать скрипт каждый раз, что требует больше ресурсов, или подключать его только когда нужно". В вашем примере кода, вы могли бы убрать вызов register и вместо этого использовать несколько эквивалентных полных вызовов (с аргументом $src) функции wp_enqueue_style(). Это потребовало бы больше печатать, но не привело бы к увеличению потребления ресурсов. Верно?
Jan-Philip Gehrcke
Значит ли это, что для загрузки скриптов или CSS файлов необходимо использовать функции wp_enqueue_scripts или wp_enqueue_style, с функцией register или без неё?
Lai32290
Один момент, который упустили все объяснения до сих пор — вы можете использовать wp_register_script() просто для регистрации скрипта, чтобы он мог быть использован как зависимость для других скриптов и загружаться только с ними, без прямого вызова enqueue.
JHoffmann
Хотя это объяснение достаточно понятное, я бы рекомендовал также прочитать этот ответ.
lowtechsun
Что действительно абсурдно, так это то, что вам приходится регистрировать скрипт, например, в wp_enqueue_scripts, что не имеет смысла, если вы хотите сделать всё правильно и зарегистрировать все свои ресурсы, чтобы они были доступны для всего остального (например, в качестве зависимостей). Неееет... Вам придётся использовать один или несколько из тех же 3 хуков (один для фронтенда, один для бэкенда и один для экрана входа). Так что у вас будет wp_register_script(), за которым сразу же последует использование этого зарегистрированного скрипта. Не так уж элегантно, правда? Что, на мой взгляд, лишает смысла существование двух отдельных функций.
XedinUnknown
К вашему сведению, admin_enqueue_script не является функцией/хуком WordPress. Но admin_enqueue_scripts — это хук WordPress, который может загружать подключённые JavaScript или CSS файлы — см.:
https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/
risingPhoenix1979
Я изучил несколько статей и пришел к следующим выводам. Думаю, это будет полезно.
- Регистрация скриптов с помощью
wp_register_script()— это только регистрация, а не их загрузка. Зарегистрированный скрипт не будет загружен, пока он не будет добавлен в очередь с помощьюwp_enqueue_script(). - Нет необходимости регистрировать и добавлять в очередь каждый скрипт одновременно. Достаточно просто добавить их в очередь. Регистрация не является обязательной, так как функция
wp_enqueue_script()автоматически регистрирует скрипт. Однако регистрация необходима в следующих случаях:
a. Предположим, скрипт должен загружаться в нескольких местах, например, и на фронтенде, и в админке. В этом случае можно зарегистрировать скрипт один раз, а затем добавить его в очередь отдельно для фронтенда и админки. Важно понимать, что добавление в очередь означает загрузку, а регистрация — нет. Если не регистрировать скрипт, он будет автоматически регистрироваться каждый раз при добавлении в очередь. С другой стороны, если зарегистрировать его один раз, он будет зарегистрирован единожды, независимо от количества вызовов
wp_enqueue_script().b. Если скрипт нужен как зависимость для других скриптов, его не обязательно добавлять в очередь через
wp_enqueue_script(). Достаточно зарегистрировать его с помощьюwp_register_script(), и он будет автоматически загружен, когда его имя (handle) укажут в зависимостях других скриптов, добавленных черезwp_enqueue_script().c. Если скрипт должен загружаться по необходимости, а не сразу, его можно просто зарегистрировать для последующего использования. Пример такого случая описан выше.
Примечание: Насколько я понимаю, аналогичные выводы можно сделать и для CSS-стилей. То есть функции wp_register_style() и wp_enqueue_style() работают аналогичным образом.
Обратите внимание, что эти выводы основаны на моем собственном анализе. Если я ошибаюсь, пожалуйста, поправьте меня. Возможно, у вас есть другое, более точное понимание. Если это так, поделитесь им с нами. Кто знает, может, ваш вариант окажется лучшим. Как говорится, «Сколько людей, столько и мнений» :)
https://ansrthemeaction.blogspot.com/2019/11/wpregisterscript-when-to-use.html
Ваше объяснение — лучшее из всех, что я читал. Теперь я понимаю, почему важно регистрировать скрипты. Спасибо!
Eje
Это самый полезный ответ, который я когда-либо читал. Спасибо.
Thiago Santos
По моему мнению, главное преимущество использования wp_register_script перед wp_enqueue_scripts хорошо проиллюстрировано в следующем абзаце из Кодекса:
Скрипты, предварительно зарегистрированные с помощью wp_register_script(), не требуют ручного добавления через wp_enqueue_script(), если они указаны как зависимости другого подключаемого скрипта. WordPress автоматически включит зарегистрированный скрипт перед тем, как подключит основной скрипт, который указал его хэндл в качестве зависимости.
Если вы считаете, что вам это не нужно (например, потому что вы на 100% уверены, что ваш скрипт не будет участвовать в каких-либо зависимостях), вы можете сразу использовать wp_enqueue_scripts, без предварительного wp_register_script.
Я считаю, что последний абзац (о том, что не нужно регистрировать скрипт, если вы "на 100% уверены, что ваш скрипт не будет участвовать в каких-либо зависимостях") неверен. На мой взгляд, правильная формулировка — вам не нужно регистрировать скрипт, только если вы уверены, что собираетесь загрузить его в любом случае. Функция enqueue неявно регистрирует ваш скрипт, поэтому другие скрипты могут зависеть от него, даже если вы только добавили его в очередь.
epeleg