Prácticas Objetivas Recomendadas para el Desarrollo de Plugins?

23 ago 2010, 06:53:13
Vistas: 18K
Votos: 138

Comenzando un wiki comunitario para recopilar las mejores prácticas objetivas para el desarrollo de plugins. Esta pregunta fue inspirada por los comentarios de @EAMann en wp-hackers.

La idea es colaborar en definir cuáles podrían ser las mejores prácticas objetivas para que eventualmente podamos usarlas en algún proceso de revisión colaborativa de la comunidad.

ACTUALIZACIÓN: Después de ver las primeras respuestas, queda claro que debemos tener solo una idea/sugerencia/mejor-práctica por respuesta y las personas deben revisar la lista para asegurarse de que no haya duplicados antes de publicar.

3
Comentarios

Realmente no entiendo cómo debería funcionar el wiki comunitario en esto (y en los demás) con SE correctamente, pero quizás esa es una pregunta para meta. Solo acumulará principalmente respuestas duplicadas.

hakre hakre
23 ago 2010 14:57:34

@hakre: Excelente punto. Después de ver esto, voy a agregar a la descripción que las personas deben agregar solo una idea por "respuesta" y voy a cambiar mi respuesta existente para que sean múltiples respuestas.

MikeSchinkel MikeSchinkel
23 ago 2010 19:21:00

Lectura relacionada: Los 10 errores más comunes en los plugins de Wordpress

Sisir Sisir
4 dic 2013 12:01:48
Todas las respuestas a la pregunta 6
3

Prueba tu plugin

Definitivamente deberíamos tener algunas herramientas de prueba en nuestro entorno de desarrollo de plugins.

Basado en esta respuesta de Ethan Seifert a una pregunta sobre pruebas, estas son buenas prácticas a seguir:

  • Tu Prueba de Unidad debe evaluar la cantidad más pequeña de comportamiento que una clase puede realizar.
  • Cuando llegas al nivel de pruebas funcionales, aquí es donde puedes evaluar tu código con dependencias de Wordpress.
  • Dependiendo de lo que haga tu plugin - considera usar pruebas basadas en Selenium que evalúan la presencia de datos en el DOM usando IDs
16 feb 2011 06:44:57
Comentarios

Aunque las pruebas son importantes, decir que las pruebas unitarias deben probar lo más pequeño en lugar de lo más grande parece poco sabio. Si tienes dificultades para probar los problemas dependientes de WordPress, simplemente sumérgete en el núcleo de WordPress, encontrarás un montón de variables globales internas que puedes usar para ver si los elementos han funcionado.

Backie Backie
16 feb 2011 12:51:40

Pero cubrir primero lo más pequeño es básico, para que puedas llegar a las pruebas funcionales con WordPress como dice la respuesta, ¿no es así?

Fernando Briano Fernando Briano
17 feb 2011 05:55:53

Esto es un plugin, no una aplicación, ¿puedes probar una aplicación Java sin Java Runtime? Sí, escribiendo Java como un mockup y luego probando tu plugin. Las probabilidades son que los errores estén en tu mockup. *) descargo de responsabilidad o compilándolo a código nativo.

edelwater edelwater
18 feb 2011 03:18:28
0

Preocúpate por futuras versiones de WordPress y del tema

Nota: Después de releer este consejo, ahora me retracto de esta práctica ya que verificar cada función para ver si existe puede ralentizar tu sitio.

Verifica si las funciones están obsoletas directamente en tu tema.

Este es un ejemplo "podría ser así".

