Jak dodać crossorigin i integralność do wp_register_style? (Font Awesome 5)


13

Aktualizuję Font Awesome 4 do wersji 5, która wprowadza <link rel="stylesheet">znaczniki do integralności i crossorigin .

Obecnie używam:

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

Które wyjścia jako:

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

W Font Awesome 5 wprowadza dwa nowe atrybuty i wartości ( integrityi crossorigin) np .:

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

Więc muszę się dowiedzieć, w jaki sposób można dodać zarówno integralności i crossorigin do wp_register_style, próbowałem, ale moje próby wykorzystania wp_style_add_datazawiodły, wydaje się, że tylko ta metoda podpory conditional, rtli suffix, alti title.



Dzięki @JacobPeattie pytanie jest nieco inne, ale podana odpowiedź może mieć zastosowanie w tym przypadku. Jednak pochodzi z 2016 roku, być może istnieje sposób, który wydaje się mniej hackerski ...
Pipo

@Pipo Jestem programistą WordPress i stworzyłem kilka wtyczek WordPress, często używam style_loader_tag i script_loader_tag, aby wykonać niestandardowe ładowanie. Nawet dodanie odroczenia i asynchronizacji do moich znaczników skryptu. Zobacz jedną z moich wtyczek typu open source: github.com/Remzi1993/wp-jquery-manager
Remzi Cavdar,

@Pipo Miałeś również rację. Drugi post jest przestarzały i to już nie działa. W moim pierwszym przykładzie pokazałem, jak możesz to zrobić za pomocą prostej zamiany łańcucha.
Podałem

@JacobPeattie Możesz rzucić okiem? Mogę mieć pewne błędy gramatyczne, angielski to mój drugi język
Remzi Cavdar,

Odpowiedzi:


16

style_loader_tag
style_loader_tag jest oficjalnym API WordPress, zobacz dokumentację: https://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( 'style_loader_tag', $html, $handle, $href, $media )
Filtruje tag HTML stylu kolejkowanego.


Najpierw uporządkuj swój arkusz stylów, zobacz dokumentację: 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 );

$handleTo 'font-awesome-5'
zrobić nulltak, że nie ma numer wersji. W ten sposób będzie buforowane.

Prosty str_replace
Prosty str_replace wystarczy, aby osiągnąć to, czego chcesz, patrz przykład poniżej

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 );


Dodaj różne atrybuty
Poniżej przykładu, aby dodać różne atrybuty do (wielu) różnych arkuszy stylów

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 );


Dodaj atrybuty do wszystkich stylów
Poniżej przykład, aby dodać te same atrybuty do więcej niż jednego arkusza stylów

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
Chciałbym również wyjaśnić skrypt_loader_tag, ponieważ jest to również przydatne, ale ten interfejs API działa w połączeniu z wp_enqueue_script .

Interfejs API script_loader_tag jest prawie taki sam, tylko z niewielkimi różnicami, zobacz dokumentację: https://developer.wordpress.org/reference/hooks/script_loader_tag/

apply_filters( 'script_loader_tag', $tag, $handle, $src )
Filtruje znacznik skryptu HTML w kolejce skryptu.


Poniżej przykład odłożenia pojedynczego skryptu

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 );


Poniżej przykład odroczenia więcej niż jednego skryptu

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 );

Wyjaśniłem więc zarówno API, jak style_loader_tagi script_loader_tag. Podałem kilka przykładów obu interfejsów API. Mam nadzieję, że jest to przydatne dla wielu osób. Mam doświadczenie w obu interfejsach API.


AKTUALIZACJA
@CKMacLeod Dziękujemy za aktualizację, która wyjaśnia wszystko. Przeważnie jesteśmy na tej samej stronie. Jak powiedziałem, jestem programistą WordPress i jeśli chcesz opublikować motyw i / lub wtyczkę na https://wordpress.org , jesteś zasadniczo zmuszony do przestrzegania „ Standardów kodowania WordPress ” lub po prostu odrzuci twój motyw i / lub wtyczka.

Dlatego zachęcam programistów do korzystania z „sposobu WordPressa”. Rozumiem, że czasami nie ma żadnych różnic, ale jest to również wygoda. Jak sam powiedziałeś, możesz pobrać Font Awesome i dołączyć go do motywu i / lub wtyczki, w ten sposób wystarczy usunąć funkcję style_loader_tag i zmodyfikować funkcję wp_enqueue_style.

I ostatnia rzecz, w przeszłości (5 lat temu) niektóre buforowanie, łączenie i minimalizowanie wtyczek nie działało i przez większość czasu dowiedziałem się, dlaczego programiści, którzy stworzyli ten motyw, po prostu wrzucali to do głowy i / lub echo. Większość wtyczek buforujących, które również (przez większość czasu) zapewniają opcje łączenia, minimalizowania i opóźniania wykonywania skryptów, stały się mądrzejsze i lepiej wykrywają zły kod i obchodzą je. Ale to nie jest preferowane. Dlatego zachęcam ludzi do kodowania z myślą o standardach / konwencjach.

