Obtém a lista de scripts enfileirados / registrados para um post específico?

4

Estou explorando como criar um tema no qual a maioria das páginas é carregada usando a API Rest. Eu posso carregar a página de índice e de lá fazer solicitações GET para obter dados json posts e depois construir seu conteúdo na página atual. Basicamente, um SPA , pelo menos até certo ponto.

O problema ocorre quando se tenta carregar uma única postagem e seus scripts / estilos. Como exemplo, o Gutenberg permite carregar um script ou / e um estilo para cada bloco registrado usando o enqueue_block_assets hook.

Estou tentando descobrir uma maneira de obter o URL de estilos e scripts registrados para uma postagem específica. Minha ideia é registrar uma rota de descanso ou um campo que retorna o URL de cada script / estilo. Em seguida, posso anexar cada script / estilo ao DOM, após a montagem dos dados do json de postagem única.

global $wp_scripts; retorna os scripts registrados e também os que estão na fila no carregamento da página atual. Por isso, não consegui encontrar uma maneira de obter essas informações especificando o ID da postagem fora do fluxo de carga de uma única página.

Como posso obter a lista de URLs de scripts e estilos enfileirados / registrados para qualquer ID de postagem específica?

ou

Existe uma abordagem melhor?

    
por Alvaro 23.11.2018 / 20:20

1 resposta

1

Eu não estou familiarizado com Gutenberg, mas como você mencionou como um exemplo, eu assumo que você não quis dizer "apenas" Gutenberg.

As funções wp_enqeue_script() ou wp_enqueue_style() não aceitam argumentos relacionados a publicações ou páginas. O script é registrado e processado globalmente. Se um script é produzido apenas em alguns posts, então ele deve ser uma condição nativa do PHP, o que não é fácil de determinar.

Uma ideia seria incluir apenas um arquivo index.php em seu tema e adicionar apenas wp_head() e wp_footer() a ele. Em seguida, em cada solicitação de pausa, busque o conteúdo da página HTML real usando wp_remote_get() e execute um preg_match_all() para extrair todos os scripts dessa página e adicioná-lo aos seus campos restantes. É meio confuso, mas confiável.

Não se esqueça de armazenar em cache os resultados em um cache transitório ou em um objeto para aumentar o desempenho.

Veja um exemplo básico de como fazer isso:

// Let's register a new field for returning the script srcs
add_action( 'rest_api_init', 'wpse320065_register_rest_field' );

function wpse320065_register_rest_field() {

    register_rest_field( 
      'post', 
      'your-field-name', 
      [
        'get_callback'    => 'wpse320065_fetch_post_cont',
        'schema'          => null,
      ]
    );
}

// Callback function to actually retrieve the data
function wpse320065_fetch_post_cont( $object ) {

    // Get the id of the post object array
    $post_id = $object['id'];

    // Let's get the content of post number 123
    $response = wp_remote_get( "http://example.com/?p={$post_id}" );

    if ( is_array( $response ) ) {

      $content = $response['body'];

      // Extract the src attributes. You can also use preg_match_all
      $document = new DOMDocument();
      $document->loadHTML( $content );

      // An empty array to store all the 'srcs'
      $scripts_array = [];

      // Store every script's source inside the array
      foreach( $document->getElementsByTagName('script') as $script ) {
        if( $script->hasAttribute('src') ) {
          $scripts_array[] = $script->getAttribute('src');
        }
      }
    }

    return $scripts_array

}
    
por Jack Johansson 28.11.2018 / 21:41