Когда следует использовать wp_register_script() с wp_enqueue_script() против простого wp_enqueue_script()?

21 янв. 2013 г., 16:36:50
Просмотры: 49.3K
Голосов: 70

У меня возникли трудности с пониманием, когда нужно использовать 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 не регистрирует стили или скрипты, а просто ставит их в очередь.

0
Все ответы на вопрос 3
9
68

На странице 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.
Таким образом, у вас не будет дублирования кода для добавления в очередь в одной теме, плагине, виджете или чем-то еще.

21 янв. 2013 г. 16:47:19
Комментарии

Спасибо. Теперь стало намного понятнее. Так ты думаешь, что TwentyTwelve не заморачивается с регистрацией сначала, поскольку точно собирается их загрузить?

akTed akTed
21 янв. 2013 г. 17:09:12

Это вполне возможно. Я не знаю, как устроена тема Twenty Twelve, так как никогда её не использовал, но у них наверняка есть причины использовать enqueue вместо register.

Mike Madern Mike Madern
21 янв. 2013 г. 17:14:33

Насколько я понимаю, функция register технически не является обязательной, она существует просто для удобства: чтобы сохранить немного времени на написание кода. Если это так, то в документации это должно быть чётко указано.

Jan-Philip Gehrcke Jan-Philip Gehrcke
16 июн. 2015 г. 23:41:22

В этом смысле я не согласен с утверждением "Вы можете подключать скрипт каждый раз, что требует больше ресурсов, или подключать его только когда нужно". В вашем примере кода, вы могли бы убрать вызов register и вместо этого использовать несколько эквивалентных полных вызовов (с аргументом $src) функции wp_enqueue_style(). Это потребовало бы больше печатать, но не привело бы к увеличению потребления ресурсов. Верно?

Jan-Philip Gehrcke Jan-Philip Gehrcke
16 июн. 2015 г. 23:43:25

Значит ли это, что для загрузки скриптов или CSS файлов необходимо использовать функции wp_enqueue_scripts или wp_enqueue_style, с функцией register или без неё?

Lai32290 Lai32290
20 окт. 2015 г. 04:12:18

Один момент, который упустили все объяснения до сих пор — вы можете использовать wp_register_script() просто для регистрации скрипта, чтобы он мог быть использован как зависимость для других скриптов и загружаться только с ними, без прямого вызова enqueue.

JHoffmann JHoffmann
5 нояб. 2016 г. 18:57:31

Хотя это объяснение достаточно понятное, я бы рекомендовал также прочитать этот ответ.

lowtechsun lowtechsun
15 нояб. 2016 г. 20:15:32

Что действительно абсурдно, так это то, что вам приходится регистрировать скрипт, например, в wp_enqueue_scripts, что не имеет смысла, если вы хотите сделать всё правильно и зарегистрировать все свои ресурсы, чтобы они были доступны для всего остального (например, в качестве зависимостей). Неееет... Вам придётся использовать один или несколько из тех же 3 хуков (один для фронтенда, один для бэкенда и один для экрана входа). Так что у вас будет wp_register_script(), за которым сразу же последует использование этого зарегистрированного скрипта. Не так уж элегантно, правда? Что, на мой взгляд, лишает смысла существование двух отдельных функций.

XedinUnknown XedinUnknown
28 авг. 2018 г. 18:46:36

К вашему сведению, admin_enqueue_script не является функцией/хуком WordPress. Но admin_enqueue_scripts — это хук WordPress, который может загружать подключённые JavaScript или CSS файлы — см.: https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/

risingPhoenix1979 risingPhoenix1979
6 апр. 2022 г. 20:02:05
Показать остальные 4 комментариев
4
12

Я изучил несколько статей и пришел к следующим выводам. Думаю, это будет полезно.

  1. Регистрация скриптов с помощью wp_register_script() — это только регистрация, а не их загрузка. Зарегистрированный скрипт не будет загружен, пока он не будет добавлен в очередь с помощью wp_enqueue_script().
  2. Нет необходимости регистрировать и добавлять в очередь каждый скрипт одновременно. Достаточно просто добавить их в очередь. Регистрация не является обязательной, так как функция wp_enqueue_script() автоматически регистрирует скрипт.
  3. Однако регистрация необходима в следующих случаях:

    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

1 янв. 2019 г. 15:06:46
Комментарии

Ваше объяснение — лучшее из всех, что я читал. Теперь я понимаю, почему важно регистрировать скрипты. Спасибо!

Eje Eje
30 окт. 2019 г. 23:42:19

Огромное спасибо, @Jee

Mohammad Shohel Rana Mohammad Shohel Rana
4 нояб. 2019 г. 05:29:39

Это самый полезный ответ, который я когда-либо читал. Спасибо.

Thiago Santos Thiago Santos
13 февр. 2023 г. 22:49:20

Огромное спасибо, @ThiagoSantos

Mohammad Shohel Rana Mohammad Shohel Rana
18 мар. 2023 г. 02:40:45
1
11

По моему мнению, главное преимущество использования wp_register_script перед wp_enqueue_scripts хорошо проиллюстрировано в следующем абзаце из Кодекса:

Скрипты, предварительно зарегистрированные с помощью wp_register_script(), не требуют ручного добавления через wp_enqueue_script(), если они указаны как зависимости другого подключаемого скрипта. WordPress автоматически включит зарегистрированный скрипт перед тем, как подключит основной скрипт, который указал его хэндл в качестве зависимости.

Если вы считаете, что вам это не нужно (например, потому что вы на 100% уверены, что ваш скрипт не будет участвовать в каких-либо зависимостях), вы можете сразу использовать wp_enqueue_scripts, без предварительного wp_register_script.

1 июн. 2017 г. 22:43:01
Комментарии

Я считаю, что последний абзац (о том, что не нужно регистрировать скрипт, если вы "на 100% уверены, что ваш скрипт не будет участвовать в каких-либо зависимостях") неверен. На мой взгляд, правильная формулировка — вам не нужно регистрировать скрипт, только если вы уверены, что собираетесь загрузить его в любом случае. Функция enqueue неявно регистрирует ваш скрипт, поэтому другие скрипты могут зависеть от него, даже если вы только добавили его в очередь.

epeleg epeleg
18 сент. 2022 г. 12:30:23