대기열에 포함 된 모든 스크립트 및 스타일 목록을 어떻게 얻을 수 있습니까?


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;그런 다음 나중에 함수에서 global을 다시 호출하여 변수에 액세스하십시오.
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_head와 같이 wp_enqueue_scripts 이후에 실행되는 후크에 연결하십시오.

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();플러그인 안에 넣으 십시오! 대답을 맞게 조정했습니다.
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_scriptswp_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'훅에 의해 호출됩니다.

즉, 바닥 글에 스크립트가 표시되지 않습니다.

참고 문헌 :

워드 프레스 스크립트에 지연 및 비동기 속성 추가

wp_print_scripts


이것을 사용하는 방법에 대한 예가 있습니까?
lonix

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.