No functions.php do meu tema, estou chamando um add_action para obter uma medida de controle sobre onde o jquery é carregado (no rodapé, juntamente com os outros scripts do meu tema).
O problema que estou tendo é que, quando uso add_action ('wp_enqueue_scripts'), ele parece disparar apenas se nenhum plug-in estiver carregado. No entanto, o método add_action ('init') funciona em todos os casos.
Não me lembro por quê, mas acredito que add_action ('wp_enqueue_scripts') seja preferida nesse caso. Se isso for verdade, como posso fazê-lo funcionar em todos os casos?
Em functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
Em functions_public.php
function my_theme_init()
{
/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');
/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
O segundo método, usando add_action ('wp_enqueue_scripts'), aparentemente não é executado em condições em que existe um plug-in que grava dependências de script no tema.
fonte
Respostas:
Muitos desenvolvedores de plugins não fazem as coisas da maneira certa. O caminho certo é ligar
wp_enqueue_scripts
como você está tentando fazer.No entanto, aqui está a ordem dos ganchos executados em uma solicitação típica:
O fato é que vários desenvolvedores foram instruídos originalmente a se conectarem
init
para enfileirar seus scripts. Antes de começarmoswp_enqueue_script
, essa era a maneira "correta" de fazer as coisas, e os tutoriais que perpetuam a prática ainda estão flutuando na Internet, corrompendo os bons desenvolvedores.Minha recomendação seria dividir sua função em duas partes. Coloque seu
wp_deregister_script
/wp_register_script
noinit
gancho e use owp_enqueue_scripts
gancho quando enfileirar o jQuery.Isso manterá você no mundo de "fazer o certo" para enfileirar seus scripts e ajudará a protegê-lo das centenas de desenvolvedores que ainda "fazem de errado" trocando o jQuery pela sua versão concatenada antes de adicioná-lo à fila .
Você também deseja adicionar seu
init
gancho com alta prioridade:fonte
priority
adição de ações. Tudo depende de como você vê a prioridade. Se você deseja que o seu seja executado "primeiro", um número menor é melhor - uma prioridade mais alta na ordem da fila de execução. Mas se você deseja que o efeito de sua função tenha precedência sobre outras, você deseja que seja executado mais tarde - portanto, uma prioridade mais alta por "efeito". E, nesse caso, é provavelmente um número maior que você deseja. Mesmo que haja pouco mérito em trocar a versão RTM do jquery, como sugere o comentarista anterior.Existem vários problemas aqui, que são inter-relacionados.
wp_enqueue_scripts
wp_enqueue_script()
, defina o$footer
parâmetro comotrue
add_action( $hook, $callback )
chamadas não devem ser agrupadas em nada; deixá-los executar diretamente defunctions.php
is_admin()
cheques condicionais dentro do seu retorno de chamadawp_enqueue_scripts
é tarde demais . Divida seu código de cancelamento de registro / registro em um retorno de chamada conectadoinit
.get_template_directory()
vez deTEMPLATEPATH
Juntando tudo:
Mas, novamente: essa realmente não é a melhor abordagem. Sua melhor aposta é simplesmente remover os retornos de chamada do plugin add_action () que cancelam o registro do jQuery principal - ou usar Plugins que não fazem algo tão imprudente quanto substituir o jQuery incluído no pacote principal.
fonte
_doing_it_wrong()
chamar algo que não é apenas jQuery "jQuery". Além disso: o jQuery em si pode simplesmente ser retirado da fila para garantir que não seja carregado duas vezes. Awp_dequeue_script()
chamada só precisa ocorrer com uma prioridade suficiente para garantir que nada a enfileire posteriormente.