if ( ! function_exists( 'wp_some_fn' ) ) 
{
    $theme_data = wp_get_theme();
    $error = new WP_Error( 'wp_some_fn', sprintf( __( 'La función %1$s está obsoleta. Por favor informa al autor', TEXTDOMAIN ), "Tema: {$theme_data->Name}: Versión {$theme_data->Version}" );

    // abortar
    if ( is_wp_error( $error ) )
        return print $error->get_error_message();
} 
// else if no error - la función existe y funciona
wp_some_fn();

Para un manejo de errores adecuado/mejores prácticas, consulta esta respuesta: enlace

Podrías incluso incluir la $cause dentro de la función. Esto te ayudará a ti y a tus usuarios a mantenerse al tanto de las funciones o clases en tu tema que podrían cambiar.

22 oct 2010 18:46:51
2

Usa Nombres Adecuados

Nombra hooks y filtros (clases, funciones y variables), de modo que las personas puedan identificarlos incluso dentro de un año, cuando ya no recuerden de dónde viene ese trozo de código. No importa si los nombres de hooks/filtros son largos. Ej. tunombredeproyecto_hook/filtro_quéhace.

  • Si tu archivo contiene una clase llamada "dbdbInit", entonces el archivo que contiene la clase debería llamarse "dbdbInit.class.php".
  • Si dentro de tu clase dbdbInit tienes una función que registra tipos de posts personalizados, llámala registrar_tipos_de_posts_personalizados().
  • Si tienes un array que contiene los nombres de los tipos de posts personalizados, entonces llama a la variable donde se asigna el array $nombres_de_tipos_de_posts_personalizados.
  • Si tienes una función que maneja un array, escribe function manipulador_de_array( $array ) { // maneja el array }.
  • Intenta nombrar las cosas de manera que sepas qué hace o a qué pertenece solo por su nombre.

Otra cosa: Si tienes que depurar código, en el 99% de los casos recibirás mensajes no solo de tu código, sino también de WordPress. Por eso, intenta usar el mismo prefijo, por ejemplo "dbdb", para tus clases, funciones públicas y variables/objetos. De esta manera, podrás encontrarlos fácilmente entre cientos de archivos. (WordPress carga 64 archivos antes que tu tema y alrededor de 1,550 funciones, sin contar hooks y filtros).

24 ago 2010 10:02:38
Comentarios

Realmente no tengo una idea clara de lo que esto significa. La primera oración no está completa. Esto necesita ser reescrito y aclarado.

MikeSchinkel MikeSchinkel
25 ago 2010 23:02:22

apegarse a los estándares de WP al nombrar archivos y funciones también es bueno, ej. "class-db-init.php" http://codex.wordpress.org/WordPress_Coding_Standards

gabrielk gabrielk
21 jun 2011 19:29:54
9

Desacoplar del código principal de WordPress

Un plugin debería reducir el impacto de la API de WordPress al mínimo necesario para separar el código del plugin del código de WordPress. Esto reduce el impacto de los cambios dentro del código base de WordPress en el plugin. Además, mejora la compatibilidad multiplataforma de tu código de plugin.

Esto no significa no usar funciones de WordPress (úsalas, como sugiere Reutilizar funciones existentes), sino no entrelazar demasiado tu código con funciones de WordPress, sino separar la lógica de negocio de tu plugin de la funcionalidad de WordPress.

23 ago 2010 15:08:57
Comentarios

Estoy teniendo problemas con la redacción de esto. ¿Quieres decir que un plugin debería usar la API de WordPress siempre que sea posible en lugar de acceder directamente a las tablas SQL y/o a las variables globales?

MikeSchinkel MikeSchinkel
25 ago 2010 22:41:41

Bueno. Una vez tuvimos que manejar datos de formulario en un proyecto, así que accedíamos a $_REQUEST. Luego cambiaron el slashing dentro de eso. Así que en lugar de usar $_REQUEST directamente, usa una función que tenga una única llamada a $_REQUEST para todo el plugin. En caso de que cambie el slashing, solo esta función necesitará ser modificada. Esto no va en contra de usar la API de WordPress, sino de desacoplar el plugin de ella para poder reaccionar mejor a los cambios en el núcleo de WP. Esto ayuda a mantener tus plugins a largo plazo. Para un simple gadget, esto no es necesario.

hakre hakre
25 ago 2010 23:10:13

Como desarrollador intermitente durante 23 años, he visto muchos ciclos y muchas prácticas recomendadas que van y vienen. He visto el péndulo oscilar ampliamente en ambas direcciones. Ahora creo en la moderación. En mis primeros años abstraía todo, pero aprendí que la abstracción añade complejidad que a menudo es peor que el beneficio esperado. Cuando vemos algo que nos causa problemas como personas, inmediatamente buscamos formas de protegernos de ello en el futuro, pero a menudo el remedio es más dañino que la enfermedad. En EE.UU., Sarbanes-Oxley es un ejemplo de esto.

MikeSchinkel MikeSchinkel
26 ago 2010 10:01:40

Solía creer que las variables globales eran simplemente malas. Y luego trabajé con WordPress y, sabes qué, tienen sus beneficios cuando se usan con moderación. Podría escribir un libro sobre este tema (aunque no planeo hacerlo; demasiado trabajo para muy poca recompensa). ¿Dónde veo el péndulo ahora? La simplicidad tiene el mayor valor. Probablemente sea mejor no abstraer y luego simplemente resolver los problemas cuando y si surgen, en lugar de gastar muchos más ciclos por temor a que puedan surgir. Así que me inclino a votar en contra de esto.

MikeSchinkel MikeSchinkel
26 ago 2010 10:04:16

Solo por una pregunta breve que hice en wp-hackers: Te odian si usas variables globales como $wp_taxonomies, porque son "internas" (sé que hay algunas que deberían usarse como $wp_query o $post)...

kaiser kaiser
16 feb 2011 12:12:10

@kaiser - O algo es interno o cambiarlo romperá la compatibilidad hacia atrás. Eso es todo sobre el espacio global en WordPress.

hakre hakre
16 feb 2011 12:19:49

@hakre: ¿Quién dijo algo sobre cambiar? Obtener y usar datos de esto es de lo que estoy hablando. No siempre hay una función que haga lo que necesitas y antes de terminar haciendo consultas SQL personalizadas, simplemente las uso.

kaiser kaiser
16 feb 2011 12:32:09

@kaiser: Cambiar en el sentido de que los datos cambiarán en estas vars. ¿O incluso querías cambiar datos dentro de arrays globales? ;) Es un gran ahorro de tiempo. Incluso si las cosas se rompen con una nueva versión, es rápido de arreglar.

hakre hakre
16 feb 2011 13:16:31

@hakre: No, no estoy jugando/manipulando dentro de los datos que sirven los global $vars. Y sí: es mejor ir por este camino y romper en una versión futura en vez de lidiar con 5 funciones que también podrían quedar obsoletas (y no estar marcadas como tal) y luego arreglarlo en 5 minutos. Ahorro de tiempo: +1.

kaiser kaiser
16 feb 2011 13:21:24
Mostrar los 4 comentarios restantes
4

Usar opciones de WordPress para cadenas de salida de plugins

Para que el plugin sea fácil de usar y personalizable, todas las cadenas de salida deberían poder modificarse. La mejor manera de hacer esto es usar las opciones de WordPress (wp-options) para almacenar las cadenas de salida y proporcionar una interfaz de backend para cambiar los valores predeterminados. El plugin no debería usar cadenas mostradas que no puedan cambiarse fácilmente usando el backend del plugin.

Por ejemplo: Sociable - te da la capacidad de cambiar la frase que aparece antes de la parte de los íconos "compartir y disfrutar:"

25 ago 2010 02:30:07
Comentarios

¿Qué es exactamente un "string de plugin"? ¿Puedes dar ejemplos de casos de uso? Además, por favor escribe en oraciones completas para que esto pueda ser un recurso más valioso.

MikeSchinkel MikeSchinkel
25 ago 2010 23:06:05

Si tienes internacionalización, esto debería ser redundante.

Raphael Raphael
15 nov 2010 13:29:41

No estoy de acuerdo. Hace las cosas más fáciles para los usuarios finales, pero más difíciles para los desarrolladores. Como dijo Raphael, debería usarse i18n en su lugar.

scribu scribu
6 ene 2011 23:09:13

Estoy de acuerdo con Raphael y scribu. Las funciones gettext son fáciles de filtrar, no hay necesidad de almacenar redundante contenido textual en la base de datos.

Rarst Rarst
10 ene 2011 09:42:28
0

Usa los hooks de desinstalación, activación y desactivación

Existen tres hooks diferentes para esto:

  • Desinstalación register_uninstall_hook();
  • Desactivación register_deactivation_hook();
  • Activación register_activation_hook();

Puedes encontrar aquí una instrucción detallada con un ejemplo funcional..

28 oct 2011 14:24:36