Приоритет хука 'wp_enqueue_scripts' не работает

22 мар. 2013 г., 18:55:17
Просмотры: 36.9K
Голосов: 8

В теме, над которой я работаю, используется до 3 таблиц стилей. Я использую хук 'wp_enqueue_scripts'. Порядок подключения таблиц стилей важен для правильного переопределения стилей. У меня есть такой код:

add_action('wp_enqueue_scripts', 'add_stylesheet_one', 10);
add_action('wp_enqueue_scripts', 'add_stylesheet_two', 14);
add_action('wp_enqueue_scripts', 'add_stylesheet_three', 12);

С такими приоритетами порядок таблиц стилей должен быть 'stylesheet_one', 'stylesheet_three' и 'stylesheet_two'. Но приоритет не оказывает никакого эффекта. Я пробовал разные числа, но порядок не меняется. Что я делаю не так?

Спасибо за помощь!!!

1
Комментарии

Приоритет вашей функции учитывается, но после добавления в список они (обычно) переупорядочиваются для соблюдения зависимостей.

Andy Jacobs Andy Jacobs
23 мар. 2013 г. 01:17:29
Все ответы на вопрос 3
5
16

Проблема в том, что ваши действия выполняются в том порядке, в котором вы их воспринимаете, но WordPress просто собирает стили и включает их в случайном порядке.

Порядок ваших add_actions не будет иметь значения. Я бы сделал так:

function add_all_stylesheets() {
  // вы опустили это в своем вопросе, см. ниже
}
add_action('wp_enqueue_scripts', 'add_all_stylesheets');

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

function add_all_stylesheets() {
  wp_enqueue_style( 'stylesheet-one', get_template_directory_uri() . '/css/stylesheet-one.css' );
  wp_enqueue_style( 'stylesheet-two', get_template_directory_uri() . '/css/stylesheet-two.css', array( 'stylesheet-one' ) );
  wp_enqueue_style( 'stylesheet-three', get_template_directory_uri() . '/css/stylesheet-three.css', array( 'stylesheet-two' ) );
}
add_action('wp_enqueue_scripts', 'add_all_stylesheets');

Теперь ваш "stylesheet-two" зависит от "stylesheet-one", а "three" зависит от "two". Это должно дать желаемый эффект.

22 мар. 2013 г. 19:20:45
Комментарии

С этого момента всё работает. Спасибо! Но, честно говоря, это не совсем отвечает на мой вопрос: :P Почему приоритет не имеет эффекта?? Есть ли какие-то подводные камни, о которых нужно знать? Мне просто хочется это понять. Я люблю WordPress и хочу знать все тонкости :D

Markus Schober Markus Schober
22 мар. 2013 г. 20:25:17

Внутри WordPress ждёт, пока соберутся все скрипты, прежде чем подключить их.

Допустим, WordPress добавляет 7 своих скриптов, а вы добавляете три. Чуть позже WordPress просматривает список и подключает их так, как считает нужным (определяя, какие скрипты зависят друг от друга).

Неважно, в каком порядке вы добавляете свои скрипты, потому что порядок игнорируется, пока WordPress анализирует зависимости.

Например: вы добавляете 3 скрипта, которым нужен jQuery, но jQuery добавляется четвёртым. Тогда jQuery будет перемещён на первое место.

Вы можете гарантировать порядок только через зависимости: "3 зависит от 2", "2 зависит от 1".

Andy Jacobs Andy Jacobs
23 мар. 2013 г. 01:15:14

Понятно. При наличии зависимостей параметр приоритета в 'add_action' игнорируется. Но если я удаляю все зависимости, приоритет всё равно игнорируется. Если я использую, например, add_action('wp_head', 'my_function', 5);, то это работает. Это поведение различается для разных хуков?

Markus Schober Markus Schober
23 мар. 2013 г. 09:29:26

