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?

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.