ฉันจะรับรายการสคริปต์และสไตล์ที่จัดคิวทั้งหมดได้อย่างไร


12

ฉันกำลังสร้างปลั๊กอินและฉันต้องการรับรายการสคริปต์และ CSS ทั้งหมดที่ใช้โดยปลั๊กอินอื่น ๆ

นี่คือฟังก์ชั่นของฉัน:

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

ฉันต้องการรับค่าที่ส่งคืนภายในตัวแปร

ฉันลองสิ่งนี้:

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

และนี่คือผลลัพธ์ของฉัน:

NULL

ถ้าฉันเขียนechoทุกforeachวงฉันจะได้ผลลัพธ์ที่ถูกต้อง แต่จะเก็บค่าเหล่านี้ไว้ในตัวแปรได้อย่างไร

[แก้ไข]

รหัสของฉันอยู่ในส่วนเสริมซึ่งไม่ทำงานเช่นกัน

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

1
do_actionไม่ส่งคืนผลลัพธ์และนอกจากนี้การกระทำได้เกิดขึ้นที่wp_enqueue_scripts... ง่ายขึ้นเพียงแค่สร้างโลกเช่น global $crunchifyenqueued; $crunchifyenqueued = $result;จากนั้นเรียกใช้โกลบอลอีกครั้งในฟังก์ชันภายหลังเพื่อเข้าถึงตัวแปร
majick

ขอบคุณสำหรับคำตอบของคุณ แต่ไม่ได้แก้ปัญหาการตอบสนองสำหรับ var_dump ($ crunchifyenqueued) คือ "NULL"
Edouard Kombo

แล้วทำไมไม่ใช้apply_filtersล่ะ คุณสามารถรับค่าตอบแทนจากสิ่งนั้นได้อย่างง่ายดาย
majick

ฉันลองแล้วฉันไม่สามารถบันทึกผลลัพธ์ภายในตัวแปรได้
Edouard Kombo

แน่นอนว่าคุณสามารถทำได้ด้วยการใช้ทั่วโลก?
majick

คำตอบ:


11

do_actionไม่ทำงานอย่างนั้น เมื่อคุณเรียกdo_action('crunchify_print_scripts_styles')WP ดูรายการของการกระทำที่ลงทะเบียนและตัวกรองสำหรับสิ่งที่แนบมากับเบ็ดที่เรียกว่าcrunchify_print_scripts_stylesแล้วเรียกใช้ฟังก์ชั่นเหล่านั้น

และคุณอาจต้องการลบสิ่งนี้:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... เพราะคุณไม่สามารถรับผลตอบแทนจากการทำงานของคุณได้

นอกจากนี้เมื่อคุณใช้เบ็ดนี้คุณไม่สามารถรับประกันได้ว่าฟังก์ชั่นอื่น ๆ จะไม่จัดคิวสคริปต์หรือสไตล์เพิ่มเติมหลังจากที่คุณสร้างรายการของคุณ ใช้เบ็ดที่ยิงหลังจากสคริปต์และสไตล์ทั้งหมดได้รับการจัดคิวเช่น wp_head เพื่อความสะดวกหรือยังดีกว่าเพียงแค่เรียกใช้ฟังก์ชันของคุณภายในธีมของคุณเมื่อคุณต้องการแสดงผลลัพธ์

ทำใหม่รหัสของคุณเช่นนี้ควรจะทำงาน ...

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

จากนั้นภายในธีมของคุณ:

print_r( crunchify_print_scripts_styles() );

... จะแสดงผลลัพธ์สำหรับการดีบักหรือแน่นอน ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... จะให้รายการคุณจัดการ

การโทรเข้ามาในชุดรูปแบบทำให้แน่ใจว่าคุณเรียกมันได้หลังจากสคริปต์และรูปแบบทั้งหมดได้รับการจัดคิว

หากต้องการโทรจากปลั๊กอินของคุณให้แนบกับตะขอใด ๆ ที่ทำงานช้ากว่า wp_enqueue_scripts เช่น wp_head ดังที่ฉันได้กล่าวไว้ข้างต้น:

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 แต่สิ่งที่ฉันต้องการทำคือรับค่าเหล่านี้ภายในปลั๊กอิน ปลั๊กอินของฉันจะคืนค่าเหล่านี้ในรูปแบบ json
Edouard Kombo

จากนั้นใส่$all_the_scripts_and_styles = crunchify_print_scripts_styles();ในปลั๊กอินของคุณ! Tweaked คำตอบเพื่อให้เหมาะกับ
Andy Macaulay-Brook

ไม่ทำงานทั้งสคริปต์และสไตล์ว่างเปล่า ดูเหมือนว่าglobal wp_scripts global wp_stylesจะว่างเปล่าโดยสิ้นเชิง แต่พวกเขาทำงานกับdo_action or apply_filters
Edouard Kombo

คุณเรียกฟังก์ชั่นของคุณช้ากว่าwp_enqueue_scriptsแอ็คชั่นตามที่ฉันแนะนำไว้ในตอนแรก
Andy Macaulay-Brook

ฉันได้ขยายคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
Andy Macaulay-Brook

7

คุณสามารถใช้wp_print_scriptsและwp_print_stylesการกระทำเพื่อเข้าถึงสคริปต์และสไตล์ที่เหมาะสมทันเวลาและเหมาะสมเนื่องจากการกระทำเหล่านี้เป็นเหตุการณ์สุดท้ายก่อนที่สคริปต์และสไตล์จะรวมอยู่ในเอกสารและเนื่องจากเหตุการณ์ล่าสุดที่มีการแก้ไข$wp_stylesหรือ$wp_scriptsอาจมีผลต่อสไตล์ และสคริปต์ที่รวมอยู่ในเอกสาร

ดังนั้นจึงเป็นกิจกรรมที่คุณมั่นใจมากขึ้น$wp_stylesและ$wp_scriptsมีสคริปต์และสไตล์ที่รวมอยู่ในเอกสารอย่างมีประสิทธิภาพ

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

ถ้าคุณประกาศ$enqueued_scriptsADN $enqueued_stylesเป็นตัวแปรทั่วโลก (หรือขอบเขตที่ถูกต้องอื่น ๆ ตัวอย่างเช่นคุณสามารถเก็บไว้ในสถานที่ให้บริการของวิธีการ) คุณสามารถเข้าถึงไปยังรายการของสคริปต์และรูปแบบในการดำเนินการในภายหลัง

ตัวอย่างเช่น (เป็นเพียงตัวอย่างด่วน):

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

0

หากคุณต้องการรับรายการสไตล์ทั้งหมดอย่างแท้จริงคุณสามารถใช้ตัวกรองใหม่'script_loader_tag' (ตั้งแต่เวอร์ชั่น 4.1)

"wp_print_scripts" คือ:

เรียกว่าโดย admin-header.php และ 'wp_head' hook

เช่นจะไม่แสดงสคริปต์ในส่วนท้าย

อ้างอิง:

เพิ่มคุณสมบัติเลื่อนและ Async ให้กับสคริปต์ของ WordPress

wp_print_scripts


คุณอาจมีตัวอย่างวิธีใช้สิ่งนี้หรือไม่?
lonix

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.