Como adicionar crossorigin e integridade ao wp_register_style? (Fonte impressionante 5)


12

Estou atualizando o Font Awesome 4 para a versão 5, que introduz atributos de integridade e de origem cruzada na <link rel="stylesheet">marcação.

Atualmente, estou usando:

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

Que gera como:

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

Com o Font Awesome 5, ele introduz dois novos atributos e valores ( integritye crossorigin), por exemplo:

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

Portanto, preciso descobrir como posso adicionar a integridade e a crossorigin ao wp_register_style. Tentei, mas minhas tentativas de usar wp_style_add_datafalharam, parece que esse método suporta apenas conditional, rtle suffix, alte title.



Obrigado @JacobPeattie, a pergunta é um pouco diferente, mas a resposta dada pode ser aplicável neste caso. No entanto, remonta a 2016, talvez haja agora uma forma que parece menos hacky ...
Pipo

@Pipo Eu sou desenvolvedor do WordPress e criei alguns plugins, usei style_loader_tag e script_loader_tag para fazer um carregamento personalizado. Inclusive adicionando defer e assíncrono às minhas tags de script. Veja um dos meus plugins de código aberto: github.com/Remzi1993/wp-jquery-manager
Remzi Cavdar

@ Pipo Você também estava certo. A outra postagem está desatualizada e isso não funcionaria mais. No meu primeiro exemplo, mostrei como você poderia fazer isso com uma simples substituição de string. Eu também colocar um pouco mais de informação para que outras pessoas poderiam usar essa informação
Remzi Cavdar

@JacobPeattie Você poderia dar uma olhada? I pode ter alguns erros de gramática, o Inglês é a minha segunda língua
Remzi Cavdar

Respostas:


16

style_loader_tag
style_loader_tag é uma API oficial do WordPress, consulte a documentação: https://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( 'style_loader_tag', $html, $handle, $href, $media )
Filtra a tag de link HTML de um estilo na fila.


Primeiro enfileire sua folha de estilo, consulte a documentação: 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 );

O $handleé 'font-awesome-5'
eu faço nullpara que não haja número de versão. Dessa forma, ele será armazenado em cache.

Str_replace
simples Um str_replace simples é suficiente para alcançar o que você deseja, veja o exemplo abaixo

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


Adicionar atributos diferentes
Abaixo de um exemplo para adicionar atributos diferentes a (várias) folhas de estilo diferentes

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


Adicionar atributos a todos os estilos
Abaixo de um exemplo para adicionar os mesmos atributos a mais de uma folha de estilo

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
Também gostaria de explicar o script_loader_tag, porque isso também é útil, mas essa API funciona em combinação com wp_enqueue_script .

A API script_loader_tag é quase a mesma, apenas algumas pequenas diferenças, consulte a documentação: https://developer.wordpress.org/reference/hooks/script_loader_tag/

apply_filters( 'script_loader_tag', $tag, $handle, $src )
Filtra a tag de script HTML de um script na fila.


Abaixo um exemplo para adiar um único 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 );


Abaixo um exemplo para adiar mais de um script

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

Então, eu expliquei as APIs style_loader_tage script_loader_tag. E dei alguns exemplos para as duas APIs. Espero que isso seja útil para muitas pessoas por aí. Tenho experiência com as duas APIs.


ATUALIZAÇÃO
@CKMacLeod Obrigado por sua atualização, isso esclarece as coisas. Estamos principalmente na mesma página. Como eu disse, sou desenvolvedor do WordPress e se você deseja publicar um tema e / ou plugin em https://wordpress.org, é essencialmente obrigado a respeitar os " Padrões de codificação do WordPress " ou eles simplesmente rejeitarão seu tema e / ou plugin.

É por isso que incentivo os desenvolvedores a usar "o caminho do WordPress". Entendo que, às vezes, não há diferenças, mas também é conveniente. Como você mesmo disse, pode fazer o download do Font Awesome e incluí-lo no seu tema e / ou plugin, dessa forma, você só precisará remover a função style_loader_tag e modificar a função wp_enqueue_style.

