Làm thế nào tôi có thể có được một danh sách tất cả các kịch bản và phong cách mê hoặc?


12

Tôi đang tạo một plugin và tôi muốn lấy danh sách tất cả các tập lệnh và CSS được sử dụng bởi các plugin khác.

Đây là chức năng của tôi:

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

Tôi muốn nhận được giá trị trả về bên trong một biến.

Tôi đã thử điều này:

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

Và đây là kết quả của tôi:

NULL

Nếu tôi viết echobên trong mỗi foreachvòng lặp, tôi sẽ nhận được kết quả chính xác, nhưng làm thế nào để lưu trữ các giá trị này bên trong một biến?

[biên tập]

Mã của tôi bên trong một plugin không hoạt động quá

/**
 *  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_actionkhông trả về kết quả, và bên cạnh đó, hành động đã diễn ra tại wp_enqueue_scripts... dễ dàng hơn chỉ để tạo ra một toàn cầu, ví dụ. global $crunchifyenqueued; $crunchifyenqueued = $result;sau đó một lần nữa gọi toàn cầu trong hàm sau của bạn để truy cập vào biến.
Majick

Cảm ơn câu trả lời của bạn, nhưng nó không giải quyết được vấn đề, phản hồi cho var_dump ($ crunchifyenqueued) là "NULL".
Edouard Kombo

vậy tại sao không sử dụng apply_filters? bạn có thể dễ dàng nhận được giá trị trả về từ đó.
Majick

Tôi đã thử, tôi không thể lưu kết quả bên trong một biến.
Edouard Kombo

Tất nhiên bạn có thể bằng cách sử dụng toàn cầu?
Majick

Câu trả lời:


11

do_actionkhông hoàn toàn làm việc như thế Khi bạn gọi do_action('crunchify_print_scripts_styles')WP, hãy xem danh sách các hành động và bộ lọc đã đăng ký của nó cho bất kỳ hành động nào được gắn vào một hook được gọi crunchify_print_scripts_stylesvà sau đó chạy các chức năng đó.

Và bạn có thể muốn loại bỏ điều này:

add_action( 'wp_enqueue_scripts', 'crunchify_print_scripts_styles');

... bởi vì bạn không thể nhận được kết quả trả về của hàm.

Ngoài ra, khi bạn sử dụng hook đặc biệt này, bạn không thể đảm bảo rằng các chức năng khác không tranh thủ thêm các tập lệnh hoặc kiểu sau khi bạn đã tạo danh sách của mình. Sử dụng một cái móc kích hoạt sau khi tất cả các tập lệnh và kiểu đã được xử lý, chẳng hạn như wp_head, để thuận tiện hoặc tốt hơn là chỉ gọi hàm của bạn trong chủ đề của bạn khi bạn muốn hiển thị kết quả.

Làm lại mã của bạn như thế này sẽ hoạt động ...

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

Sau đó, trong chủ đề của bạn:

print_r( crunchify_print_scripts_styles() );

... sẽ cho bạn thấy kết quả để gỡ lỗi, hoặc dĩ nhiên ...

$all_the_scripts_and_styles = crunchify_print_scripts_styles();

... sẽ cung cấp cho bạn danh sách để thao tác.

Gọi nó trong chủ đề đảm bảo bạn gọi nó sau khi tất cả các kịch bản và phong cách được mê hoặc.

Để gọi nó từ plugin của bạn, hãy gắn nó vào bất kỳ hook nào chạy muộn hơn wp_enqueue_scripts, như wp_head như tôi đã đề cập ở trên:

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

}

Cảm ơn @Andy, nhưng điều tôi muốn làm là có được những giá trị này bên trong một plugin. Plugin của tôi sẽ trả về các giá trị này dưới định dạng json.
Edouard Kombo

Sau đó đặt $all_the_scripts_and_styles = crunchify_print_scripts_styles();bên trong plugin của bạn! Tinh chỉnh câu trả lời cho phù hợp.
Andy Macaulay-Brook

Nó không hoạt động, cả kịch bản và kiểu đều trống. Có vẻ như global wp_scripts global wp_styleshoàn toàn trống rỗng. Nhưng họ làm việc với mộtdo_action or apply_filters
Edouard Kombo

Bạn có gọi chức năng của bạn muộn hơn wp_enqueue_scriptshành động như tôi đề xuất ban đầu không?
Andy Macaulay-Brook

Tôi đã mở rộng câu trả lời để làm cho nó rõ ràng hơn.
Andy Macaulay-Brook

7

Bạn có thể sử dụng wp_print_scriptswp_print_styleshành động để truy cập kịp thời và đúng cách vào các tập lệnh và kiểu được yêu thích, vì những hành động này là sự kiện cuối cùng trước khi tập lệnh và kiểu được đưa vào tài liệu và do đó, sự kiện cuối cùng có sửa đổi $wp_styleshoặc $wp_scriptscó thể ảnh hưởng đến kiểu và các kịch bản có trong tài liệu.

Vì vậy, chúng là những sự kiện mà bạn có thể tự tin hơn $wp_styles$wp_scriptschứa các tập lệnh và kiểu có hiệu quả trong tài liệu.

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

Nếu bạn khai báo $enqueued_scriptsadn $enqueued_styleslà biến toàn cục (hoặc bất kỳ phạm vi hợp lệ nào khác, ví dụ: bạn có thể lưu trữ nó trong thuộc tính của phương thức), bạn có thể truy cập vào danh sách tập lệnh và kiểu trong một hành động sau.

Ví dụ (chỉ là một ví dụ nhanh):

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

Nếu bạn thực sự muốn có một danh sách tất cả các kiểu, bạn có thể sử dụng bộ lọc 'script_loader_tag' mới (Kể từ Phiên bản 4.1).

"Wp_print_scripts" là:

Được gọi bởi admin-header.php và hook 'wp_head'.

tức là nó không hiển thị các tập lệnh ở chân trang.

Người giới thiệu:

Thêm thuộc tính Defer & Async vào tập lệnh WordPress

wp_print_scripts


Bạn có thể có một ví dụ làm thế nào để sử dụng này?
lonix

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.