web-dev-qa-db-fra.com

Obtenir la liste des scripts mis en file d'attente/enregistrés pour un article spécifique?

J'explore comment créer un thème où la plupart des pages sont chargées à l'aide de l'API Rest. Je peux charger la page d'index et à partir de là faire des requêtes GET pour obtenir des données JSON de publications et, ensuite, créer leur contenu dans la page actuelle. Fondamentalement, un SPA , au moins dans une certaine mesure.

Le problème survient lorsque vous essayez de charger une publication et ses scripts/styles. Par exemple, Gutenberg permet de charger un script et/et un style pour chaque bloc enregistré en utilisant le hook enqueue_block_assets.

J'essaie de trouver un moyen d'obtenir les styles et les scripts enregistrés pour une publication spécifique. Mon idée est d’enregistrer une route reste ou un champ qui renvoie l’url de chaque script/style. Je peux ensuite attacher chaque script/style au DOM, après le montage des données de publication unique JSON.

global $wp_scripts; renvoie les scripts enregistrés ainsi que ceux mis en file d'attente lors du chargement de la page en cours. Je ne pouvais donc pas trouver un moyen d'obtenir cette information en spécifiant l'identifiant de la publication en dehors du flux de chargement d'une page.

Comment puis-je obtenir la liste des scripts en attente/enregistrés et des styles pour un identifiant de message spécifique?

ou

Est-ce qu'il y a une meilleure approche?

4
Alvaro

Je ne connais pas bien Gutenberg, mais comme vous l'avez mentionné à titre d'exemple, je suppose que vous ne vouliez pas dire "seulement" Gutenberg.

Les fonctions wp_enqeue_script() ou wp_enqueue_style() n'acceptent pas les arguments relatifs aux publications ou aux pages. Les scripts sont enregistrés et rendus globalement. Si un script est affiché uniquement sur certaines publications, il doit alors s'agir d'une conditionnelle native PHP, qui n'est pas facile à déterminer.

Une idée serait d'inclure uniquement un fichier index.php dans votre thème et d'y ajouter uniquement wp_head() et wp_footer(). Ensuite, à chaque demande de repos, extrayez le contenu de la page HTML réelle à l'aide de wp_remote_get() et exécutez preg_match_all() pour extraire tous les scripts de cette page et ajoutez-le à vos champs de repos. C'est un peu désordonné, mais fiable.

N'oubliez pas de mettre en cache les résultats dans un cache transitoire ou dans un cache d'objet pour améliorer les performances.

Voici un exemple de base sur la façon de le faire:

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

}
2
Jack Johansson