E uma última coisa, no passado (5 anos atrás), alguns plugins de cache, combinação e minificação não funcionavam e, na maioria das vezes, eu descobria por que os desenvolvedores que criaram o tema simplesmente colocaram as coisas na cabeça no tema e / ou ecoou-os. A maioria dos plug-ins de cache, que também (na maioria das vezes) fornece opções para combinar, minimizar e atrasar a execução de scripts, tornou-se mais inteligente e melhor na detecção de códigos ruins e na solução deles. Mas isso não é preferido. É por isso que encorajo as pessoas a codificar com padrões / convenções em mente.

Como desenvolvedor, você sempre precisa levar em consideração o que as pessoas poderiam fazer com seu código e ter em mente a compatibilidade. Portanto, não tomando a solução fácil, mas a melhor solução ideal. Espero ter esclarecido meu ponto de vista.

EDIT
@CKMacLeod Obrigado pelo debate (técnico), espero que você perceba o quanto isso é importante (usando as APIs do WordPress em seu próprio desenvolvimento). Novamente, eu tenho procurado e, mesmo agora, se eu olhar as perguntas frequentes dos plugins de minify mais populares, geralmente vejo isso de uma maneira ou de outra, por exemplo:

Pergunta: Por que alguns dos arquivos CSS e JS não estão sendo mesclados?
Resposta: O plug-in processa apenas arquivos JS e CSS enfileirados usando o método oficial da API do WordPress - https://developer.wordpress.org/themes/basics/including-css-javascript/, bem como arquivos do mesmo domínio (a menos que especificado nas configurações).

Consulte as Perguntas frequentes: https://wordpress.org/plugins/fast-velocity-minify/


@Pipo De nada :)
Remzi Cavdar

RC - Acho que sua resposta pode ser uma prática geral melhor do WordPress do que a minha (embora eu queira fazer mais pesquisas sobre enfileiramento de scripts e arquivos hospedados externamente). Ainda assim, acho que devemos esclarecer nossas justificativas e não exagerá-las, além de reconhecer que a resposta certa para a incorporação de serviços de terceiros pode variar em diferentes contextos. Nesta nota, a outra resposta que nenhum de nós considerou, a propósito, está usando um bom plug-in - como o Better Font Awesome for FA, pois eles podem lidar bem com atualizações e outras tarefas.
CK MacLeod

Sim, você está certo sobre o uso de um plugin para a FA. Só não sei se isso também é preferido quando os desenvolvedores criam um tema WP. Normalmente, você deseja incluir tudo no seu tema e usar menos plugins quanto possível fora da caixa.
Remzi Cavdar


-1

A revisão de script_ e style_loader_tag por @Remzi Cavdar é interessante, mas, correndo o risco de provocar alguma indignação e na esperança de que alguém possa me lembrar qual seria a vantagem de usar a fila WP em casos como este, eu ' Recomendamos seguir o caminho mais fácil e carregar a folha de estilo do Fontawesome via gancho.

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

}

Alguns podem até argumentar que, se você estiver usando o FA apenas para, digamos, alguns ícones no rodapé do tema ou nas postagens, você deve adicioná-lo mais baixo, dentro do corpo da página, pois assim não aparecerá como bloqueio de renderização, mas confesso que nunca fiz isso ... E não irei ao ponto de recomendar adicioná-lo diretamente a um header.php ou outro arquivo de modelo. Isso seria errado. ;)

ATUALIZAR

Remzi Cavdar teve a gentileza de responder ao meu pedido de lembrete de por que simplesmente adicionar uma tag Fontawesome ou semelhante por meio do gancho wp_head () pode ser menos desejável do que utilizar a fila do WordPress. Ele geralmente se refere à noção de práticas recomendadas e, de certa forma, mais especificamente à idéia de que plug-ins de cache podem precisar acessar a folha de estilo por meio da fila.

Antes de entrar em detalhes, direi que, embora eu realmente não conheça nenhuma justificativa específica significativa além de que seja uma espécie de "caminho do WordPress", gosto da abordagem do camarada Cavdar e posso usá-la no futuro .

Suas outras reivindicações, no entanto, não são convincentes para mim. Talvez ele ou outra pessoa possa adicionar a eles. Se sim, sou todo ouvidos. Resumindo, até onde eu sei, depois de executar mais de 20 testes no Pingdom e GTMetrix comparando "adicionar via fila" vs "adicionar via cabeçalho" em um blog de teste, não há diferença significativa e consistente em termos de desempenho classificado, número total de solicitações de página ou tempos de carregamento (por exemplo, "Primeira pintura", "Primeira pintura com conteúdo" e "OnLoad" no GTMetrix) entre as duas abordagens.

