wp_enqueue_script pentru scripturi inline datorită dependențelor

4 aug. 2011, 00:11:23
Vizualizări: 37.7K
Voturi: 40

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.

0
Toate răspunsurile la întrebare 6
2
36

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.

4 aug. 2011 01:18:38
Comentarii

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?

Sam Peacey Sam Peacey
31 mai 2014 07:19:32

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

Dhinju Divakaran Dhinju Divakaran
25 iun. 2016 09:41:03
0

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

4 aug. 2011 02:02:08
0

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ă.

28 mar. 2014 16:02:40
0

Î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' );
}
15 mai 2016 18:18:08
0

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.

18 aug. 2014 17:29:45
1

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ă.

29 ian. 2014 14:29:13
Comentarii

Abordarea cu script inline echo este modul în care a fost construită tema Twenty Seventeen, cel puțin la un moment dat. Și eu folosesc această tehnică. Funcționează excelent și îți permite să te conectezi în diferite locuri.

vhs vhs
1 iun. 2017 04:05:58