Jako programista zawsze musisz wziąć pod uwagę to, co ludzie mogą zrobić z twoim kodem i wziąć pod uwagę kompatybilność. Więc nie biorąc łatwego rozwiązania, ale najlepsze optymalne rozwiązanie. Mam nadzieję, że wyjaśniłem swój punkt widzenia.

EDYCJA
@CKMacLeod Dziękuję za debatę (techniczną), mam nadzieję, że zdajesz sobie sprawę z tego, jak ważna jest to (używając API WordPressa we własnym rozwoju). Znowu rozglądałem się i nawet teraz, gdy patrzę na najczęściej zadawane pytania dotyczące najpopularniejszych wtyczek minify, zwykle widzę to w ten lub inny sposób, na przykład:

Pytanie: Dlaczego niektóre pliki CSS i JS nie są scalane?
Odpowiedź: Wtyczka przetwarza tylko pliki JS i CSS kolejkowane przy użyciu oficjalnej metody API WordPress - https://developer.wordpress.org/themes/basics/inclusion-css-javascript/ - jak również pliki z tej samej domeny (chyba że określono inaczej w ustawieniach).

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


@Pipo Nie ma za co :)
Remzi Cavdar

RC - Myślę, że twoja odpowiedź może być ogólnie lepszą praktyką WordPressa niż moja (chociaż będę chciał przeprowadzić więcej badań nad kolejkowaniem skryptów i plików hostowanych na zewnątrz). Uważam jednak, że powinniśmy jasno określać nasze uzasadnienia, a nie przesadzać z nimi, a także przyznać, że właściwa odpowiedź na włączenie usług stron trzecich może się różnić w różnych kontekstach. W tej notatce, druga odpowiedź, która, nawiasem mówiąc, nie rozważała, używa dobrej wtyczki - jak Better Font Awesome dla FA, ponieważ mogą dobrze radzić sobie z aktualizacją i innymi zadaniami.
CK MacLeod

Tak, masz rację, używając wtyczki do FA. Nie wiem tylko, czy jest to również preferowane, gdy deweloperzy tworzą motyw WP. Zwykle chcesz uwzględnić wszystko w swoim motywie i używać mniej wtyczek, jak to możliwe od razu po wyjęciu z pudełka.
Remzi Cavdar


-1

Recenzja script_ and style_loader_tag autorstwa @Remzi Cavdar jest interesująca, ale ryzykuję wywołanie oburzenia i mam nadzieję, że ktoś może mi przypomnieć, jaka byłaby korzyść z korzystania z kolejki WP w takich przypadkach jak ta, „ Zalecam skorzystanie z łatwego wyjścia i załadowanie arkusza stylów Fontawesome za pomocą haka.

