Lancei um plug-in que cria um código curto e requer um arquivo JavaScript e um arquivo CSS para carregar em qualquer página que contenha esse código curto. Eu poderia carregar o script / estilo em todas as páginas, mas essa não é a melhor prática. Eu só quero carregar os arquivos nas páginas que chamam o shortcode. Eu encontrei dois métodos para fazer isso, mas ambos têm problemas.
O método 1 define um sinalizador como true dentro da função de manipulador de códigos curtos e verifica esse valor dentro de um wp_footer
retorno de chamada. Se for verdade, ele usa wp_print_scripts()
para carregar o JavaScript. O problema disso é que ele só funciona para JavaScript e não para CSS, porque o CSS deve ser declarado dentro <head>
, o que você só pode fazer durante um gancho inicial como init
ou wp_head
.
O método 2 é acionado mais cedo e "espreita à frente" para verificar se o código de acesso existe no conteúdo da página atual. Eu gosto desse método muito melhor do que o primeiro, mas o problema com ele não detectará se o modelo chama do_shortcode()
.
Portanto, estou inclinado a usar o segundo método e, em seguida, tentando detectar se um modelo está atribuído e, em caso afirmativo, analise-o para obter o código de acesso. Antes de fazer isso, porém, eu queria verificar se alguém conhece um método melhor.
Atualização: integrei a solução ao meu plugin. Se alguém estiver curioso para vê-lo aprimorado em um ambiente ao vivo, faça o download ou navegue nele .
Atualização 2: A partir do WordPress 3.3, agora é possível chamar wp_enqueue_script()
diretamente dentro de um retorno de chamada de código curto , e o arquivo JavaScript será chamado no rodapé do documento. Isso também é tecnicamente possível para arquivos CSS, mas deve ser considerado uma prática ruim, pois a saída de CSS fora da <head>
tag viola as especificações do W3C, pode causar FOUC e forçar o navegador a renderizar novamente a página.
Respostas:
Com base em minha própria experiência, usei uma combinação do método 1 e 2 - a arquitetura e os scripts de rodapé de 1 e a técnica de "antecipação" de 2.
Para o futuro, porém, uso regex no lugar de
stripos
; preferência pessoal, mais rápida e pode verificar se há um código de acesso 'malformado';Se você estiver preocupado com os autores que usam
do_shortcode
manualmente, eu optaria por instruí-los ausar uma chamada de açãoenfileirando seu estilo pré-registrado manualmente.ATUALIZAÇÃO : Para o autor preguiçoso que nunca RTFM, envie uma mensagem para destacar o erro de seus caminhos;)
fonte
do_shortcode()
, não é razoável supor que eles também sejam adeptos de seguir as instruções para enfileirar o estilo de código de acesso?init
, em qualquer lugar anteswp_head
. Para o desenvolvedor preguiçoso, verifiquewp_style_is( 'my_style_handle', 'done' )
dentro do seu código curto. Se for falso, imprima um erro visível que os instrui sobre o que fazer.do_shortcode()
ao modelo já está "fazendo algo extra" - e os usuários que fazem isso extra já sabem da necessidade de enfileirar o estilo ou então estão mais dispostos / prováveis para seguir instruções especiais.Estou atrasado em responder a essa pergunta, mas desde que Ian começou esse tópico na lista wp-hackers hoje, me fez pensar que vale a pena responder, especialmente considerando que planejava adicionar esse recurso a alguns plugins em que estava trabalhando.
Uma abordagem a considerar é verificar o carregamento da primeira página para ver se o código de acesso é realmente usado e, em seguida, salvar o status de uso do código de acesso em uma meta-chave de postagem. Aqui está como:
Instruções passo a passo
$shortcode_used
sinalizador para'no'
.$shortcode_used
sinalizador para'yes'
.'the_content'
prioridade de gancho12
após o WordPress ter processado os códigos de acesso e verifique a meta de postagem para''
usar a chave"_has_{$shortcode_name}_shortcode"
. (Um valor de''
é retornado quando uma meta-chave de postagem não existe para o ID da postagem.)'save_post'
gancho para excluir a meta meta de postagem, limpando o sinalizador persistente dessa postagem, caso o usuário altere o uso de códigos de acesso.'save_post'
gancho, usewp_remote_request()
para enviar um HTTP GET sem bloqueio para o próprio link permanente da postagem para acionar o carregamento da primeira página e a configuração do sinalizador persistente.'wp_print_styles'
e verificar meta post para um valor de'yes'
,'no'
ou''
utilizando a tecla"_has_{$shortcode_name}_shortcode"
. Se o valor for'no'
, não atenda ao externo. Se o valor for'yes'
ou''
vá em frente e sirva o externo.E isso deveria bastar. Escrevi e testei um exemplo de plug-in para mostrar como tudo isso funciona.
Exemplo de código de plug-in
O plug-in é ativado em um
[trigger-css]
código de acesso que define os<h2>
elementos da página em branco sobre vermelho, para que você possa vê-lo funcionando com facilidade. Ele assume umcss
subdiretório que contém ostyle.css
arquivo com este CSS:E abaixo está o código em um plug-in de trabalho:
Capturas de tela de exemplo
Aqui está uma série de capturas de tela
Editor de postagem básico, sem conteúdo
Publicar exibição, sem conteúdo
Editor de postagem básico com
[trigger-css]
ShortcodePós-exibição com
[trigger-css]
ShortcodeNão tenho certeza se é 100%
Eu acredito que o acima deve funcionar em quase todos os casos, mas como acabei de escrever este código, não posso ter 100% de certeza. Se você encontrar situações em que isso não funcione, eu realmente gostaria de saber para que eu possa corrigir o código em alguns plugins que acabei de adicionar. Desde já, obrigado.
fonte
post_content
. E quanto aos códigos de acesso nos widgets?'pre_http_request'
gancho e desativar várias chamadas para o mesmo URL enquanto o'save_post'
gancho estiver ativo, mas eu gostaria de esperar até que realmente viesse a necessidade disso, não? Quanto aos Widgets, ele poderia ser aprimorado, mas ainda não é um caso de uso.<style>
).O Google me encontrou uma resposta em potencial . Eu digo "potencial", pois parece bom, deve funcionar, mas não estou 100% convencido de que é a melhor maneira de fazê-lo:
Isso deve ser capaz de verificar se a postagem atual está usando um código de acesso e adicionar uma folha de estilo ao
<head>
elemento adequadamente. Mas não acho que funcione para uma página de índice (ou seja, várias postagens no loop) ... Também é de uma publicação de 2 anos no blog, então não tenho certeza de que funcionará com o WP 3.1.X .fonte
get_shortcode_regex()
para pesquisar.do_shortcode()
manualmente no modelo, já saberá que estará executando oUsando uma combinação da resposta do TheDeadMedic e da documentação get_shortcode_regex () (que realmente não encontrou meus códigos de acesso), criei uma função simples usada para enfileirar scripts para vários códigos de acesso. Como o wp_enqueue_script () nos códigos de acesso é adicionado apenas ao rodapé, isso pode ser útil, pois pode lidar com os scripts de cabeçalho e rodapé.
fonte
Finalmente, também encontrei uma solução para carregamento condicional de css que funciona para o meu plugin www.mapsmarker.com e gostaria de compartilhar com você. Ele verifica se meu código curto é usado no arquivo de modelo atual e no header / footer.php e, se sim, enfileira a folha de estilo necessária no cabeçalho:
fonte
Para 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
Para arquivos CSS, você pode carregá-los na sua saída de shortcode:
Defina uma constante ou algo depois disso, como
MY_CSS_LOADED
(inclua apenas o CSS se a constante não estiver definida).Ambos os métodos são mais lentos do que seguir esse caminho.
Para arquivos JS, você pode fazer o mesmo se o script que estiver carregando for exclusivo e não tiver nenhuma dependência externa. Se não for esse o caso, carregue-o dentro do rodapé, mas use a constante para determinar se precisa ser carregado ou não ...
fonte
<head>
elemento não é uma marcação adequada. É verdade que a validação é apenas uma diretriz, mas se estamos tentando seguir essa diretriz, o carregamento da folha de estilo dentro da saída de código curto é uma má idéia.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Portanto, os estilos embutidos (<element style="..."></element>
) são válidos, mas os<style>
elementos embutidos não.Script Logic é um plugin do WordPress que oferece controle total sobre todos os arquivos JavaScript e CSS. Usando este plug-in, você pode carregar condicionalmente os arquivos CSS e JS apenas nas páginas onde for necessário.
http://wordpress.org/plugins/script-logic/
fonte