web-development-kb-pt.site

Qual é a maneira preferida de adicionar arquivos javascript personalizados ao site?

Eu já adicionei meus scripts, mas queria saber o caminho preferido.
Acabei de colocar uma tag <script> diretamente no header.php do meu template.

Existe um método preferido de inserir arquivos js externos ou personalizados?
Como eu ligaria um arquivo js a uma única página? (Eu tenho a home page em mente)

68
naugtur

Use wp_enqueue_script() no seu tema

A resposta básica é usar wp_enqueue_script() em um gancho wp_enqueue_scripts para front end admin_enqueue_scripts para admin. Pode parecer algo como isto (que assume que você está chamando do arquivo functions.php do seu tema; observe como eu faço referência ao diretório da folha de estilo):

<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );

function mysite_enqueue() {
  $ss_url = get_stylesheet_directory_uri();
  wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js" );
}

Isso é o básico.

Scripts Dependentes Predefinidos e Múltiplos

Mas digamos que você queira incluir tanto o jQuery quanto o jQuery UI Sortable da lista dos scripts padrão incluídos no WordPresse você quer que seu script dependa deles? Fácil, apenas inclua os dois primeiros scripts usando o pré-definido handles definido no WordPress e para o seu script forneça um terceiro parâmetro para wp_enqueue_script() que é uma matriz das manipulações de script usadas por cada script, assim :

<?php
add_action( 'wp_enqueue_scripts', 'mysite_enqueue' );

function mysite_enqueue() {
  $ss_url = get_stylesheet_directory_uri();
  wp_enqueue_script( 'mysite-scripts', "{$ss_url}/js/mysite-scripts.js", array( 'jquery', 'jquery-ui-sortable' ) );
}

Scripts em um plug-in

E se você quiser fazer isso em um plugin? Use a função plugins_url() para especificar o URL do seu arquivo Javascript:

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue' );

function my_plugin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url('/js/my-script.js',__FILE__), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION );
}

Versionando seus scripts

Note também que acima nós demos ao nosso plugin um número de versão e o passamos como um quarto parâmetro para wp_enqueue_script(). O número da versão é gerado na origem como argumento de consulta na URL para o script e serve para forçar o navegador a baixar novamente o arquivo possivelmente em cache se a versão for alterada.

Carregar Scripts apenas nas páginas onde for necessário

A regra 1st do Web Performance diz para Minimize HTTP Requests então, sempre que possível, você deve limitar os scripts para carregar somente onde necessário. Por exemplo, se você precisar apenas do seu script no admin, limite-o às páginas de administração usando o gancho admin_enqueue_scripts:

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );

function my_plugin_admin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION );
}

Carregar seus scripts no rodapé

Se seus scripts são um daqueles que precisam ser carregados no rodapé, há um quinto parâmetro de wp_enqueue_script() que diz ao WordPress para atrasá-lo e colocá-lo no rodapé (supondo que seu tema não tenha se comportado mal e que de fato chama o wp_footer gancho como todos os bons temas WordPress deve ):

<?php
define( 'MY_PLUGIN_VERSION', '2.0.1' );
add_action( 'admin_enqueue_scripts', 'my_plugin_admin_enqueue' );

function my_plugin_admin_enqueue() {
  wp_enqueue_script( 'my-script', plugins_url( '/js/my-script.js', __FILE__ ), array( 'jquery', 'jquery-ui-sortable' ), MY_PLUGIN_VERSION, true );
}

Controle granulado mais refinado

Se você precisa de um controle mais refinado do que isso, o Ozh tem um ótimo artigo intitulado Como: Carregar Javascript com o seu Plugin WordPress que detalha mais.

Desativando Scripts para Ganhar Controle

Justin Tadlock tem um belo artigo intitulado Como desativar scripts e estilos no caso de você querer:

  1. Combine vários arquivos em arquivos únicos (a milhagem pode variar com o JavaScript aqui).
  2. Carregue os arquivos somente nas páginas em que usamos o script ou o estilo.
  3. Pare de ter que usar! Importante em nosso arquivo style.css para fazer ajustes simples de CSS.

Passando Valores de PHP para JS com wp_localize_script()

Em seu blog, Vladimir Prelovac tem um ótimo artigo intitulado Melhor prática para adicionar código JavaScript a plugins do WordPress onde ele discute o uso de wp_localize_script() para permitir que você defina o valor de variáveis ​​em seu servidor PHP para ser usado posteriormente no seu Javascript do lado do cliente.

Controle Granulado Realmente Realizado com wp_print_scripts()

E, finalmente, se você precisa de um controle realmente refinado, você pode olhar para wp_print_scripts() como discutido em Beer Planet em um post intitulado Como incluir CSS e JavaScript condicionalmente e somente quando necessário pelos posts .

Epiloque

É sobre isso para Melhores Práticas de inclusão de arquivos Javascript com o WordPress. Se eu perdi alguma coisa (o que eu provavelmente tenho) não deixe de me informar nos comentários para que eu possa adicionar uma atualização para futuros viajantes.

