Prioritatea hook-ului 'wp_enqueue_scripts' nu are niciun efect

22 mar. 2013, 18:55:17
Vizualizări: 36.9K
Voturi: 8

Într-o temă la care lucrez există până la 3 foi de stil. Folosesc hook-ul 'wp_enqueue_scripts'. Ordinea foilor de stil este importantă pentru suprascrierea stilurilor. Am un cod de acest gen:

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);

Cu aceste priorități, ordinea foilor de stil ar trebui să fie 'stylesheet_one', 'stylesheet_three' și 'stylesheet_two'. Dar prioritatea nu are niciun efect. Am încercat diferite numere dar ordinea nu se schimbă. Am omis ceva?

Mulțumesc pentru ajutor!!!

1
Comentarii

Prioritatea funcției tale este respectată, dar după ce sunt adăugate în listă, acestea sunt (de obicei) rearanjate pentru a respecta dependențele.

Andy Jacobs Andy Jacobs
23 mar. 2013 01:17:29
Toate răspunsurile la întrebare 3
5
16

Problema este că acțiunile tale sunt executate în ordinea în care le percepi, dar stilurile sunt doar colectate de WordPress și incluse într-o ordine aleatorie.

Ordinea funcțiilor tale add_actions nu va fi importantă. Aș face astfel:

function add_all_stylesheets() {
  // ai omis aceasta din întrebarea ta, vezi mai jos
}
add_action('wp_enqueue_scripts', 'add_all_stylesheets');

Acum - dacă dorești ca scripturile tale să fie incluse în ordine, va trebui să le faci să "depindă" unele de altele pentru a se înlănțui.

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');

Acum "stylesheet-two" depinde de "stylesheet-one" și "three" depinde de "two". Acesta ar trebui să fie efectul dorit de tine.

22 mar. 2013 19:20:45
Comentarii

Cu asta ca punct de plecare funcționează. Mulțumesc! Dar, să fiu sincer, nu răspunde chiar la întrebarea mea: :P De ce nu are prioritatea niciun efect?? Există câteva capcane de ținut minte? Vreau doar să știu asta. Iubesc Wordpress și vreau să cunosc toate detaliile :D

Markus Schober Markus Schober
22 mar. 2013 20:25:17

Intern, WordPress așteaptă să colecteze toate scripturile înainte de a le include.

Să zicem că WordPress adaugă 7 scripturi proprii, apoi tu adaugi trei ale tale. La un moment dat, WordPress analizează lista și le include în modul pe care îl consideră potrivit (determinând care scripturi depind unele de altele).

Nu contează în ce ordine le adaugi tu, deoarece ordinea este ignorată în timp ce WordPress se uită la dependențe.

De ex. Adaugi 3 scripturi care au nevoie de jQuery, dar jQuery este adăugat al patrulea. jQuery este mutat pe prima poziție.

Poți garanta ordinea doar prin "3 are nevoie de 2", "2 are nevoie de 1".

Andy Jacobs Andy Jacobs
23 mar. 2013 01:15:14

Ok, am înțeles. Cu dependențe, parametrul de prioritate din 'add_action' va fi ignorat. Dar când elimin toate dependențele, prioritatea este tot ignorată. Dacă folosesc de ex. add_action('wp_head', 'my_function', 5); funcționează. Este acest comportament diferit la unele hook-uri?

Markus Schober Markus Schober
23 mar. 2013 09:29:26

Încerc să clarific acest lucru încă o dată. Prioritatea ta nu este ignorată. Aceasta este ordinea în care sunt adăugate în listă. Dar lista poate fi rearanjată. Poți să le adaugi în wp_head, și poate funcționa acum, din pură noroc. Dar dacă faci un upgrade sau adaugi un plugin, s-ar putea să nu mai funcționeze. Doar pentru că sunt adăugate în ordine, nu garantează că vor rămâne în aceași ordine. Singura modalitate de a garanta acest lucru este utilizarea dependențelor.

Andy Jacobs Andy Jacobs
24 mar. 2013 19:00:23

Ok, cred că am înțeles. :D Mulțumesc pentru explicații!!!!

Markus Schober Markus Schober
25 mar. 2013 21:39:41
1

Știu că este prea târziu. Dar acum funcționează așa cum trebuie.

add_action are un al 3-lea argument care reprezintă prioritatea. Mai jos, am încărcat scripturile cu prioritățile 10, 12 și 14. Astfel, încarcă scripturile în partea de frontend conform priorităților date.

Mai jos este fragmentul meu de cod și funcționează corect.

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' );
}

Secvența de încărcare

test_enqueue_styles_1
test_enqueue_styles_3
test_enqueue_styles_2
19 aug. 2016 16:44:57
Comentarii

A votat pentru funcția add_action "Priority" de exemplu, 10

khurram khurram
21 iul. 2017 15:36:34
4

Hmm, există vreun motiv pentru care faci asta în acest fel? Metoda mai convențională este cea de mai jos.

(Următoarele presupun că fișierele tale de stil sunt în directorul css al temei tale.)

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' );

Cu toate acestea - nu sunt sigur de ce prioritățile din metoda ta nu funcționează. Probabil ar trebui să vedem codul din funcțiile atașate.

22 mar. 2013 19:16:05
Comentarii

în plus, dacă specifici o dependență pentru fiecare stil, nu contează în ce ordine le pui.

Milo Milo
22 mar. 2013 19:18:43

Știu, pot face asta într-o singură funcție ca în exemplul tău. O fac în acest fel pentru că folosesc opțiuni pentru temă și toate setările pentru opțiunile temei sunt în fișiere separate.

Markus Schober Markus Schober
22 mar. 2013 20:00:15

Hm, probabil ai putea totuși să folosești wp_enqueue_style în funcțiile tale - și să incluzi dependența corectă, așa cum sugerează Milo și infamouse.

vancoder vancoder
22 mar. 2013 20:06:06

Îmi pare rău, o parte din ultimul meu comentariu s-a pierdut. Iată complet :-) Știu, pot face asta într-o singură funcție ca în exemplul tău. O fac în acest fel, pentru că folosesc opțiuni pentru temă și toate elementele legate de opțiunile temei sunt în fișiere separate. Fișierul principal de stiluri este încărcat în functions.php, iar celelalte fișiere de stiluri sunt încărcate în alte fișiere. Așa că am încercat în acest fel.

Markus Schober Markus Schober
22 mar. 2013 20:17:26