wp_enqueue_script pentru scripturi inline datorită dependențelor
Există vreo modalitate de a folosi wp_enqueue_script() pentru scripturi inline?
Fac acest lucru deoarece scriptul meu inline depinde de un alt script și aș dori flexibilitatea de a-l insera după ce acesta este încărcat.
De asemenea, este un script inline deoarece transmit variabile PHP în javascript (cum ar fi calea temei etc.)
Mulțumesc anticipat.

Ei bine, aveți funcția wp_localize_script(), dar aceasta este doar pentru transmiterea de date.
În caz contrar, puteți face astfel:
function print_my_inline_script() {
if ( wp_script_is( 'some-script-handle', 'done' ) ) {
?>
<script type="text/javascript">
// codul JavaScript va fi aici
</script>
<?php
}
}
add_action( 'wp_footer', 'print_my_inline_script' );
Ideea este că nu ar trebui să vă bazați pe faptul că scriptul inline va fi afișat exact după scriptul de care depinde, ci mai târziu.

Cu siguranță acest lucru funcționează doar dacă scriptul de care depindeți a fost deja afișat? Dacă scriptul de care depindeți este înregistrat și în wp_footer și se execută după codul scriptului inline, atunci scriptul inline pur și simplu nu va fi scris pe client și, prin urmare, nu va fi executat?

Începând cu WordPress 4.5 puteți folosi wp_add_inline_script()
wp_add_inline_script cu jQuery WordPress

Doar să nu transformi acest lucru într-un script inline și apoi să transmiți parametrii dinamici ca variabile. Otto a scris un ghid excelent despre cum să faci acest lucru eficient.
WordPress 3.3 va face și acest lucru mai puternic: https://core.trac.wordpress.org/ticket/11520

Această soluție este similară cu răspunsul lui @scribu, dar urmează forma funcției wp_enquque_script()
și va plasa scriptul în header dacă dependențele sale sunt incluse în header.
/**
* Încarcă JavaScript inline. @see wp_enqueue_script().
*
* BUG CUNOSCUT: Scripturile inline nu pot fi încărcate înainte
* de orice scripturi inline de care depind (decât dacă sunt
* plasate în header, iar cele dependente în footer).
*
* @param string $handle Nume identificativ pentru script
* @param string $src Codul JavaScript
* @param array $deps (opțional) Array cu numele scripturilor de care depinde acest script
* @param bool $in_footer (opțional) Dacă să încarce scriptul înainte de </head> sau </body>
*
* @return null
*/
function enqueue_inline_script( $handle, $js, $deps = array(), $in_footer = false ){
// Callback pentru afișarea scriptului inline.
$cb = function()use( $handle, $js ){
// Asigură-te că scriptul este inclus doar o dată.
if( wp_script_is( $handle, 'done' ) )
return;
// Afișează scriptul și marchează-l ca inclus.
echo "<script type=\"text/javascript\" id=\"js-$handle\">\n$js\n</script>\n";
global $wp_scripts;
$wp_scripts->done[] = $handle;
};
// (`wp_print_scripts` este apelat în header și footer, dar $cb are protecție împotriva reinserării.)
$hook = $in_footer ? 'wp_print_footer_scripts' : 'wp_print_scripts';
// Dacă nu există dependențe, conectează simplu la header sau footer.
if( empty($deps)){
add_action( $hook, $cb );
return;
}
// Amână afișarea scriptului până când toate dependențele au fost incluse.
$cb_maybe = function()use( $deps, $in_footer, $cb, &$cb_maybe ){
foreach( $deps as &$dep ){
if( !wp_script_is( $dep, 'done' ) ){
// Dependențele nu sunt incluse în head, încearcă din nou în footer.
if( ! $in_footer ){
add_action( 'wp_print_footer_scripts', $cb_maybe, 11 );
}
else{
// Dependențele nu au fost incluse în `wp_head` sau `wp_footer`.
}
return;
}
}
call_user_func( $cb );
};
add_action( $hook, $cb_maybe, 0 );
}
// Utilizare
enqueue_inline_script('test','alert(\'test încărcare script inline\');',array( 'jquery'));
Notă: aceasta folosește funcții anonime, dar pentru versiunile PHP anterioare 5.3 poate fi ușor convertită într-o clasă.

Începând cu WordPress 4.5 puteți folosi wp_add_inline_script():
add_action( 'wp_enqueue_scripts', 'cyb_enqueue_scripts' );
function cyb_enqueue_scripts() {
wp_enqueue_script( 'myscript', 'url/to/myscript.js', array(), '1.0' );
wp_add_inline_script( 'myscript', 'Aici introduceți codul JavaScript inline' );
}

Cea mai bună metodă pe care am găsit-o este folosirea wp_localize_script()
, așa cum a sugerat @scribu.
De obicei, am ales să folosesc JavaScript inline pentru că aveam nevoie să transmit unele variabile PHP către scriptul meu. Această problemă poate fi rezolvată cu wp_localize_script()
. Voi oferi un exemplu:
Ai un array $aFoo
cu unele opțiuni și trebuie să-l transmiți către un script.
$aFoo = array( 'option1' => $option1Value, 'option2' => $option2Value );
Folosind script inline:
<script>
var oFoo = {};
oFoo.option1 = <?php echo $aFoo['option1'] ?>;
oFoo.option2 = <?php echo $aFoo['option2'] ?>;
//fă ceva cu oFoo
</script>
Folosind wp_localize_script()
:
wp_register_script( 'script_name', 'pathToScript/script.js', array( 'jquery' )); //dacă jQuery nu este necesar, elimină ultimul argument.
wp_localize_script( 'script_name', 'object_name', $aFoo ); //transmite 'object_name' către script.js
wp_enqueue_script( 'script_name' );
Atunci, pathToScript/script.js
ar fi:
var oFoo = {};
oFoo.option1 = object_name.option1;
oFoo.option2 = object_name.option2;
//fă ceva cu oFoo (fără PHP necesar)
În acest fel, nu mai ai nevoie niciodată de scripturi inline.

scribu are absolut dreptate. Oricum, vreau să adaug câteva informații suplimentare:
Vreau ca funcția mea să afișeze un script o singură dată, indiferent de câte ori este apelată. Este o funcție legată de conținut, așa că nu pot aștepta pentru niciun hook. Am folosit informațiile de la scribu și o lectură a nucleului WordPress pentru a ajunge la această soluție:
function print_script_once() {
if(!wp_script_is('my-handle', 'done')) {
echo "<script>alert('o singură dată!');</script>";
global $wp_scripts;
$wp_scripts->done[] = 'my-handle';
}
}
add_action('get_footer', print_script_once);
Folosind această metodă, pot afișa un script inline o singură dată. În cazul meu, am o funcție care creează un buton de partajare și are nevoie ca un script să fie executat pentru toate butoanele, dar doar o dată.
