Recuperar URL de Script/Estilo e Dependências
Dado o script XY e Z, como eu obteria a lista em PHP de XYZ e suas dependências?
Preciso carregar vários scripts que possuem dependências.
Normalmente eu faria isso via wp_enqueue_script
, mas nesta situação eu preciso carregar esses scripts em um shadow DOM para um webcomponent, e não posso confiar em wp_head
e wp_footer
, eu mesmo tenho que construir os elementos DOM em JS. Isso ocorre para que o conteúdo do componente seja isolado do restante da página para fins de estilo.
Respostas
wp_enqueue_script()
e wp_enqueue_style()
ambos usam o WP_Dependencies::add()que inicializa uma nova instância de _WP_Dependency(consulte wp_scripts()e wp_styles()), portanto, todas as dependências do script são armazenadas na deps
propriedade da instância da classe.
No entanto, essa propriedade armazena apenas os nomes de identificador das dependências do script, por exemplo, jquery-migrate
e jquery-core
para o script jQuery padrão/principal (nome do identificador: jquery
), portanto, para obter a URL real de um arquivo de dependência (script/folha de estilo), precisaríamos usar WP_Dependencies::all_deps()e, em seguida, faça um loop WP_Dependencies::$to_do
para obter o valor da dependência src
:
// Enqueue a script:
wp_enqueue_script( 'my-script', '/path/to/file.js', [ 'jquery' ] );
// Get all its dependencies:
wp_scripts()->all_deps( 'my-script' );
foreach ( wp_scripts()->to_do as $handle ) {
$dep = wp_scripts()->registered[ $handle ];
var_dump( $dep->handle, $dep->src );
// or do something with $dep->src ...
}
// Enqueue a style:
wp_enqueue_style( 'my-style', '/path/to/file.css', [ 'foo-dep' ] );
// Get all its dependencies:
wp_styles()->all_deps( 'my-style' );
foreach ( wp_styles()->to_do as $handle ) {
$dep = wp_styles()->registered[ $handle ];
var_dump( $dep->handle, $dep->src );
// or do something with $dep->src ...
}
Observe que $dep->src
pode ser a false
se a dependênciajquery
contiver uma dependência, por exemplo, o identificador padrão que possui jquery-migrate
uma dependência. (Mas não se preocupe, as dependências estarão no to_do
array.) E em segundo lugar, o to_do
array também inclui o arquivo real, por exemplo, file.js
no exemplo acima.