Cum pot obține o listă cu toate scripturile și stilurile încărcate?

25 iul. 2016, 17:44:50
Vizualizări: 41.9K
Voturi: 23

Creez un plugin și vreau să obțin lista tuturor scripturilor și fișierelor CSS folosite de alte pluginuri.

Aceasta este funcția mea:

function crunchify_print_scripts_styles() {    
    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Afișează toate scripturile încărcate
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Afișează toate stilurile încărcate (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}
add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

Vreau să obțin valoarea returnată într-o variabilă.

Am încercat asta:

$toto = do_action( 'crunchify_print_scripts_styles' );
var_dump( $toto );

Și acesta este rezultatul meu:

NULL

Dacă scriu echo în interiorul fiecărei bucle foreach, obțin rezultatele corecte, dar cum pot stoca aceste valori într-o variabilă?

[editare]

Codul meu dintr-un plugin, care de asemenea nu funcționează

/**
 *  Obține toate scripturile și stilurile din WordPress
 */
function print_scripts_styles() {

    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Afișează toate scripturile încărcate
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
        $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Afișează toate stilurile încărcate (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
        $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

add_action( 'wp_head', 'wp_rest_assets_init');

/**
 * Inițializează rutele JSON REST API Assets.
 *
 * @since 1.0.0
 */
function wp_rest_assets_init() {


    $all_the_scripts_and_styles = print_scripts_styles();

    if ( ! defined( 'JSON_API_VERSION' ) &&
         ! in_array( 'json-rest-api/plugin.php', get_option( 'active_plugins' ) ) ) {
             $class = new WP_REST_Assets();
             $class::$scriptsAndStyles = $all_the_scripts_and_styles;
             add_filter( 'rest_api_init', array( $class, 'register_routes' ) );
    } else {
        $class = new WP_JSON_Menus();
        add_filter( 'json_endpoints', array( $class, 'register_routes' ) );
    }
}


add_action( 'init', 'wp_rest_assets_init' );
7
Comentarii

do_action nu returnează un rezultat, și în plus, acțiunea a avut deja loc la wp_enqueue_scripts ... mai simplu ar fi să creezi o variabilă globală, de ex. global $crunchifyenqueued; $crunchifyenqueued = $result; apoi să apelezi din nou variabila globală în funcția ulterioară pentru a accesa variabila.

majick majick
25 iul. 2016 17:54:23

Mulțumesc pentru răspuns, dar nu a rezolvat problema, răspunsul pentru var_dump($crunchifyenqueued) este "NULL".

Edouard Kombo Edouard Kombo
25 iul. 2016 18:09:16

de ce să nu folosești apply_filters atunci? poți obține ușor valoarea returnată de acesta.

majick majick
25 iul. 2016 18:57:21

Am încercat deja, nu pot salva rezultatul într-o variabilă.

Edouard Kombo Edouard Kombo
27 iul. 2016 11:04:31

bineînțeles că poți folosind o variabilă globală?

majick majick
27 iul. 2016 11:49:11

Nici așa nu funcționează

Edouard Kombo Edouard Kombo
27 iul. 2016 12:59:40

de unde naiba vine endforeach; în astfel de coduri??

T.Todua T.Todua
7 apr. 2020 14:32:24
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 5
13
22

do_action nu funcționează exact așa. Când apelezi do_action('crunchify_print_scripts_styles'), WordPress caută în lista sa de acțiuni și filtre înregistrate pentru orice care este atașat la un hook numit crunchify_print_scripts_styles și apoi rulează acele funcții.

Și probabil că vrei să elimini asta:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... pentru că nu poți obține rezultatul returnat de funcția ta.

De asemenea, când folosești acest hook particular, nu poți garanta că alte funcții nu vor încărca mai multe scripturi sau stiluri după ce ai generat lista ta. Folosește un hook care se declanșează după ce toate scripturile și stilurile au fost încărcate, cum ar fi wp_head, pentru comoditate, sau mai bine, apelează funcția ta direct în tema ta când vrei să afișezi rezultatul.

Reorganizarea codului tău în felul următor ar trebui să funcționeze...

function crunchify_print_scripts_styles() {

    $result = [];
    $result['scripts'] = [];
    $result['styles'] = [];

    // Afișează toate Scripturile încărcate
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Afișează toate Stilurile (CSS) încărcate
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

Apoi, în tema ta:

print_r( crunchify_print_scripts_styles() );

... îți va afișa rezultatele pentru depanare, sau desigur...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... îți va oferi lista pentru manipulare.

Apelând-o în tema, te asiguri că o apelezi după ce toate scripturile și stilurile au fost încărcate.

Pentru a o apela din pluginul tău, atașeaz-o la orice hook care rulează mai târziu decât wp_enqueue_scripts, cum am menționat mai sus, precum wp_head:

add_action( 'wp_head', 'wpse_233142_process_list');

function wpse_233142_process_list() {

    $all_the_scripts_and_styles = crunchify_print_scripts_styles();
    // procesează array-ul aici

}
25 iul. 2016 17:57:57
Comentarii

Mulțumesc @Andy, dar ceea ce vreau să fac este să obțin aceste valori în interiorul unui plugin. Plugin-ul meu va returna aceste valori sub format json.

Edouard Kombo Edouard Kombo
25 iul. 2016 18:03:37

Atunci pune $all_the_scripts_and_styles = crunchify_print_scripts_styles(); în interiorul plugin-ului tău! Am ajustat răspunsul pentru a se potrivi.

Andy Macaulay-Brook Andy Macaulay-Brook
25 iul. 2016 18:06:41

Nu funcționează, ambele scripturi și stiluri sunt goale. Se pare că global wp_scripts global wp_styles sunt complet goale. Dar funcționează cu un do_action sau apply_filters

Edouard Kombo Edouard Kombo
25 iul. 2016 18:15:58

Îți apelezi funcția mai târziu decât acțiunea wp_enqueue_scripts așa cum am recomandat inițial?

Andy Macaulay-Brook Andy Macaulay-Brook
25 iul. 2016 18:17:36

Am extins răspunsul pentru a clarifica acest aspect.

Andy Macaulay-Brook Andy Macaulay-Brook
25 iul. 2016 18:21:00

WOWWW!!! Mulțumesc mult, funcționează PERFECT!!!!!!! Cum pot implementa această nouă funcție wpse_233142_process_list în plugin-ul meu? Trebuie să aibă același nume?

Edouard Kombo Edouard Kombo
25 iul. 2016 19:04:49

Redenumește-l cum dorești, atâta timp cât îl redenumești și în apelul filtrului. Și nu ezita să accepți răspunsul ;-)

Andy Macaulay-Brook Andy Macaulay-Brook
25 iul. 2016 21:56:31

Ok, îmi cer scuze, dar acest cod funcționează corect într-o temă, dar nu și într-un plugin. Încă investighez motivul, odată găsit voi împărtăși rezultatul.

Edouard Kombo Edouard Kombo
27 iul. 2016 12:34:34

Dacă tot codul tău rulează prin hook-uri, nu ar trebui să fie nicio diferență.

Andy Macaulay-Brook Andy Macaulay-Brook
27 iul. 2016 12:37:29

Am actualizat postarea inițială cu codul principal al plugin-ului meu, dacă vrei să arunci o privire...

Edouard Kombo Edouard Kombo
27 iul. 2016 12:58:24

continuăm această discuție în chat.

Edouard Kombo Edouard Kombo
27 iul. 2016 13:01:57

Nu pot intra în chat acum. Dar se pare că apelezi funcția ta pe două hook-uri diferite și când o apelezi pe init, atunci niciun script sau stil nu va fi încărcat. Nu m-am uitat deloc la REST API, așa că acolo mă pierd, dar trebuie să apelezi codul meu cât mai târziu cum am discutat. Ține minte că niciun script sau stil nu este necesar sau dorit la un apel API, așa că este posibil ca niciunul să nu fie încărcat în acel context și astfel nu vei avea nimic de listat.

Andy Macaulay-Brook Andy Macaulay-Brook
27 iul. 2016 13:07:59

În prezent caut cum să fac ca hook-urile mele să se execute ultimele, pentru că nu văd altă soluție

Edouard Kombo Edouard Kombo
27 iul. 2016 13:26:23
Arată celelalte 8 comentarii
0
17

Puteți folosi acțiunile wp_print_scripts și wp_print_styles pentru a accesa la timp și corect scripturile și stilurile înregistrate, deoarece aceste acțiuni sunt ultimele evenimente înainte ca scripturile și stilurile să fie incluse în document și, din acest motiv, ultimul moment în care modificările aduse la $wp_styles sau $wp_scripts ar putea avea efect asupra stilurilor și scripturilor incluse în document.

Prin urmare, acestea sunt evenimentele în care puteți fi cel mai siguri că $wp_styles și $wp_scripts conțin scripturile și stilurile care vor fi efectiv incluse în document.

add_action( 'wp_print_scripts', 'cyb_list_scripts' );
function cyb_list_scripts() {
    global $wp_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $wp_scripts->registered[$handle]->src;
    }
}
add_action( 'wp_print_styles', 'cyb_list_styles' );
function cyb_list_styles() {
    global $wp_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $wp_styles->registered[$handle]->src;
    }
}

Dacă declarați $enqueued_scripts și $enqueued_styles ca variabile globale (sau orice alt domeniu valid, de exemplu le puteți stoca într-o proprietate a unei metode), puteți accesa lista de scripturi și stiluri într-o acțiune ulterioară.

De exemplu (doar un exemplu rapid):

global $enqueued_scripts;
global $enqueued_styles;

add_action( 'wp_print_scripts', 'cyb_list_scripts' );
function cyb_list_scripts() {
    global $wp_scripts;
    global $enqueued_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $wp_scripts->registered[$handle]->src;
    }
}
add_action( 'wp_print_styles', 'cyb_list_styles' );
function cyb_list_styles() {
    global $wp_styles;
    global $enqueued_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $wp_styles->registered[$handle]->src;
    }
}

