Funcionalidad compartida en complementos y temas

8

Recientemente comencé a desarrollar complementos y temas y descubrí que necesito usar varias funciones de ambos.

En algún momento pienso en verificar si la función / clase existe antes de declararse como se dijo en esta publicación: Cuándo verificar si existe una función

Pero eso se considera una mala práctica. ¿Cuál es la mejor práctica para evitar conflictos y mantener los temas y el complemento funcionando independientemente sin un tema / complemento instalado?

Jeg Bagus
fuente

Respuestas:

12

Acciones y filtros

El mi humilde opinión la mejor manera es utilizar una acción para llevar las funciones de plug-in en los temas.

Ejemplo 1

Aquí hay un pequeño complemento para probar esto.

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

Dentro del tema:

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

Que pasa ahora / El niño kool

De esta manera no tenemos que verificar la existencia de una función, un archivo, una clase, un método o incluso un (¡no hagas esto!) Global $variable. El interno de WP global ya toma esto por nosotros: comprueba si el nombre del gancho es el filtro actual y lo adjunta. Si no existe, no pasa nada.

Ejemplo # 2

Con nuestro próximo complemento, adjuntamos una función de devolución de llamada que toma un 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 del tema:

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

Esta vez, ofrecemos al usuario / desarrollador la posibilidad de agregar un argumento. Puede echo/printgenerar la salida o incluso procesarla más (en caso de que obtenga una matriz a cambio).

Ejemplo # 3

Con el tercer complemento, adjuntamos una función de devolución de llamada que toma dos 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 del 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 complemento ahora nos permite insertar dos argumentos. Podemos guardarlo en un $variableproceso adicional.

Conclusión

Con el uso de filtros y acciones, está proporcionando un mejor rendimiento al evitar verificaciones innecesarias (compare la velocidad function_*/class_*/method_*/file_existso la búsqueda de un in_array()filtro global con ~ 1k (?) Búsquedas). También evita tener todos esos avisos innecesarios para no establecer variables, etc., ya que el complemento se preocupa por esto.

emperador
fuente
2
¡Gran conocimiento sobre un tema de mejores prácticas!
Adam
1
Gracias Kaiser, vienes con la mejor práctica posible para estos problemas. ¡gracias de nuevo!
Jeg Bagus
por cierto, debemos dar un nombre diferente para la misma funcionalidad compartida entre el complemento y los temas, ¿verdad?
Jeg Bagus
digamos que tengo una función que llamo jlog que hará un simple ajuste previo a la variable e imprimirá el contenido de esas variables. agrego la función jlog en temas y complementos, ¿cómo puedo evitar cualquier conflicto?
Jeg Bagus
1
@JegBagus Eres un hombre muy confundido :) Actualiza tu pregunta con las funciones exactas y explica qué están haciendo y dónde deberían estar haciendo algo. Y por favor limpia tus comentarios aquí. Gracias.
kaiser