Hooks são a ponte entre seu plugin e o ecossistema maior (WordPress). Você não pode escrever plugins sem ganchos. Você ficaria surpreso com quantos plugins os usam mal.
O primeiro passo para o uso adequado de hooks é simplesmente reservar o tempo adequado para ler a documentação oficial da API Hooks Plugin . Você quer ter uma compreensão profunda de qual gancho é acionado em qual parte da sequência, desde a solicitação da página até o envio de conteúdo para o navegador. A API Action Reference nos mostra em que ordem as coisas normalmente são acionadas.
Há muitos ganchos para escolher e, dependendo do que seu plug-in faz, talvez seja necessário conectar muitos deles. Eu sempre sigo a prática de subdividir a funcionalidade para ser distribuída da maneira mais relevante possível em meus ganchos. Isso ocorre porque, para o desenvolvimento de plugins, é uma boa ideia adotar uma mentalidade “just in time” (JIT) executando o código apenas quando necessário.
Se você precisar configurar algumas variáveis globais ou registrar tipos de postagem, independentemente de qual página está sendo carregada, isso provavelmente deve ser acionado em init. Você não deve preparar HTML nem fazer nenhum processamento pesado initna maioria dos casos. Qualquer processamento extenuante dentro do initgancho significará que todos os carregamentos de página de front-end, carregamentos de página de administração, solicitações AJAX e outros estarão sujeitos aos atrasos causados por esses processos pesados.
Isso não é o ideal e deve ser evitado para um melhor desempenho de seu site profissional.
- Recuperar configurações (dependendo do tipo de usuário e da página solicitada)
- Capturar dados enviados
Atualização: Obrigado por aqueles nos comentários por me corrigir aqui. O gancho apropriado para enfileirar scripts é ‘wp_enqueue_scripts’, atualizei o exemplo a seguir para usar este formulário mais limpo (prática recomendada) O bloco de código a seguir é um exemplo geral de como enfileirar scripts condicionalmente com o wp_enqueue_scriptsgancho. Você verá que tenho o cuidado de alimentar apenas os recursos necessários para cada tipo de página.
Nenhuma folha de estilo de administração, a menos que o usuário esteja carregando uma das páginas de administração do plug-in. Da mesma forma, nenhuma folha de estilo de front-end foi carregada para a interface de back-end.
<?php #} Plugin Init add_action(‘init’, ‘examplePlugin_init’); function examplePlugin_init(){ global $examplePlugin_Settings; #} Retrieve settings (if not loaded) $settings = $examplePlugin_Settings->getAll(); #} Catch any posted data here } function examplePlugin_enqueueScripts(){ #} Admin & Public (Global) Scripts (I usually make sure jQuery’s lined up) wp_enqueue_script(“jquery”); #} Public-Global – JS & CSS wp_enqueue_script(‘examplepluginjs’, plugins_url(‘/js/examplePlugin.min.js’,__FILE__),array(‘jquery’)); wp_enqueue_style(‘exampleplugincss’, plugins_url(‘/css/examplePlugin.min.css’,__FILE__) ); #} Any specifically enabled elements if ($settings[‘showElement’] == 1) wp_enqueue_script(‘examplepluginextrajs’, plugins_url(‘/js/examplePlugin.extraFeature.min.js’,__FILE__), array(‘jquery’)); } #} Add to hook add_action( ‘wp_enqueue_scripts’, ‘examplePlugin_enqueueScripts’ ); function examplePlugin_enqueueAdminScripts(){ #} Admin & Public (Global) Scripts (I usually make sure jQuery’s lined up) wp_enqueue_script(“jquery”); #} Admin-Global – JS & CSS #} Try not to use these, unless specifically necessary, use the below method #} Admin only + specifically a plugin admin page if (examplePlugin_isAdminPage()) { #} Plugin-specific Admin styles wp_enqueue_style(‘examplepluginadmincss’, plugins_url(‘/css/examplePlugin.admin.min.css’,__FILE__) ); } #} Admin only + WordPress Edit Page specifically if (examplePlugin_is_edit_page()){ #} Anything which is to load on the edit post/edit page, page #} For example shortcode inserter functionality } else { #} Anything which is to load on non-editor admin pages } #} Admin only + WordPress editor on page if (get_user_option(‘rich_editing’) == ‘true’) { #} This is another way of targetting the WordPress Editor #} In this instance we use this to localize a script: wp_localize_script( ‘examplepluginadminjs’, ‘exampleAJAX’, array( ‘ajaxurl’ => admin_url( ‘admin-ajax.php’ ))); } } #} Add to hook add_action( ‘admin_enqueue_scripts’, ‘examplePlugin_enqueueAdminScripts’ ); #} Example function for detecting if the requested page is an edit page function examplePlugin_is_edit_page($new_edit = null){ #} Global global $pagenow; #} Ensure we are in admin if (!is_admin()) return false; #} Detect edit page type if($new_edit == “edit”) #} Edit page return in_array( $pagenow, array( ‘post.php’, ) ); elseif($new_edit == “new”) #} New Edit page return in_array( $pagenow, array( ‘post-new.php’ ) ); else #} New or Edit page return in_array( $pagenow, array( ‘post.php’, ‘post-new.php’ ) ); } #} Determines if this is our admin page function examplePlugin_isAdminPage(){ #} This is defined on init, and is a simple array of page slugs global $examplePlugin_slugs; #} Detect page if (isset($_GET[‘page’])) if (in_array($_GET[‘page’],$examplePlugin_slugs)) return true; return false; }
Além initde , wp_enqueue_scriptse admin_enqueue_scripts, você provavelmente precisará usar uma combinação dos seguintes ganchos de ação, que para a maioria dos plug-ins será suficiente para modularizar a lógica do código sem causar problemas de desempenho ou desafios de manutenção.
- admin_menu
- admin_notices
- wp_head
- wp_footer
- wp_ajax_[yourFunction]
Nota: Alguns temas tenderão a abandonar wp_footer, (e às vezes até wp_head), em favor de suas próprias versões. Esses temas do WordPress geralmente são escritos rapidamente ou da variedade hack-y, mas são mais comuns do que você esperaria.
Portanto, sempre teste seu plugin com o máximo de temas possível se sua intenção for fornecer compatibilidade universal.