add_action( 'wp_head', function() {
    global $enqueued_scripts;
    var_dump( $enqueued_scripts );
    global $enqueued_styles;
    var_dump( $enqueued_styles );
} );
25 iul. 2016 19:15:41
2

soluția mea pentru aceasta este:

  • creează un câmp de opțiuni în baza de date
  • activează sesiunile și securizează-le

Funcții pe care le-am folosit

Am început cu două funcții de la utilizatorul cybmeta: doar adaugă un handler la rezultat.

function theme_list_scripts() {

    global $wp_scripts;
    global $enqueued_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $handle." | ".$wp_scripts->registered[$handle]->src;
    }
    return $enqueued_scripts;


}

function theme_list_styles() {

    global $wp_styles;
    global $enqueued_styles;
    $enqueued_styles = array();
    foreach( $wp_styles->queue as $handle ) {
        $enqueued_styles[] = $handle." | ".$wp_styles->registered[$handle]->src;
    }
    return $enqueued_styles;

}

add_action( 'wp_print_scripts', 'wpcustom_inspect_scripts_and_styles' );

function wpcustom_inspect_scripts_and_styles(){

    $loadet_list = array();

    $loadet_list["style"] = implode( " ; ",theme_list_styles() );

    $loadet_list["script"] = implode( " ; ",theme_list_scripts() );

    $_SESSION["front-end-list"] = implode("{}",$loadet_list);  


}

