¿Obtener la lista de scripts en cola / registrados para una publicación específica?

4

Estoy explorando cómo crear un tema donde la mayoría de las páginas se cargan utilizando la API Rest. Puedo cargar la página de índice y desde allí realizar solicitudes GET para obtener datos json de las publicaciones y, después de compilar su contenido, en la página actual. Básicamente un SPA , al menos en cierta medida.

El problema surge cuando se intenta cargar una sola publicación y sus scripts / estilos. A modo de ejemplo, Gutenberg permite cargar un script y / o un estilo para cada bloque registrado utilizando el gancho enqueue_block_assets .

Estoy tratando de encontrar una manera de obtener los estilos registrados y las secuencias de comandos url para una publicación específica. Mi idea es registrar una ruta de descanso o una field que devuelve la url de cada script / estilo. Luego puedo adjuntar cada script / estilo al DOM, después de que se haya montado la única publicación de datos json.

global $wp_scripts; devuelve los scripts registrados y también los en cola en la carga de la página actual. Por lo tanto, no pude encontrar una manera de obtener esa información especificando el ID de publicación fuera del flujo de carga de una sola página.

¿Cómo puedo obtener la lista de secuencias de comandos en cola / registradas y url de estilos para cualquier ID de publicación específica?

o

¿Hay un mejor enfoque?

    
pregunta Alvaro 23.11.2018 - 20:20

1 respuesta

1

No estoy familiarizado con Gutenberg, pero como lo mencionó como ejemplo, asumo que no quiso decir "solo" Gutenberg.

Las funciones wp_enqeue_script() o wp_enqueue_style() no aceptan argumentos con respecto a publicaciones o páginas. Los guiones están registrados y renderizados globalmente. Si un script se publica solo en ciertas publicaciones, debe ser un condicional nativo de PHP, que no es fácil de determinar.

Una idea sería incluir solo un archivo index.php en tu tema, y agregar solo wp_head() y wp_footer() en él. Luego, en cada solicitud de descanso, obtenga el contenido de la página HTML real utilizando wp_remote_get() y ejecute un preg_match_all() para extraer todos los scripts de esa página, y agréguelo a sus campos de descanso. Es un poco desordenado, pero confiable.

No te olvides de almacenar en caché los resultados, ya sea en forma transitoria o en una caché de objetos para aumentar el rendimiento.

Aquí hay un ejemplo básico sobre cómo hacerlo:

// 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

}
    
respondido por el Jack Johansson 28.11.2018 - 21:41

Lea otras preguntas en las etiquetas