Bagaimana saya bisa mendapatkan daftar semua skrip dan gaya enqueued?

12

Saya membuat plugin dan saya ingin mendapatkan daftar semua skrip dan CSS yang digunakan oleh plugin lain.

Ini adalah fungsi saya:

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

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (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');

Saya ingin mendapatkan nilai yang dikembalikan di dalam variabel.

Saya mencoba ini:

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

Dan inilah hasil saya:

NULL

Jika saya menulis echodi dalam setiap foreachloop, saya mendapatkan hasil yang benar, tetapi bagaimana cara menyimpan nilai-nilai ini di dalam variabel?

[sunting]

Kode saya di dalam pluginm yang tidak berfungsi juga

/**
 *  Get all scripts and styles from Wordpress
 */
function print_scripts_styles() {

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

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
        $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (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');

/**
 * Init JSON REST API Assets routes.
 *
 * @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' );
Edouard Kombo
sumber
1
do_actiontidak memberikan hasil, dan selain itu, tindakan sudah terjadi di wp_enqueue_scripts... lebih mudah hanya untuk membuat global, misalnya. global $crunchifyenqueued; $crunchifyenqueued = $result;sekali lagi panggil global dalam fungsi Anda nanti untuk mengakses variabel.
Majick
Terima kasih atas jawaban Anda, tetapi itu tidak menyelesaikan masalah, respons untuk var_dump ($ crunchifyenqueued) adalah "NULL".
Edouard Kombo
jadi mengapa tidak menggunakannya apply_filters? Anda dapat dengan mudah mendapatkan nilai pengembalian dari itu.
Majick
Saya sudah mencoba, saya tidak bisa menyimpan hasilnya di dalam variabel.
Edouard Kombo
tentu Anda bisa dengan menggunakan global?
Majick

Jawaban:

11

do_actiontidak cukup bekerja seperti itu. Saat Anda menelepon, do_action('crunchify_print_scripts_styles')WP melihat daftar tindakan dan filter terdaftar untuk apa pun yang dilampirkan pada sebuah pengait yang disebut crunchify_print_scripts_stylesdan kemudian menjalankan fungsi-fungsi tersebut.

Dan Anda mungkin ingin menghapus ini:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... karena Anda tidak dapat memperoleh hasil pengembalian dari fungsi Anda.

Juga ketika Anda menggunakan pengait khusus ini, Anda tidak dapat menjamin bahwa fungsi-fungsi lain tidak membuat lebih banyak skrip atau gaya setelah Anda membuat daftar. Gunakan pengait yang diaktifkan setelah semua skrip dan gaya telah enqueued, seperti wp_head, untuk kenyamanan, atau lebih baik lagi panggil fungsi Anda di dalam tema Anda saat Anda ingin menampilkan hasilnya.

Pengerjaan ulang kode Anda seperti ini harus bekerja ...

function crunchify_print_scripts_styles() {

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

    // Print all loaded Scripts
    global $wp_scripts;
    foreach( $wp_scripts->queue as $script ) :
       $result['scripts'][] =  $wp_scripts->registered[$script]->src . ";";
    endforeach;

    // Print all loaded Styles (CSS)
    global $wp_styles;
    foreach( $wp_styles->queue as $style ) :
       $result['styles'][] =  $wp_styles->registered[$style]->src . ";";
    endforeach;

    return $result;
}

Kemudian di dalam tema Anda:

print_r( crunchify_print_scripts_styles() );

... akan menampilkan hasil untuk debugging, atau tentu saja ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... akan memberi Anda daftar untuk dimanipulasi.

Memanggilnya dalam tema memastikan Anda memanggilnya setelah semua skrip dan gaya enqueued.

Untuk memanggilnya dari plugin Anda, lampirkan ke semua kait yang berjalan lebih lambat dari wp_enqueue_scripts, seperti wp_head seperti yang saya sebutkan di atas:

add_action( 'wp_head', 'wpse_233142_process_list');

function wpse_233142_process_list() {

    $all_the_scripts_and_styles = crunchify_print_scripts_styles();
    // process your array here

}
Andy Macaulay-Brook
sumber
Terima kasih @Andy, tapi yang ingin saya lakukan adalah mendapatkan nilai-nilai ini di dalam plugin. Plugin saya akan mengembalikan nilai-nilai ini dalam format json.
Edouard Kombo
Lalu masukkan ke $all_the_scripts_and_styles = crunchify_print_scripts_styles();dalam plugin Anda! Tweaked jawaban yang sesuai.
Andy Macaulay-Brook
Tidak berfungsi, skrip dan gaya kosong. Sepertinya global wp_scripts global wp_stylesbenar-benar kosong. Tetapi mereka bekerja dengando_action or apply_filters
Edouard Kombo
Apakah Anda memanggil fungsi Anda lebih lambat dari wp_enqueue_scriptstindakan seperti yang saya rekomendasikan semula?
Andy Macaulay-Brook
Saya telah memperluas jawaban untuk membuatnya lebih jelas.
Andy Macaulay-Brook
7

Anda dapat menggunakan wp_print_scriptsdan mengambil wp_print_stylestindakan untuk mengakses skrip dan gaya dengan tepat waktu dan semestinya , karena tindakan ini adalah peristiwa terakhir sebelum skrip dan gaya disertakan dalam dokumen dan, karena itu, peristiwa terakhir di mana modifikasi $wp_stylesatau $wp_scriptsefek pada gaya dapat terjadi. dan skrip yang disertakan dalam dokumen.

Jadi, mereka adalah acara di mana Anda bisa lebih percaya diri $wp_stylesdan $wp_scriptsberisi skrip dan gaya yang secara efektif disertakan dalam dokumen.

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

Jika Anda mendeklarasikan $enqueued_scriptsdan $enqueued_stylessebagai variabel global (atau cakupan valid lainnya, misalnya Anda dapat menyimpannya di properti metode), Anda bisa mengakses daftar skrip dan gaya dalam tindakan selanjutnya.

Misalnya (hanya contoh cepat):

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 );
} );
cybmeta
sumber
0

Jika Anda benar-benar ingin mendapatkan daftar semua gaya, Anda dapat menggunakan filter 'script_loader_tag' baru (Karena Versi 4.1).

"Wp_print_scripts" adalah:

Dipanggil oleh admin-header.php dan 'wp_head' hook.

yaitu tidak menunjukkan skrip di footer.

Referensi:

Tambahkan Tunda Atribut & Async ke Script WordPress

wp_print_scripts

theuberdog
sumber
Apakah Anda mungkin punya contoh cara menggunakan ini?
Lonix