Comment ajouter l'originalité croisée et l'intégrité à wp_register_style? (Font Awesome 5)


12

Je mets à jour Font Awesome 4 vers la version 5 qui introduit à la fois des attributs d'intégrité et des origines croisées dans le <link rel="stylesheet">balisage.

Actuellement, j'utilise:

wp_register_style('FontAwesome', 'https://example.com/font-awesome.min.css', array(), null, 'all' );
wp_enqueue_style('FontAwesome');

Qui sort comme:

<link rel="stylesheet" id="FontAwesome-css" href="https://example.com/font-awesome.min.css" type="text/css" media="all" />

Avec Font Awesome 5, il introduit deux nouveaux attributs et valeurs ( integrityet crossorigin) par exemple:

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">

J'ai donc besoin de découvrir comment je peux ajouter à la fois l'intégrité et l'origine croisée à wp_register_style, j'ai essayé mais mes tentatives d'utilisation wp_style_add_dataont échoué, il semblerait que cette méthode ne supporte que conditional, rtlet suffix, altet title.



Merci @JacobPeattie, la question est un peu différente mais la réponse donnée pourrait être applicable dans ce cas. Cependant, cela remonte à 2016, il y a peut-être maintenant un moyen qui semble moins hacky ...
Pipo

@Pipo Je suis un développeur WordPress et j'ai créé quelques plugins WordPress, j'utilise beaucoup style_loader_tag et script_loader_tag pour faire un chargement personnalisé. Même en ajoutant defer et async à mes balises de script. Voir l'un de mes plugins open source: github.com/Remzi1993/wp-jquery-manager
Remzi

@Pipo Vous aviez également raison. L'autre message est obsolète et cela ne fonctionnerait plus. Dans mon premier exemple, j'ai montré comment vous pouvez le faire avec un simple remplacement de chaîne. J'ai également mis un peu plus d'informations pour que d'autres personnes puissent utiliser ces informations
Remzi Cavdar

@JacobPeattie Pourriez-vous jeter un oeil? Je pourrais avoir des erreurs de grammaire, l'anglais est ma deuxième langue
Remzi Cavdar

Réponses:


16

style_loader_tag
style_loader_tag est une API WordPress officielle, voir la documentation: https://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( 'style_loader_tag', $html, $handle, $href, $media )
Filtre la balise de lien HTML d'un style mis en file d'attente.


Mettez d'abord votre feuille de style en file d'attente, voir la documentation: https://developer.wordpress.org/reference/functions/wp_enqueue_style/

wp_enqueue_style( 'font-awesome-5', 'https://use.fontawesome.com/releases/v5.5.0/css/all.css', array(), null );

Le $handleest 'font-awesome-5'
je fais nullpour qu'il n'y ait pas de numéro de version. De cette façon, il sera mis en cache.

Simple str_replace
Un simple str_replace suffit pour réaliser ce que vous voulez, voir l'exemple ci-dessous

function add_font_awesome_5_cdn_attributes( $html, $handle ) {
    if ( 'font-awesome-5' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
    }
    return $html;
}
add_filter( 'style_loader_tag', 'add_font_awesome_5_cdn_attributes', 10, 2 );


Ajouter des attributs différents Ci-
dessous un exemple pour ajouter différents attributs à (plusieurs) feuilles de style différentes

function add_style_attributes( $html, $handle ) {

    if ( 'font-awesome-5' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
    }

    if ( 'another-style' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='blajbsf' example", $html );
    }

    if ( 'bootstrap-css' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='something-different' crossorigin='anonymous'", $html );
    }

    return $html;
}
add_filter( 'style_loader_tag', 'add_style_attributes', 10, 2 );


Ajouter des attributs à tous les styles
Ci-dessous un exemple pour ajouter les mêmes attributs à plusieurs feuilles de style

function add_attributes_to_all_styles( $html, $handle ) {

        // add style handles to the array below
        $styles = array(
            'font-awesome-5',
            'another-style',
            'bootstrap-css'
        );

        foreach ( $styles as $style ) {
            if ( $style === $handle ) {
                return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
            }
        }

        return $html;
}
add_filter( 'style_loader_tag', 'add_attributes_to_all_styles', 10, 2 );