Я постараюсь объяснить это ещё раз максимально понятно. Ваш приоритет не игнорируется. Изначально порядок соответствует тому, в каком скрипты добавляются в список. Но затем этот список может быть переупорядочен. Вы можете добавлять их через wp_head, и сейчас это может работать — чисто по везению. Но если вы обновите WordPress или добавите новый плагин, это может перестать работать. Тот факт, что скрипты добавляются в определённом порядке, не гарантирует, что они останутся в этом порядке. Единственный способ гарантировать порядок — использовать зависимости.

Andy Jacobs Andy Jacobs
24 мар. 2013 г. 19:00:23

Ок, кажется, я понял. :D Спасибо за объяснение!!!!

Markus Schober Markus Schober
25 мар. 2013 г. 21:39:41
1

Я знаю, что уже поздно. Но теперь всё работает, как ожидалось.

У add_action есть третий аргумент — приоритет. Ниже я подключил скрипты с приоритетами 10, 12 и 14. Таким образом, скрипты подключаются на фронтенде в соответствии с заданными приоритетами.

Вот мой фрагмент кода, который отлично работает:

add_action( 'wp_enqueue_scripts', 'test_enqueue_styles_1', 10 );
add_action( 'wp_enqueue_scripts', 'test_enqueue_styles_2', 14 );
add_action( 'wp_enqueue_scripts', 'test_enqueue_styles_3', 12 );

function test_enqueue_styles_1() {
    wp_enqueue_style( 'font-awesome-1-css', get_template_directory_uri() . 'assets/css/font-awesome.min.css' );
}

function test_enqueue_styles_2() {
    wp_enqueue_style( 'font-awesome-2-css', get_template_directory_uri() . 'assets/css/font-awesome.min.css' );
}

function test_enqueue_styles_3() {
    wp_enqueue_style( 'font-awesome-3-css', get_template_directory_uri() . 'assets/css/font-awesome.min.css' );
}

Последовательность подключения:

test_enqueue_styles_1
test_enqueue_styles_3
test_enqueue_styles_2
19 авг. 2016 г. 16:44:57
Комментарии

Голосование за функцию add_action "Priority" например, 10

khurram khurram
21 июл. 2017 г. 15:36:34
4

Хм, есть ли причина, по которой вы делаете это таким образом? Более традиционный метод приведен ниже.

(Следующее предполагает, что ваши таблицы стилей находятся в каталоге css вашей темы.)

function my_enqueue_scripts() {
    wp_enqueue_style( 'stylesheet_one', get_template_directory_uri() . '/css/stylesheet_one.css' );
    wp_enqueue_style( 'stylesheet_three', get_template_directory_uri() . '/css/stylesheet_three.css' );
    wp_enqueue_style( 'stylesheet_two', get_template_directory_uri() . '/css/stylesheet_two.css' );
}

add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );

Тем не менее - я не уверен, почему приоритеты в вашем методе не работают. Нам, вероятно, нужно увидеть код в прикрепленных функциях.

22 мар. 2013 г. 19:16:05
Комментарии

в дополнение к этому, если вы укажете зависимость для каждого стиля, порядок их подключения не будет иметь значения.

Milo Milo
22 мар. 2013 г. 19:18:43

Я знаю, что могу сделать это в одной функции, как в вашем примере. Я делаю таким образом, потому что использую настройки темы, и все, что связано с настройками темы, находится в отдельных файлах.

Markus Schober Markus Schober
22 мар. 2013 г. 20:00:15

Хм, вы все еще можете использовать wp_enqueue_style в своих функциях - и указать правильную зависимость, как предлагают Мило и infamouse.

vancoder vancoder
22 мар. 2013 г. 20:06:06

Извините, часть моего предыдущего комментария потерялась. Вот полная версия :-) Я знаю, что могу сделать это в одной функции, как в вашем примере. Я делаю это таким образом, потому что использую настройки темы, и все, что связано с настройками темы, находится в отдельных файлах. Основная таблица стилей подключается в functions.php, а другие таблицы стилей подключаются в других файлах. Поэтому я попробовал сделать именно так.

Markus Schober Markus Schober
22 мар. 2013 г. 20:17:26