Qual é a maneira ideal de registrar / enfileirar scripts e / ou estilos para uso em plugins?
Recentemente, criei um plugin simples para adicionar o usuário avatar / gravatar com um código curto. Eu tenho diferentes opções de estilo para exibir o avatar (quadrado, redondo, etc.) e decidi colocar o css diretamente no próprio código de acesso.
No entanto, agora percebo que essa não é uma boa abordagem, pois repetirá o css toda vez que o código curto for usado em uma página. Eu já vi várias outras abordagens neste site e o wp codex ainda tem dois exemplos, por isso é difícil saber qual abordagem é mais consistente e mais rápida.
Aqui estão os métodos que eu conheço atualmente:
Método 1: Incluir diretamente no shortcode - É o que estou fazendo atualmente no plug-in, mas não parece bom, pois repete o código.
class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">
</style>
<?php
return "$content";
}
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );
Método 2: Usar classe para enfileirar scripts ou estilos condicionalmente
class My_Shortcode {
static $add_script;
static function init() {
add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
add_action('init', array(__CLASS__, 'register_script'));
add_action('wp_footer', array(__CLASS__, 'print_script'));
}
static function handle_shortcode($atts) {
self::$add_script = true;
// shortcode handling here
}
static function register_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
static function print_script() {
if ( ! self::$add_script )
return;
wp_print_scripts('my-script');
}
}
My_Shortcode::init();
Método 3: usando get_shortcode_regex();
function your_prefix_detect_shortcode() {
global $wp_query;
$posts = $wp_query->posts;
$pattern = get_shortcode_regex();
foreach ($posts as $post){
if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'myshortcode', $matches[2] ) )
{
// css/js
break;
}
}
}
add_action( 'wp', 'your_prefix_detect_shortcode' );
Método 4: usando has_shortcode();
function custom_shortcode_scripts() {
global $post;
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
wp_enqueue_script( 'my-script');
}
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');
fonte
Method 4: Using has_shortcode();
é melhor, porque garantirá que os scripts e estilos sejam carregados uma vez se o conteúdo da postagem tiver um código curto, independentemente de vários usos do código curto. Embora possa não funcionar para o uso de códigos curtos em widgets ou na barra lateral, não tenho certeza. Se for para um plug-in, não recomendo que você amarre scripts com shortcode, porque alguns podem chamar sua função em vez de shortcode para obter a saída desejada.Respostas:
Eu encontrei uma outra maneira que funciona bem para mim:
Ao inicializar o plug-in, não enfileire seus scripts e estilos, mas registre-os com
wp_register_style
ewp_register_script
.Em seguida, você pode carregar o script / estilo sob demanda. Por exemplo, quando você renderiza um código curto com
wp_enqueue_style("your_style")
ewp_enqueue_script("your_script")
.Aqui está um exemplo de plug-in usando esse método que permite usar get_avatar como código de acesso. A folha de estilo é enfileirada apenas quando o código curto está presente.
Uso (o código padrão é o usuário atual):
[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]
fonte
wp_enqueue_scripts
gancho já tiver ocorrido. (Os códigos de acesso são analisados durante othe_content
que faz parte dothe_post
gancho, ou seja, enfileirar quando é analisado é tarde demais, a menos que você já tenha registrado o script)Antes de começar a resposta, devo dizer que, em relação a este tópico, css e js não são os mesmos.
O motivo é simples: embora adicionar js ao corpo da página (no rodapé) seja um caminho comum e válido, o css precisa ser colocado na
<head>
seção da página: mesmo que a maioria dos navegadores consiga renderizar css na página body, esse código HTML não é válido.Quando um código abreviado é renderizado, a
<head>
seção já foi impressa, significa que js pode ser adicionado sem nenhum problema no rodapé, mas o css deve ser adicionado antes que o código abreviado seja renderizado.Scripts
Se o seu código curto precisar apenas de js, você terá sorte e poderá usar apenas
wp_enqueue_script
no corpo do retorno de chamada do código curto:Fazendo isso, seu script é adicionado ao rodapé e apenas uma vez, mesmo que o código curto seja usado mais de uma vez na página.
Estilos
Se você codificar precisa de estilos, precisará agir antes que o shortcode seja renderizado.
Existem diferentes maneiras de fazer isso:
observe todas as postagens na consulta atual e adicione os estilos de código de acesso, se necessário. Isso é o que você faz nos métodos 3 e 4 no OP. De fato, os dois métodos fazem a mesma coisa, mas
has_shortcode
foram adicionados no WP 3.6, enquantoget_shortcode_regex
estão disponíveis desde a versão 2.5, portanto, useget_shortcode_regex
somente se você quiser tornar seu plug-in compatível com versões mais antigas.adicione sempre o estilo shortcode, em todas as páginas
Problemas
O problema nº 1 é o desempenho. Regex são operações bastante lentas e o lançamento do regex em um loop de todas as postagens pode tornar a página mais lenta de forma consistente. Além disso, é uma tarefa bastante comum em temas mostrar apenas trechos de post em arquivos e mostrar conteúdo completo com códigos de acesso apenas em visualizações únicas. Se isso acontecer, quando um arquivo for mostrado, seu plugin iniciará uma correspondência de regex em um loop com o objetivo de adicionar um estilo que nunca será usado: um impacto desnecessário no desempenho duplo: diminuir a geração de páginas + solicitação HTTP adicional desnecessária
Problema com o número 2 é desempenho, novamente. Adicionar estilo a todas as páginas significa adicionar uma solicitação HTTP adicional para todas as páginas, mesmo quando não for necessário. Mesmo que o tempo de geração da página do lado do servidor não seja afetado, o tempo total de renderização da página será e para todas as páginas do site.
Então, o que um desenvolvedor de plug-ins deve fazer?
Eu acho que a melhor coisa a fazer é adicionar uma página de opção ao plug-in, onde os usuários podem escolher se o código de acesso deve ser tratado apenas na exibição singular ou mesmo em arquivos. Nos dois casos, é melhor fornecer outra opção para escolher quais tipos de postagem ativam o código abreviado.
Dessa forma, é possível ligar
"template_redirect"
para verificar se a consulta atual atende aos requisitos e, nesse caso, adicionar o estilo.Se o usuário optar por usar o shortcode apenas em visualizações de postagem singulares, é uma boa idéia verificar se a postagem tem shortcode ou não: uma vez que apenas um regex é necessário, não deve abrandar muito a página.
Se o usuário optar por usar shortcode mesmo em arquivos, evitaria executar regex para todas as postagens se o número de postagens for alto e apenas enfileirar o estilo se a consulta atender aos requisitos.
O que considerar "alto" a esse respeito deve ser o uso de alguns testes de desempenho ou, como alternativa, adicionar outra opção e dar opção aos usuários.
fonte
<style>
tags no corpo do documento agora são válidas conforme as especificações do W3C. w3.org/TR/html52/document-metadata.html#the-style-elementPara o meu plugin, descobri que, às vezes, os usuários têm um construtor de temas que possui shortcode armazenado nos metadados pós . Aqui está o que estou usando para detectar se o código de acesso do meu plug-in está presente na postagem atual ou nos metadados da postagem :
fonte
Eu faço assim:
e gancho de gancho em outras funções (ou outros plugins):
fonte
Eu descobri o meu próprio plug-in, se o código de acesso estiver presente no widget de texto.
fonte
O WordPress possui uma função integrada para fazer algo com base em um status de apresentação de Shortcode específico. O nome da função é
has_shortcode()
. Você pode usar o código a seguir para enfileirar seu estilo e scripts.Aqui, usei o
is_a( $post, 'WP_Post' )
para verificar se o$post
objeto é daWP_Post
classe e$post->post_content
o conteúdo da postagem.fonte
Fiz uma combinação do código de exemplo da página do Wordpress para has_shortcode () e a resposta que zndencka deu. Notei que a função has_shortcode é adicionada no Wordpress 3.6, e é por isso que verifico primeiro se a função existe. Talvez essa verificação seja um pouco obsoleta, já que não há mais usuários abaixo do wordpress 3.6 de acordo com as próprias estatísticas do wordpress.
fonte
De fato, podemos carregar condicionalmente arquivos CSS e JS via shortcode sem usar funções muito elaboradas :
Primeiro, vamos supor que registramos todos os nossos arquivos CSS / JS anteriormente (talvez quando
wp_enqueue_scripts
executados)Em seguida, vamos examinar nossa função shortcode:
Simples. Feito. Ergo: podemos "carregar condicionalmente" arquivos css / js (somente quando o [shortcode] for executado).
Vamos considerar a seguinte ideologia:
prep_css_and_js()
função eu carregue TODOS os arquivos .css / .js que estão em determinadas pastas ...Agora que o WP os vê como scripts registrados, podemos chamá-los, condicionalmente, com base em uma realidade de situações, incluindo, mas não limitado a,
my_shortcode_func()
Benefícios: (sem MySQL, sem funções avançadas e sem filtros)
Referências:
fonte