script_loader_tag
Je voudrais également expliquer le script_loader_tag, car c'est aussi pratique, mais cette API fonctionne en combinaison avec wp_enqueue_script .

L'API script_loader_tag est presque la même, seulement quelques petites différences, voir la documentation: https://developer.wordpress.org/reference/hooks/script_loader_tag/

apply_filters( 'script_loader_tag', $tag, $handle, $src )
Filtre la balise de script HTML d'un script mis en file d'attente.


Ci-dessous un exemple pour reporter un seul script

function add_defer_jquery( $tag, $handle ) {
    if ( 'jquery' === $handle ) {
        return str_replace( "src", "defer src", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_defer_jquery', 10, 2 );


Ci-dessous un exemple pour différer plusieurs scripts

function add_defer_attribute( $tag, $handle ) {

    // add script handles to the array below
    $scripts_to_defer = array(
        'jquery',
        'jquery-migrate',
        'bootstrap-bundle-js'
    );

    foreach ( $scripts_to_defer as $defer_script ) {
        if ( $defer_script === $handle ) {
            return str_replace( "src", "defer src", $tag );
        }
    }

    return $tag;
}
add_filter( 'script_loader_tag', 'add_defer_attribute', 10, 2 );

J'ai donc expliqué à la fois les API style_loader_taget script_loader_tag. Et j'ai donné quelques exemples pour les deux API, j'espère que cela sera utile pour beaucoup de gens. J'ai de l'expérience avec les deux API.


UPDATE
@CKMacLeod Merci pour votre mise à jour, cela clarifie les choses. Nous sommes principalement sur la même page. Comme je l'ai dit, je suis un développeur WordPress et si vous souhaitez publier un thème et / ou un plugin sur https://wordpress.org, vous êtes essentiellement obligé de respecter les " normes de codage WordPress " ou ils rejetteront simplement votre thème et / ou plugin.

C'est pourquoi j'encourage les développeurs à utiliser "la manière WordPress". Je comprends que parfois il n'y a aucune différence, mais c'est aussi une question de commodité. Comme vous l'avez dit vous-même, vous pouvez télécharger Font Awesome et l'inclure dans votre thème et / ou plugin, de cette façon, vous n'auriez qu'à supprimer la fonction style_loader_tag et modifier votre fonction wp_enqueue_style.

Et une dernière chose, dans le passé (il y a 5 ans), la mise en cache, la combinaison et la réduction des plugins ne fonctionnaient pas et la plupart du temps, je découvrirais pourquoi les développeurs qui ont créé le thème ont simplement mis les choses en tête dans le thème et / ou leur fait écho. La plupart des plugins de mise en cache, qui fournissent également (la plupart du temps) des options pour combiner, réduire et retarder l'exécution des scripts, sont devenus plus intelligents et meilleurs pour détecter le mauvais code et les contourner. Mais ce n'est pas préféré. C'est pourquoi j'encourage les gens à coder avec des normes / conventions à l'esprit.

En tant que développeur, vous devez toujours prendre en considération ce que les gens pourraient faire avec votre code et en tenant compte de la compatibilité. Donc, ne prenez pas la solution facile mais la meilleure solution optimale. J'espère avoir clarifié mon point de vue.

EDIT
@CKMacLeod Merci pour le débat (technique), j'espère que vous réalisez à quel point c'est important (en utilisant les API WordPress dans votre propre développement). Encore une fois, j'ai regardé autour de moi et même maintenant, si je regarde la FAQ des plugins minify les plus populaires, je vois généralement ça dans un sens ou dans l'autre, par exemple:

Question: Pourquoi certains fichiers CSS et JS ne sont-ils pas fusionnés?
Réponse: Le plugin ne traite que les fichiers JS et CSS mis en file d'attente à l'aide de la méthode officielle de l'API WordPress - https://developer.wordpress.org/themes/basics/including-css-javascript/ - ainsi que les fichiers du même domaine (sauf indication contraire) sur les paramètres).

Voir FAQ: https://wordpress.org/plugins/fast-velocity-minify/


@Pipo Vous êtes les bienvenus :)
Remzi Cavdar

RC - Je pense que votre réponse peut être une meilleure pratique WordPress que la mienne (bien que je veuille faire plus de recherches sur la mise en file d'attente de scripts et de fichiers hébergés en externe). Néanmoins, je pense que nous devons être clairs sur nos justifications, et non les vendre à outrance, et reconnaître également que la bonne réponse pour incorporer des services tiers peut varier dans différents contextes. Sur cette note, l'autre réponse que ni l'un ni l'autre n'avons envisagé, soit dit en passant, utilise un bon plug-in - comme Better Font Awesome for FA, car ils peuvent bien gérer la mise à jour et d'autres tâches.
CK MacLeod

Oui, vous avez raison d'utiliser un plugin pour FA. Je ne sais pas seulement si cela est également préféré lorsque les développeurs créent un thème WP. Habituellement, vous voudriez tout inclure dans votre thème et utiliser le moins de plugins possible.
Remzi Cavdar


-1

L'examen de script_ et style_loader_tag par @Remzi Cavdar est intéressant, mais, au risque de provoquer une certaine indignation, et dans l'espoir que quelqu'un puisse me rappeler quel serait l'avantage d'utiliser la file d'attente WP dans des cas comme celui-ci, je '' Je vous recommande de prendre la sortie facile et de charger la feuille de style de Fontawesome via le crochet.

/* ADD FONTAWESOME 5.5.0 via action hook */
add_action( 'wp_head', 'sewpd_add_fontawesome' );

function sewpd_add_fontawesome() {

echo '
<!--FONTAWESOME 5.5.0 added via functions.php -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<!--END FONTAWESOME -->
'; 

}

Certains pourraient même affirmer que, si vous utilisez FA uniquement pour, disons, certaines icônes dans le pied de page du thème ou dans les publications, vous devez l'ajouter plus bas, dans le corps de la page, car de cette façon, il n'apparaîtra pas comme blocage de rendu, mais j'avoue que je n'ai jamais fait ça ... Et je n'irai pas jusqu'à recommander de l'ajouter directement à un fichier header.php ou à un autre fichier de modèle. Ce serait faux. ;)

MISE À JOUR

Remzi Cavdar a eu la gentillesse de répondre à ma demande de rappel pour expliquer pourquoi l'ajout d'un tag Fontawesome ou similaire via le crochet wp_head () pourrait être moins souhaitable que l'utilisation de la file d'attente WordPress. Il se réfère généralement à la notion de meilleures pratiques et un peu plus spécifiquement à l'idée que les plugins de mise en cache pourraient avoir besoin d'accéder à la feuille de style via la file d'attente.

Avant d'entrer dans les détails, je dirai que, bien que je ne sache pas de justification particulière significative autre que le fait qu'il s'agit d'une sorte de "méthode WordPress", j'aime l'approche du camarade Cavdar et je pourrai l'utiliser moi-même à l'avenir .

Cependant, ses autres prétentions à ce sujet ne sont pas convaincantes pour moi. Peut-être que lui ou quelqu'un d'autre peut y ajouter quelque chose. Si oui, je suis tout ouïe. En résumé, pour autant que je sache, après avoir exécuté plus de 20 tests sur Pingdom et GTMetrix en comparant "ajouter via la file d'attente" et "ajouter via la tête" sur un blog de test, il n'y a pas de différence significative et cohérente en termes de performances notées, nombre total de demandes de page, ou temps de chargement (par exemple, "First Paint", "First Contentful Paint" et "OnLoad" sur GTMetrix) entre les deux approches.

En ce qui concerne la mise en cache en particulier, les plug-ins de mise en cache ne peuvent pas faire grand-chose avec les fichiers hébergés en externe, qu'ils soient ajoutés ou non à la file d'attente WP. Les fichiers eux-mêmes ne seront pas affectés et votre page générera toujours une demande pour chacun.

Plus généralement, j'ai vu un large éventail d'approches différentes pour charger des scripts et des styles. Certains d'entre eux contourneront partiellement ou entièrement la file d'attente WP. Il est certainement concevable qu'il y aura des instances - une fonction qui utilise un tableau de poignées de style tout en les empêchant d'être chargées sur des pages particulières, par exemple - où avoir le Fontawesome ou un autre tag tiers mis en file d'attente sera marginalement utile, et que le déploiement initial de deux les fonctions - mise en file d'attente et filtrage - s'avéreront en fait plus parcimonieuses que de simplement en charger une.

Dans le cas de FA, la feuille de style est déjà réduite et est chargée via le propre CDN de FA. Son impact intrinsèque sur les performances sera minime, cependant, qu'il soit chargé via wp_head () ou via la file d'attente, il enregistrera toujours les démérites à plusieurs endroits sur les classeurs de performances - les mêmes, comme Google Page Speed ​​Insights et les GTMetrix et Pingdom susmentionnés, cela vous amènera un point de performance pour ne pas enregistrer quelques octets (pas même des kilo-octets) réoptimisant l'un ou l'autre fichier image.

Le chargement via wp_head plutôt que la file d'attente peut déclencher un "ordre correct des scripts et des styles" (même si quelqu'un d'autre vous classera plus haut pour le chargement du fichier hébergé en externe après ceux hébergés localement), mais, si vous êtes vraiment préoccupé par le chargement FA de la meilleure façon possible pour votre site, puis vous essayez d' héberger localement ses fichiers et sous-fichiers, à la fois son style et les polices que sa feuille de style appelle via @ font-face. Dans ce cas, vous pouvez mettre la feuille de style en file d'attente comme tout autre fichier local, la concaténer et la combiner via un plugin d'optimisation ou directement «à la main». Vous pouvez même faire vos propres modifications impressionnantes de Fontawesome et les intégrer à votre feuille de style et à votre structure de thème. Ou (comme mentionné brièvement précédemment), vous pouvez essayer des tactiques d'optimisation des performances plus exotiques, comme l'ajout de la CSS en ligne juste avant qu'elle ne soit nécessaire dans la structure d'une page spécifique.

Quoi qu'il en soit, vous n'aurez pas à vous soucier des nouvelles balises "intégrité" et "origine croisée", et vous n'aurez pas non plus à vous inquiéter si Fontawesome oublie un jour de payer sa facture CDN.

Ou vous travaillez peut-être sur un site qui est déjà un gâchis complet sous le capot, avec des feuilles de style et des scripts chargés de toutes les manières, et il pourrait être plus facile d'avoir votre dernier ajout en haut du fichier functions.php pour que vous ou le prochain développeur pourra le retrouver facilement ...


Je suis également curieux, quel est l'inconvénient de le faire de cette façon ou de l'ajouter directement à un fichier de thème?
Jersh

Merci pour votre point de vue, la seule chose est que votre solution va frustrer beaucoup de plugins de réduction et de mise en cache. Comme: wordpress.org/plugins/fast-velocity-minify , wordpress.org/plugins/wp-fastest-cache et etca ....
Remzi Cavdar

1
Les autres plugins sont capables de manipuler les feuilles de style et les scripts s'ils sont correctement mis en file d'attente, si vous mettez votre code directement dans la tête, ces plugins ne pourront pas minimiser, combiner et construire un cache avec un ordre correct.
Remzi Cavdar

Remzi Cavdar: Merci pour votre réponse, mais, avant de modifier ma réponse et d'aborder les problèmes que vous soulevez en détail, je me demande si vous en avez des exemples spécifiquement en relation avec Fontawesome ou généralement en relation avec d'autres feuilles de style comme elle, comme dans déjà minifié et hébergé en externe.
CK MacLeod

1
La "façon wordpress" assure une compatibilité maximale avec les plugins. Que ce soit pour récupérer des choses à partir de CDN ou pour supprimer le lien de certaines pages spécifiques, à votre manière, cela ne sera tout simplement pas possible sans réellement modifier le code. +1 pour représenter vos croyances mais comme réponse ici, c'est un -1
Mark Kaplun
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.