web-dev-qa-db-fra.com

Est-il possible de filtrer les scripts wp_footer (), de lire le contenu et de les insérer en ligne?

J'ai besoin d'intercepter les scripts ajoutés dans le pied de page et de passer par les fonctions wp_footer() et wp_head(), quelque chose comme add_filter('wp_footer', my_function), puis dans my_function, je vérifie le nom du script enregistré, puis effectue une action, dans ce cas, le contenu du fichier script.js sera lu et inséré en ligne, comme ceci:

Avant l’interception (sur le pied de page ou sur la tête):

<script type="text/javascript" src="mywp/wp-content/plugins/plugin-name/script.js">

Après l'interception, je veux montrer le script en ligne comme ceci:

<script>
    // this is content of plugin script.js or other intercepted scripts...
    var content_is_here = ....
    function() {
        // content inline etc
    ...
    }
</script>

Est-ce possible de faire ça? Lors de l'interception, j'ai besoin du nom du script et du chemin pour lire le contenu et insérer en ligne, je sais le faire, mais je ne sais pas comment intercepter les scripts ...

S'il est possible d'intercepter des fichiers CSS aussi, ce serait très bien!

Merci d'avance!

2
rafaelfndev

Pour les scripts, vous pouvez utiliser le filtre script_loader_tag , qui est exécuté juste avant la sortie de la balise script. Il filtre la balise HTML <script>, mais transmet également le descripteur et l'URL que vous pouvez utiliser pour extraire le contenu et remplacer la balise de script par une version comportant le script en ligne:

function wpse_292955_inline_script( $script, $handle, $src ) {
    if ( $handle === 'script-handle' ) {
        $script = sprintf( '<script type="text/javascript">%s</script>', file_get_contents( $src ) );
    }

    return $script;
}
add_filter( 'script_loader_tag', 'wpse_292955_inline_script', 10, 3 );

Il y a aussi style_loader_tag pour les styles:

function wpse_292955_inline_style( $html, $handle, $href, $media ) {
    if ( $handle === 'style-handle' ) {
        $html = sprintf( 
            '<style type="text/css" media="%s">%s</style>', 
            esc_attr( $media ),
            file_get_contents( $href )
        );
    }

    return $html;
}
add_filter( 'style_loader_tag', 'wpse_292955_inline_style', 10, 4 );

Notez que, puisque les scripts et les styles sont enregistrés avec une URL, votre serveur devra accéder à cette URL pour que file_get_contents() fonctionne, de sorte qu'elle ne fonctionnera probablement pas dans un environnement de développement local.

3
Jacob Peattie