Каков предпочтительный способ добавления пользовательских файлов javascript на сайт?
Я уже добавил свои сценарии, но я хотел знать предпочтительный способ.
Я просто поместил тег <script>
непосредственно в header.php
моего шаблона.
Существует ли предпочтительный способ вставки внешних или пользовательских файлов js?
Как бы я привязал файл js к одной странице? (Я имею в виду домашнюю страницу)
4 answers
Используйте wp_enqueue_script()
в своей теме
Основной ответ заключается в использовании wp_enqueue_script()
в крючке wp_enqueue_scripts
для интерфейса admin_enqueue_scripts
для администратора. Это может выглядеть примерно так (предполагается, что вы звоните из файла вашей темы functions.php
; обратите внимание, как я ссылаюсь на каталог таблиц стилей):
<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );
function mysite_enqueue() {
$ss_url = get_stylesheet_directory_uri();
wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js" );
}
Это основы.
Предопределенные и несколько зависимых сценариев
Но допустим, вы хотите включить как jQuery, так и пользовательский интерфейс jQuery, сортируемый из списка по умолчанию скрипты, включенные в WordPress и вы хотите, чтобы ваш сценарий зависел от них? Легко, просто включите первые два скрипта, используя предопределенные дескрипторы, определенные в WordPress, и для вашего скрипта укажите 3-й параметр wp_enqueue_script()
, который представляет собой массив дескрипторов скриптов, используемых каждым скриптом, например:
<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );
function mysite_enqueue() {
$ss_url = get_stylesheet_directory_uri();
wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js", array( 'jquery', 'jquery-ui-sortable' ) );
}
Скрипты в плагине
Что, если вместо этого вы захотите сделать это в плагине? Используйте функцию plugins_url()
, чтобы указать URL-адрес вашего Javascript файл:
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue' );
function my_plugin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url('/js/my-script.js',__FILE__), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION );
}
Управление версиями ваших сценариев
Также обратите внимание, что выше мы присвоили нашему плагину номер версии и передали его в качестве 4-го параметра wp_enqueue_script()
. Номер версии выводится в источнике в качестве аргумента запроса в URL-адресе скрипта и служит для того, чтобы заставить браузер повторно загрузить, возможно, кэшированный файл, если версия изменилась.
Загружайте скрипты только на страницы, где это необходимо
1-е правило веб-производительности гласит, что Минимизировать HTTP-запросы так что всякий раз, когда возможно, вам следует ограничить загрузку скриптов только там, где это необходимо. Например, если вам нужен только ваш скрипт в администраторе, ограничьте его страницами администратора, используя вместо этого крючок admin_enqueue_scripts
:
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );
function my_plugin_admin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION );
}
Загрузите свои сценарии в Нижний колонтитул
Если ваши сценарии являются одним из тех, которые необходимо загрузить в нижний колонтитул, есть 5-й параметр wp_enqueue_script()
, который указывает WordPress отложить его и поместить в нижний колонтитул (при условии, что ваша тема не вела себя неправильно и что она действительно вызывает крючок wp_footer, как все хорошие темы WordPress должны):
<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );
function my_plugin_admin_enqueue() {
wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION, true );
}
Более Мелкозернистый контроль
Если вам нужен более тонкий контроль, чем этот , У Ozh есть отличная статья под названием Как загрузить Javascript С Помощью Плагина WordPress, который содержит более подробную информацию.
Отключение сценариев для получения контроля
У Джастина Тэдлока есть хорошая статья под названием Как отключить сценарии и стили в случае, если вы хотите:
- Объединить несколько файлов в отдельные файлы (пробег может варьироваться в зависимости от JavaScript здесь).
- Загружайте файлы только на те страницы, на которых мы используем сценарий или стиль.
- Перестаньте использовать !важно в нашем файле style.css для простых настроек CSS.
Передача значений из PHP в JS с помощью wp_localize_script()
В своем блоге Владимир Преловац опубликовал замечательную статью под названием Лучшая практика добавления кода JavaScript в плагины WordPress, где он обсуждает использование wp_localize_script()
, чтобы вы могли установить значение переменных в вашем серверном PHP для последующего использования в вашем клиентском Javascript.
Действительно Мелкозернистый контроль с wp_print_scripts()
И, наконец, если вам нужен действительно мелкозернистый контроль, вы можете изучить wp_print_scripts()
, как обсуждалось в Beer Planet в посте под названием Как Включать CSS и JavaScript Условно И Только Тогда, Когда Это Необходимо Для Сообщений.
Эпилок
Вот и все, что касается лучших практик включения файлов Javascript с WordPress. Если я что-то пропустил (что, вероятно, у меня есть), обязательно дайте мне знать в комментариях, чтобы я мог добавить обновление для будущих путешественников.
Чтобы похвалить замечательную иллюстрацию использования очередей, я просто хочу отметить, что сценарии, включенные в качестве зависимостей, не нужно ставить в очередь...
Я буду использовать пример под Скриптами в заголовке плагина в ответе Майка.
define('MY_PLUGIN_VERSION','2.0.1');
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui-sortable');
wp_enqueue_script('my-script',plugins_url('/js/my-script.js',__FILE__),array('jquery','jquery-ui-sortable'),MY_PLUGIN_VERSION);
}
Это можно урезать, чтобы прочитать..
define('MY_PLUGIN_VERSION','2.0.1');
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
wp_enqueue_script('my-script', plugins_url( '/js/my-script.js', __FILE__ ), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION);
}
Когда вы устанавливаете зависимости, WordPress найдет и поставит их в очередь готовыми для вашего скрипта, поэтому вам не нужно делать никаких независимых вызовов для них скрипты.
Кроме того, некоторым из вас может быть интересно, может ли установка нескольких зависимостей привести к тому, что сценарии будут выводиться в неправильном порядке, здесь позвольте мне привести пример
wp_enqueue_script( 'first-script', 'example/path/example_script_1.js', array('second-script','third-script') );
Если бы сценарий два зависел от сценария три (т. Е. сценарий три должен загружаться первым), это не будет иметь значения, WordPress определит приоритеты очереди для этих сценариев и выведет их в правильном порядке, короче говоря, все это будет автоматически разработано для вас WordPress.
Для небольших фрагментов скриптов, которые вы, возможно, не захотите включать в отдельный файл, например, потому что они генерируются динамически, WordPress 4.5 и другие предложения wp_add_inline_script
. Эта функция в основном привязывает сценарий к другому сценарию.
Предположим, например, что вы разрабатываете тему и хотите, чтобы ваш клиент мог вставлять свои собственные сценарии (например, Google Analytics или AddThis) на странице параметров. Затем вы можете использовать wp_add_inline_script
, чтобы зафиксировать этот скрипт на ваш основной js-файл (скажем, mainjs
) выглядит так:
$custom_script = get_option('my-script')
if (!empty($custom_script)) wp_add_inline_script ('mainjs', $custom_script);
Мой предпочтительный способ - добиться хорошей производительности, поэтому вместо использования wp_enqueue_script
Я использую HEREDOC с API выборки, чтобы загружать все асинхронно параллельно:
$jquery_script_path = '/wp-includes/js/jquery/jquery.js?ver=1.12.4';
$jquery_dependent_script_paths = [
get_theme_file_uri( '/assets/js/global.js' ),
get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ),
get_theme_file_uri( '/assets/js/skip-link-focus-fix.js' ),
get_theme_file_uri( '/assets/js/navigation.js' )
];
$jquery_dependent_script_paths_json = json_encode($jquery_dependent_script_paths);
$inline_scripts = <<<EOD
<script>
(function () {
'use strict';
if (!window.fetch) return;
/**
* Fetch Inject v1.6.8
* Copyright (c) 2017 Josh Habdas
* @licence ISC
*/
var fetchInject=function(){"use strict";const e=function(e,t,n,r,o,i,c){i=t.createElement(n),c=t.getElementsByTagName(n)[0],i.type=r.blob.type,i.appendChild(t.createTextNode(r.text)),i.onload=o(r),c?c.parentNode.insertBefore(i,c):t.head.appendChild(i)},t=function(t,n){if(!t||!Array.isArray(t))return Promise.reject(new Error("`inputs` must be an array"));if(n&&!(n instanceof Promise))return Promise.reject(new Error("`promise` must be a promise"));const r=[],o=n?[].concat(n):[],i=[];return t.forEach(e=>o.push(window.fetch(e).then(e=>{return[e.clone().text(),e.blob()]}).then(e=>{return Promise.all(e).then(e=>{r.push({text:e[0],blob:e[1]})})}))),Promise.all(o).then(()=>{return r.forEach(t=>{i.push({then:n=>{"text/css"===t.blob.type?e(window,document,"style",t,n):e(window,document,"script",t,n)}})}),Promise.all(i)})};return t}();
fetchInject(
$jquery_dependent_script_paths_json
, fetchInject([
"{$jquery_script_path}"
]));
})();
</script>
EOD;
А затем вставляйте их в голову, иногда вместе со стилями, подобными этому:
function wc_inline_head() {
global $inline_scripts;
echo "{$inline_scripts}";
global $inline_styles;
echo "{$inline_styles}";
}
В результате получается водопад, который выглядит так, загружая все сразу, но контролируя порядок выполнения:
Примечание: Для этого требуется использовать API выборки, который не доступно во всех браузерах.