78
MikeSchinkel

Para complementar a maravilhosa ilustração do Mike de usar enfileiramentos, gostaria apenas de salientar que os scripts incluídos como dependências não precisam ser enfileirados ...

Vou usar o exemplo sob o cabeçalho Scripts em um Plugin na resposta de Mike.

define('MY_PLUGIN_VERSION','2.0.1');

add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('jquery-ui-sortable');
    wp_enqueue_script('my-script',plugins_url('/js/my-script.js',__FILE__),array('jquery','jquery-ui-sortable'),MY_PLUGIN_VERSION);
}

Isso pode ser reduzido para ler ..

define('MY_PLUGIN_VERSION','2.0.1');

add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_scripts' );
function my_plugin_enqueue_scripts() {
    wp_enqueue_script('my-script', plugins_url( '/js/my-script.js', __FILE__ ), array('jquery','jquery-ui-sortable'), MY_PLUGIN_VERSION);
}

Quando você configura dependências, o WordPress irá encontrá-las e enfileirá-las prontas para o seu script, para que você não precise fazer chamadas independentes para esses scripts.

Além disso, alguns de vocês podem estar se perguntando se a configuração de dependências múltiplas pode fazer com que os scripts sejam exibidos na ordem errada, aqui, deixe-me dar um exemplo

wp_enqueue_script( 'first-script', 'example/path/example_script_1.js', array('second-script','third-script') );

Se o script dois fosse dependente do script três (ou seja, o script três deve ser carregado primeiro), isso não importaria, o WordPress determinará as prioridades de enfileiramento desses scripts e os exibirá na ordem correta; em resumo, tudo será resolvido automaticamente para você pelo WordPress.

11
t31os

Para pequenos pedaços de scripts, que você pode não querer incluir em um arquivo separado, por exemplo, porque eles são gerados dinamicamente, o WordPress 4.5 e ofertas adicionais wp_add_inline_script . Esta função basicamente trava o script para outro script.

Digamos, por exemplo, que você esteja desenvolvendo um tema e queira que seu cliente possa inserir seus próprios scripts (como o Google Analytics ou o AddThis) na página de opções. Você poderia então usar wp_add_inline_script para pegar esse script no seu arquivo js principal (digamos mainjs) assim:

$custom_script = get_option('my-script')
if (!empty($custom_script)) wp_add_inline_script ('mainjs', $custom_script);
0
cjbj

Minha maneira preferida é obter um bom desempenho, portanto, em vez de usar wp_enqueue_script, uso o HEREDOC com a API Fetch para carregar tudo de forma assíncrona em paralelo:

$jquery_script_path = '/wp-includes/js/jquery/jquery.js?ver=1.12.4';
$jquery_dependent_script_paths = [
  get_theme_file_uri( '/assets/js/global.js' ),
  get_theme_file_uri( '/assets/js/jquery.scrollTo.js' ),
  get_theme_file_uri( '/assets/js/skip-link-focus-fix.js' ),
  get_theme_file_uri( '/assets/js/navigation.js' )
];
$jquery_dependent_script_paths_json = json_encode($jquery_dependent_script_paths);
$inline_scripts = <<<EOD
<script>
(function () {
  'use strict';
  if (!window.fetch) return;
  /**
   * Fetch Inject v1.6.8
   * Copyright (c) 2017 Josh Habdas
   * @licence ISC
   */
  var fetchInject=function(){"use strict";const e=function(e,t,n,r,o,i,c){i=t.createElement(n),c=t.getElementsByTagName(n)[0],i.type=r.blob.type,i.appendChild(t.createTextNode(r.text)),i.onload=o(r),c?c.parentNode.insertBefore(i,c):t.head.appendChild(i)},t=function(t,n){if(!t||!Array.isArray(t))return Promise.reject(new Error("`inputs` must be an array"));if(n&&!(n instanceof Promise))return Promise.reject(new Error("`promise` must be a promise"));const r=[],o=n?[].concat(n):[],i=[];return t.forEach(e=>o.Push(window.fetch(e).then(e=>{return[e.clone().text(),e.blob()]}).then(e=>{return Promise.all(e).then(e=>{r.Push({text:e[0],blob:e[1]})})}))),Promise.all(o).then(()=>{return r.forEach(t=>{i.Push({then:n=>{"text/css"===t.blob.type?e(window,document,"style",t,n):e(window,document,"script",t,n)}})}),Promise.all(i)})};return t}();
  fetchInject(
    $jquery_dependent_script_paths_json
  , fetchInject([
    "{$jquery_script_path}"
  ]));
})();
</script>
EOD;

E, em seguida, inseri-los na cabeça, às vezes junto com estilos como este:

function wc_inline_head() {
  global $inline_scripts;
  echo "{$inline_scripts}";
  global $inline_styles;
  echo "{$inline_styles}";
}

Resultando em uma cascata assim, carregando tudo de uma vez, mas controlando a ordem de execução:

enter image description here

Nota: Isso requer o uso da API de busca, que não está disponível em todos os navegadores.

0
Josh Habdas