Em relação especificamente ao cache, os plug-ins de cache não podem fazer muito com arquivos hospedados externamente, independentemente de terem sido adicionados ou não à fila do WP. Os arquivos em si permanecerão inalterados e sua página ainda gerará uma solicitação para cada um.

De maneira mais geral, vi uma ampla variedade de abordagens diferentes para carregar scripts e estilos. Alguns deles ignoram parcial ou totalmente a fila do WP. Certamente é concebível que haverá instâncias - uma função que utiliza uma variedade de identificadores de estilo, impedindo que sejam carregadas em páginas específicas, digamos - em que ter o Fontawesome ou outra Tag de Terceiro enfileirado será marginalmente útil e que a implantação inicial de dois funções - enfileiramento e filtragem - serão realmente mais parcimoniosas do que simplesmente carregar uma.

No caso da FA, a folha de estilo está minificada e é carregada através da própria CDN da FA. No entanto, seu impacto intrínseco no desempenho será mínimo, seja carregado via wp_head () ou através da fila, ele ainda registrará deméritos em vários pontos nos classificadores de desempenho - os mesmos, como o Google Page Speed ​​Insights e os mencionados GTMetrix e Pingdom, que o ancorará em um ponto de desempenho por não salvar alguns bytes (nem kilobytes) e otimizar novamente um ou outro arquivo de imagem.

Carregar via wp_head em vez da fila pode desarmar uma verificação de "ordem correta de scripts e estilos" (mesmo que alguém o classifique melhor por carregar o arquivo hospedado externamente após os hospedados localmente), mas, se você estiver realmente preocupado em carregar FA da melhor maneira possível para o seu site, tente hospedar localmente seus arquivos e subarquivos, tanto o estilo quanto as fontes chamadas pela folha de estilo por @ font-face. Nesse caso, você pode enfileirar a folha de estilo como qualquer outro arquivo local, concatenar e combiná-la através de um plug-in de otimização ou diretamente "manualmente". Você pode até fazer suas próprias modificações impressionantes do Fontawesome e integrá-las à sua folha de estilo e estrutura do tema. Ou (como mencionado anteriormente brevemente), você pode experimentar algumas táticas mais exóticas de otimização de desempenho, como adicionar o CSS inline imediatamente antes de ser necessário na estrutura de uma página específica.

De qualquer forma, você não precisaria se preocupar com as novas tags "integridade" e "de origem cruzada" e também não precisaria se preocupar se algum dia o Fontawesome esquecer de pagar sua conta da CDN.

Ou você pode estar trabalhando em um site que já é uma bagunça completa, com folhas de estilo e scripts carregados de todas as formas, e pode ser mais fácil ter sua última adição na parte superior do arquivo functions.php para que você ou o próximo desenvolvedor pode localizá-lo novamente facilmente ...


Também estou curioso, qual é a desvantagem de fazer dessa maneira ou adicioná-lo diretamente a um arquivo de tema?
Jersh

Obrigado pelo seu ponto de vista, a única coisa é que sua solução frustrará muitos plugins de minificação e cache. Como: wordpress.org/plugins/fast-velocity-minify , wordpress.org/plugins/wp-fastest-cache e ETCA ....
Remzi Cavdar

11
Os outros plug-ins são capazes de manipular as folhas de estilo e os scripts, se estiverem enfileirados corretamente. Se você colocar seu código diretamente na cabeça, esses plug-ins não poderão minificar, combinar e construir um cache com a ordem apropriada.
Remzi Cavdar

Remzi Cavdar: Obrigado pela resposta, mas, antes de editar minha resposta e abordar os problemas que você levanta em detalhes, pergunto-me se você tem algum exemplo deles especificamente em relação ao Fontawesome ou geralmente em relação a outras folhas de estilo, como em já minificado e hospedado externamente.
CK MacLeod

11
A "maneira wordpress" garante máxima compatibilidade com plugins. Seja para buscar coisas na CDN ou remover o link para algumas páginas específicas, do seu jeito, isso não será possível sem realmente editar o código. +1 por defender suas crenças, mas como resposta aqui é um -1 #
Mark Kaplun #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.