La priorità dell'hook 'wp_enqueue_scripts' non ha effetto

22 mar 2013, 18:55:17
Visualizzazioni: 36.9K
Voti: 8

In un tema su cui sto lavorando ci sono fino a 3 fogli di stile. Sto utilizzando l'hook 'wp_enqueue_scripts'. L'ordine dei fogli di stile è importante per sovrascrivere gli stili. Ho un codice come questo:

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

Con queste priorità l'ordine dei fogli di stile dovrebbe essere 'stylesheet_one', 'stylesheet_three' e 'stylesheet_two'. Ma la priorità non ha alcun effetto. Ho provato numeri diversi ma l'ordine non cambia. Mi sta sfuggendo qualcosa?

Grazie per l'aiuto!!!

1
Commenti

La priorità della tua funzione viene rispettata ma dopo essere state aggiunte alla lista vengono (di solito) riordinate per rispettare le dipendenze.

Andy Jacobs Andy Jacobs
23 mar 2013 01:17:29
Tutte le risposte alla domanda 3
5
16

Il problema è che le tue azioni vengono eseguite nell'ordine che percepisci, ma gli stili vengono semplicemente raccolti da WordPress e inclusi in un ordine casuale.

L'ordine dei tuoi add_actions non sarà importante. Farei così:

function add_all_stylesheets() {
  // hai omesso questo dalla tua domanda, vedi sotto
}
add_action('wp_enqueue_scripts', 'add_all_stylesheets');

Ora - se vuoi che i tuoi script vengano inclusi in ordine, dovrai farli "dipendere" l'uno dall'altro in modo che si concatenino.

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

Ora il tuo "stylesheet-two" dipende da "stylesheet-one" e "three" dipende da "two". Questo dovrebbe darti l'effetto desiderato.

22 mar 2013 19:20:45
Commenti

Con questo come punto di partenza funziona. Grazie! Ma ad essere onesti, non risponde veramente alla mia domanda: :P Perché la priorità non ha effetto?? Ci sono alcune insidie da tenere a mente? Voglio solo sapere questo. Amo Wordpress e voglio conoscerlo in ogni dettaglio :D

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

Internamente WordPress attende di raccogliere tutti gli script prima di includerli.

Supponi che WordPress aggiunga 7 dei suoi script e poi tu ne aggiunga tre. Ad un certo punto, molto più tardi, WordPress esamina l'elenco e li include come ritiene opportuno (determinando quali script dipendono l'uno dall'altro).

Non importa in quale ordine aggiungi i tuoi perché l'ordine viene ignorato mentre WordPress esamina le dipendenze.

Ad esempio, aggiungi 3 script che necessitano di jQuery ma jQuery è aggiunto per quarto. jQuery viene spostato nella prima posizione.

Puoi garantire l'ordine solo con "3 dipende da 2", "2 dipende da 1".

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

Ok, ho capito. Con le dipendenze il parametro di priorità in 'add_action' verrà ignorato. Ma quando rimuovo tutte le dipendenze la priorità viene ancora ignorata. Se uso ad esempio add_action('wp_head', 'my_function', 5); funziona. Questo comportamento è diverso su alcuni hook?

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

Cercherò di renderlo chiaro ancora una volta. La tua priorità non viene ignorata. Quell'ordine è quello in cui vengono aggiunti alla lista. Ma la lista viene riorganizzata. Puoi aggiungerli in wp_head, e potrebbe funzionare per ora, per pura fortuna. Ma se fai un upgrade o aggiungi un plugin, potrebbe non funzionare. Solo perché vengono aggiunti in ordine non garantisce che rimarranno in ordine. L'unico modo per garantirlo è usando le dipendenze.

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

Ok, penso di aver capito. :D Grazie per la spiegazione!!!!

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

So che è un po' tardi. Ma ora funziona come previsto.

add_action ha un 3° argomento che rappresenta la priorità. Qui sotto, ho accodato gli script con priorità 10, 12 e 14. Quindi, carica gli script in frontend con le priorità assegnate.

Di seguito, il mio snippet che funziona correttamente.

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

Sequenza di accodamento

test_enqueue_styles_1
test_enqueue_styles_3
test_enqueue_styles_2
19 ago 2016 16:44:57
Commenti

Votato per la funzione add_action "Priorità" es. 10

khurram khurram
21 lug 2017 15:36:34
4

Hmm, c'è un motivo per cui lo stai facendo in questo modo? Il metodo più convenzionale è il seguente.

(Quanto segue presuppone che i tuoi fogli di stile si trovino nella directory css del tuo tema.)

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

Detto questo - non sono sicuro del perché le priorità nel tuo metodo non funzionino. Probabilmente dovremmo vedere il codice nelle funzioni allegate.

22 mar 2013 19:16:05
Commenti

inoltre, se specifichi una dipendenza per ogni stile, non importa in quale ordine li inserisci.

Milo Milo
22 mar 2013 19:18:43

Lo so, potrei farlo in una singola funzione come nel tuo esempio. Lo sto facendo in questo modo perché sto usando le opzioni del tema e tutte le funzionalità relative alle opzioni del tema sono in file separati.

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

Mmh, probabilmente potresti comunque usare wp_enqueue_style nelle tue funzioni - e includere la dipendenza corretta, come suggeriscono Milo e infamouse.

vancoder vancoder
22 mar 2013 20:06:06

Scusa, una parte del mio ultimo commento è andata persa. Ecco il testo completo :-) Lo so, potrei farlo in una singola funzione come nel tuo esempio. Lo sto facendo in questo modo perché sto utilizzando le opzioni del tema e tutte le operazioni relative alle opzioni del tema sono in file separati. Il foglio di stile principale viene accodato nel functions.php e gli altri fogli di stile vengono accodati in altri file. Quindi ho provato in questo modo.

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