function front_loadet_files_list(){

    update_option( 'front_incl_list', $_SESSION["front-end-list"] );

} 

în fișierul header apelează după wp_head() înainte de închiderea tag-ului head :

front_loadet_files_list(); 

pe partea de admin în fișierul template unde vrei să afișezi :

obține datele din câmpul de opțiuni din baza de date

$loadet_list = prep_front_list("front-end-list");

apelează pentru afișare

display_front_list($loadet_list["styles"]);

display_front_list($loadet_list["scripts"]);

rezultatulvizualizare rezultat

9 apr. 2020 13:51:18
Comentarii

asta distruge experiența pe Stackexchange. Învață să scrii cod corect formatat. Poți cauza mai multe probleme decât soluții aruncând cod complet neformatat.

Altin Altin
13 sept. 2020 14:33:43

Se pare singura soluție viabilă dintre toate răspunsurile. Totuși, ar fi bine să scăpăm de variabila $_SESSION.

Serhiy Zaharchenko Serhiy Zaharchenko
24 dec. 2021 11:00:21
2

Dacă chiar dorești să obții o listă cu toate stilurile, poți folosi noul filtru 'script_loader_tag' (disponibil începând cu Versiunea 4.1).

"wp_print_scripts" este:

Apelat de admin-header.php și hook-ul 'wp_head'.

Adică nu arată scripturile din footer.

Referințe:

Adăugarea Atributelor Defer & Async la Scripturile WordPress

wp_print_scripts

18 ian. 2019 11:26:22
Comentarii

Ai poate un exemplu cum să folosești asta?

lonix lonix
15 ian. 2020 12:01:00

Bună :) Poate acest articol te poate ajuta Fă-ți site-ul mai rapid cu JavaScript Async și Deferred: Introducere în script_loader_tag

theuberdog theuberdog
18 feb. 2020 19:18:33
0

pentru a obține scripturile înregistrate ai nevoie de funcția wp_scripts() iar pentru a obține toate stilurile încărcate poți folosi funcția wp_styles(). Atribuirea unei priorități adecvate este de asemenea un aspect important pentru a te asigura că listezi scripturile după ce toate au fost înregistrate

ceva de genul:

<?php

/*
Plugin name: My Plugin to list scripts and styles
*/


add_action( 'wp_enqueue_scripts', 'my_plugin_print_styles',  PHP_INT_MAX );

function my_plugin_print_styles(){
    $wp_scripts = wp_scripts();
    $wp_styles = wp_styles();
    var_dump($wp_scripts);
    var_dump($wp_styles);
}
30 sept. 2021 19:14:30