Funcionalidade compartilhada em plugins e temas


8

Recentemente, comecei a desenvolver plugins e temas e descobri que precisava usar várias funções de ambos.

Em algum momento, penso em verificar se a função / classe existe antes declarada como foi dito neste post: Quando verificar se existe uma função

Mas isso é considerado uma má prática. Qual é a melhor prática para evitar conflitos e manter os temas e o plug-in funcionando de maneira independente, sem um tema / plug-in instalado?

Respostas:


12

Ações e Filtros

A melhor maneira de imho é usar uma ação para incluir funções de plug-in em temas.

Exemplo 1

Aqui está um pequeno plugin para testar isso.

<?php 
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
    echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );

Dentro do tema:

<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );

O que acontece agora / O garoto kool

Dessa forma, não precisamos verificar a existência de uma função, um arquivo, uma classe, um método ou talvez até um (não faça isso!) Global $variable. O estagiário global do WP já aceita isso: verifica se o nome do gancho é o filtro atual e o anexa. Se não existe, nada acontece.

Exemplo 2

Com o nosso próximo plug-in, estamos anexando uma função de retorno de chamada que requer um argumento.

<?php 
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
    return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );

Dentro do tema:

<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );

Desta vez, oferecemos ao usuário / desenvolvedor a possibilidade de adicionar um argumento. Ele pode echo/printproduzir a saída ou até processá-la ainda mais (caso você tenha uma matriz em troca).

Exemplo 3

Com o terceiro plug-in, estamos anexando uma função de retorno de chamada que recebe dois argumentos.

<?php 
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
    return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );

Dentro do tema:

<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
     " "
    ,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
     // Highlight the $thing
     if ( strstr( 'World', $part ) 
     {
         echo "<mark>{$part} </mark>";
         continue;
     }
     echo "{$part} ";
}

Este plugin agora nos permite inserir dois argumentos. Podemos salvá-lo em um $variablee mais processá-lo.

Conclusão

Com o uso de filtros e ações, você obtém melhor desempenho, evitando verificações desnecessárias (compare a velocidade function_*/class_*/method_*/file_existsou a pesquisa de um global com in_array()~ 1k (?) Pesquisas de filtro). Você também evita receber todos os avisos desnecessários para não definir variáveis, etc., pois o plug-in se preocupa com isso.


2
Ótimas informações sobre um tópico de práticas recomendadas!
Adam

1
Obrigado Kaiser, você vem com as melhores práticas possíveis para esses problemas. obrigado novamente!
Jeg Bagus

btw, precisamos dar um nome diferente para a mesma funcionalidade compartilhada entre o plugin e os temas, certo?
Jeg Bagus

digamos que eu tenha a função que chamo de jlog, que fará o empacotamento simples antes da variável e imprimirá o conteúdo dessas variáveis. eu adiciono a função jlog em temas e plugins, como posso evitar qualquer conflito?
Jeg Bagus

1
@JegBagus Você é um homem muito confuso :) Atualize sua pergunta com as funções exatas e explique o que elas estão fazendo e onde deveriam estar fazendo alguma coisa. E limpe seus comentários aqui. Obrigado.
kaiser
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.