/* 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 -->
'; 

}

Niektórzy mogą nawet argumentować, że jeśli używasz FA tylko, powiedzmy, dla niektórych ikon w stopce motywu lub w postach, powinieneś dodać ją niżej, w treści strony, ponieważ w ten sposób nie pojawi się jako blokowanie renderowania, ale przyznaję, że nigdy tego nie zrobiłem ... I nie posunę się aż tak daleko, aby zalecić dodanie go bezpośrednio do pliku header.php lub innego pliku szablonu. To by było złe. ;)

AKTUALIZACJA

Remzi Cavdar był na tyle uprzejmy, że odpowiedział na moją prośbę o przypomnienie, dlaczego po prostu dodanie Fontawesome lub podobnego tagu za pomocą wp_head () hook może być mniej pożądane niż korzystanie z kolejki WordPress. Odnosi się ogólnie do pojęcia najlepszych praktyk, a dokładniej do idei, że wtyczki pamięci podręcznej mogą potrzebować dostępu do arkusza stylów za pośrednictwem kolejki.

Zanim przejdę do szczegółów, powiem to, chociaż tak naprawdę nie znam żadnego konkretnego szczególnego uzasadnienia poza tym, że jest to rodzaj „WordPress Way”, lubię podejście towarzysza Cavdara i mogę go użyć w przyszłości .

Jednak inne jego twierdzenia nie są dla mnie przekonujące. Może on lub ktoś inny może do nich dodać. Jeśli tak, to jestem cały w uszach. Podsumowując, o ile mogę stwierdzić, po przeprowadzeniu ponad 20 testów na Pingdom i GTMetrix porównujących „dodaj przez kolejkę” z „dodaj przez głowę” na blogu testowym, nie ma znaczącej i spójnej różnicy pod względem stopniowanej wydajności, łączna liczba żądań stron lub czasów ładowania (np. „First Paint”, „First Contentful Paint” i „OnLoad” w GTMetrix) między tymi dwoma podejściami.

Jeśli chodzi o buforowanie, wtyczki buforujące niewiele mogą zrobić z plikami hostowanymi zewnętrznie, niezależnie od tego, czy są one dodawane do kolejki WP. Same pliki pozostaną nienaruszone, a strona nadal będzie generować żądanie dla każdego z nich.

Mówiąc bardziej ogólnie, widziałem wiele różnych podejść do ładowania skryptów i stylów. Niektóre z nich częściowo lub całkowicie ominą kolejkę WP. Z pewnością można sobie wyobrazić, że wystąpią instancje - funkcja, która korzysta z szeregu uchwytów stylów, jednocześnie zapobiegając ładowaniu ich na określone strony, powiedzmy - gdzie umieszczenie w kolejce Fontawesome lub innego znacznika innej firmy będzie marginalnie przydatne, i że początkowe wdrożenie dwóch funkcje - kolejkowanie i filtrowanie - okażą się bardziej oszczędne niż zwykłe ładowanie jednej.

W przypadku FA arkusz stylów jest już zminimalizowany i ładowany przez własny CDN FA. Jego wewnętrzny wpływ na wydajność będzie minimalny, bez względu na to, czy zostanie załadowany za pomocą wp_head (), czy w kolejce, nadal będzie rejestrował przypadki demeritów w wielu miejscach na równiarkach wydajności - tych samych, takich jak Google Page Speed ​​Insights i wspomniane wcześniej GTMetrix i Pingdom, zadokuje cię punkt wydajności za nie zapisanie kilku bajtów (nawet kilobajtów) ponownej optymalizacji jednego lub drugiego pliku obrazu.

Ładowanie za pomocą wp_head zamiast kolejki może spowodować sprawdzenie „prawidłowej kolejności skryptów i stylów” (nawet jeśli ktoś oceni cię wyżej za ładowanie pliku hostowanego zewnętrznie po hostowanym lokalnie), ale jeśli naprawdę martwisz się ładowaniem FA w najlepszy możliwy sposób dla swojej witryny, a następnie spróbuj lokalnie hostować jego pliki i pod-pliki, zarówno jego styl, jak i czcionki wywoływane przez arkusz stylów za pomocą @ font-face. W takim przypadku możesz zapisać arkusz stylów jak każdy inny plik lokalny, połączyć i połączyć go za pomocą wtyczki optymalizującej lub bezpośrednio „ręcznie”. Możesz nawet dokonać własnych modyfikacji Fontawesome i zintegrować je z arkuszem stylów i strukturą motywów. Lub (jak wspomniano wcześniej krótko), możesz wypróbować bardziej egzotyczne taktyki optymalizacji wydajności, takie jak dodanie wbudowanego CSS tuż przed jego użyciem w strukturze konkretnej strony.

W każdym razie nie musisz martwić się o nowe tagi „integralność” i „pochodzenie”, a także nie musisz się martwić, że pewnego dnia Fontawesome zapomni zapłacić swój rachunek CDN.

Lub może pracujesz nad witryną, która jest już kompletnym bałaganem, z arkuszami stylów i skryptami ładowanymi w każdy sposób, a może być łatwiej mieć swój najnowszy dodatek na górze pliku functions.php, abyś lub następny programista może łatwo go zlokalizować ...


Jestem również ciekawy, co jest wadą robienia tego w ten sposób lub bezpośredniego dodawania go do pliku motywu?
Jersh

Dziękujemy za Twój punkt widzenia, jedyne, że Twoje rozwiązanie frustruje wiele wtyczek Minify i Buforowania. Jak: wordpress.org/plugins/fast-velocity-minify , wordpress.org/plugins/wp-fastest-cache i etca ....
Remzi Cavdar

1
Inne wtyczki są w stanie manipulować arkuszami stylów i skryptami, jeśli są odpowiednio kolejkowane, jeśli umieścisz kod bezpośrednio w głowie, wtyczki te nie będą w stanie zminimalizować, połączyć i zbudować pamięci podręcznej z kolejnością propper.
Remzi Cavdar,

Remzi Cavdar: Dziękuję za odpowiedź, ale zanim zredaguję moją odpowiedź i szczegółowo rozwiążę poruszone przez ciebie problemy, zastanawiam się, czy masz jakieś ich przykłady szczególnie w odniesieniu do Fontawesome, czy ogólnie w odniesieniu do innych podobnych arkuszy stylów, jak w przypadku już zminimalizowane i hostowane zewnętrznie.
CK MacLeod

1
„Sposób wordpress” zapewnia maksymalną zgodność z wtyczkami. Niezależnie od tego, czy chodzi o pobieranie rzeczy z CDN, czy usuwanie linku do niektórych konkretnych stron, po prostu nie będzie to możliwe bez edycji kodu. +1 za opowiadanie się za twoimi przekonaniami, ale jako odpowiedź tutaj jest to -1
Mark Kaplun
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.