Pregunta

A partir de un wiki de la comunidad a obtener hasta objetivas las mejores prácticas para el desarrollo de plugins. Esta pregunta se inspiró en los comentarios @ de EAMann en wp-hackers .

La idea es colaborar en lo que las mejores prácticas objetivas podrían ser potencialmente para que finalmente los podemos utilizar de alguna proceso de revisión colaboración de la comunidad.

ACTUALIZACIÓN: Después de ver las primeras respuestas se hace evidente que necesitamos tener una sola idea / sugerencia / mejores prácticas por la respuesta y la gente debe revisar la lista para asegurarse de que no hay duplicados antes publicación.

¿Fue útil?

Solución

Use acciones y filtros

Si usted piensa que la gente le gustaría añadir o modificar algunos datos: apply_filters () antes de regresar .

P.S. Una cosa que me parece un poco decepcionante y que sus direcciones de interrogación es el porcentaje de los plugins que están diseñados sólo para los usuarios finales, es decir, que no tienen ganchos de los suyos. Imagínese si WordPress fueron diseñados como la mayoría de los plugins? Sería poco flexible y una solución de nicho muy.

Tal vez las cosas serían diferentes si WordPress iban a tener la capacidad de auto-plugins instalar en la que dependían otros plugins? Como es que suelen tener que escribir una gran parte de la funcionalidad que necesito a partir de cero, porque los clientes quieren que las cosas de cierta manera y los plugins disponibles, mientras que el 90% no, no me permite la flexibilidad para actualizar el restante 10%.

yo realmente desean los que dieron lugar a la comunidad de WordPress identificaría una manera de asegurar que los plugins son recompensados ??por seguir las mejores prácticas (tales como la adición de ganchos para otros desarrolladores) al igual que buenas respuestas son recompensados ??en un sitio StackExchange.

Vamos a tomar un ejemplo de otra pregunta :

Ejemplo: Quiero hacer algo en mi plug-in cuando alguien retweets un artículo. Si había un gancho personalizada en cualquiera que sea el complemento de retweet populares es que pude conectar a disparar y fuera de, que sería grande. No hay, por lo que puede modificar su plugin para incluirlo, pero que sólo funciona para mi copia, y yo no quiero tratar de redistribuir eso.

Relacionados

Otros consejos

Secuencias de comandos de carga / CSS con wp_enqueue_script y wp_enqueue_style

Los plugins no deben cargar / intentará cargar versiones duplicadas de archivos JS / CSS, especialmente jQuery JS y otros archivos incluidos en WP Core.

Plugins debe utilizar siempre wp_enqueue_script y wp_enqueue_style al vincular archivos JS y CSS y nunca directamente a través de las etiquetas <script>.

Relacionados

I18n apoyar

Todas las cadenas de salida debe estar vinculado a un dominio de texto apropiado para permitir la internacionalización de las partes interesadas, incluso si el desarrollador no tiene ningún interés en la traducción de su propio plug-in.

Tenga en cuenta que es muy importante para cargar los archivos de idioma durante la acción init por lo que el usuario puede enganchar en la acción.

Ver el Codex: I18n para WordPress Desarrolladores

Y también este artículo: Cargando WP archivos correctamente el <. / p>

Desde WordPress 4.6 +

WP 4.6 cambió el orden de carga y las ubicaciones seleccionadas, se ha hecho mucho más fácil para los desarrolladores y usuarios.

Teniendo en cuenta un plugin con un textdomain 'mi-plugin', WordPress ahora buscará primero un archivo de traducción en:
/wp-content/languages/plugins/my-plugin-en_US.mo

Si no puede encontrar uno allí entonces buscar uno donde el plugin dice que se vea (usualy en el lenguaje '' los pluigns carpeta si tras el códice):
/wp-content/plugins/my-plugin/languages/my-plugin-en_US.mo

Por último, si no se encuentra un archivo de idioma que se compruebe la ubicación predeterminada de:
/wp-content/languages/my-plugin-en_US.mo

El primer cheque fue agregado en 4.6 y ofrece a los usuarios un lugar definido para agregar un archivo de idioma, como antes se tendría que saber dónde está el desarrollador agrega el archivo de idioma, ahora el usuario sólo tiene que saber textdomain del plugin: /wp-content/languages/plugins/TEXTDOMAIN-LOCAL.mo


A continuación se muestra la manera de edad (No relevante, ya que WP 4.6 +)

[...]
Por último, me gustaría señalar que es importante personalizados de carga de archivos de idioma del usuario WP_LANG_DIR antes de cargar los archivos de idioma que se incluyen con el plugin . Cuando varios mo-archivos se cargan para el mismo dominio, se utilizará la primera traducción se encuentran. De esta manera los archivos de idioma proporcionados por el plugin servirán como punto de retorno para las cadenas no traducidas por el usuario.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}

Asegúrese de plugins no generan errores con WP_DEBUG

Se debe comprobar siempre con sus plugins WP_DEBUG encendido y lo ideal es tenerlo encendida durante todo el proceso de desarrollo. Un plugin no debe ser desechado cualquier error con el WP_DEBUG. Esto incluye avisos en desuso e índices sin marcar.

Para activar la depuración, editar su archivo wp-config.php de manera que la constante WP_DEBUG se establece en true. Vea la Codex sobre depuración para más detalles.

Primera Use Existing Funciones en WordPress Core

Si usted puede: uso existente funciones incluidas en WordPress núcleo en lugar de escribir el suyo propio. Sólo el desarrollo de las funciones de PHP personalizados cuando no hay una función apropiada preexistente en WordPress núcleo.

Una de las ventajas es que se puede utilizar "log avisos obsoletos" para supervisar fácilmente las funciones que deben ser reemplazados. Otro beneficio es que los usuarios pueden ver la documentación de la función en el Codex y comprender mejor lo que hace el plugin, incluso si no son un desarrollador de PHP con experiencia.

Relacionados

desinstalación debe eliminar todos los datos de un plugin

Tras ser eliminado de una instalación de WordPress, un plugin debe eliminar todos los archivos, carpetas, entradas de bases de datos y tablas que se creó, así como los valores que creó .

Plugins puede ofrecer una opción de configuración de exportación / importación, por lo que los ajustes se pueden guardar fuera de WordPress antes de la eliminación.

Relacionados

Inyección SQL Prevenir con la entrada de datos

Un plugin debería desinfectar todas las entradas de usuario recuperada directamente o indirectamente (por ejemplo a través de $_POST o $_GET ) antes de utilizar los valores de entrada para consultar la base de datos MySQL.

Ver: de formato SQL

.

Prefijo All Global de espacio de nombres de artículos

Un plugin debe correctamente delante de todos los elementos globales de espacio de nombres (constantes, funciones, clases, variables, incluso cosas como taxonomías personalizadas, tipos de correos, widgets, etc.). Por ejemplo, no cree una función llamada init(); en cambio, el nombre de algo así como jpb_init().

Su común debe utilizar un prefijo de tres o cuatro letras delante de nombres o para hacer uso de la PHP Espacio de nombres de funciones . Comparar: una sola letra prefijo para las constantes de clase PHP

Relacionados

Utilice un código de clase y PHP5 orientado a objetos

No hay razón para no escribir código PHP5 limpia, orientado a objetos. PHP4 eliminará después de la próxima versión (WP 3.1). Por supuesto, se puede prefijar todos sus nombres de función para terminar con endlessly_long_function_names_with_lots_of_underscores, pero es mucho más fácil simplemente escribir una clase simple y haz todo eso. También, ponga su clase en un archivo separado y el nombre que en consecuencia para que pueda extender y mantener fácilmente:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

La desactivación no debe provocar la pérdida de datos

Un plugin no debe eliminar cualquiera de sus datos en los desactivación .

Relacionados

Sólo incluir archivos que necesita ...

Si estás en la parte delantera, no incluyen código que se refiere al área de administración.

Anuncio de Información-Pérdida en Plugin desinstalación

A la desinstalación un plugin debe a preguntar al usuario que será eliminarlo de datos y recibir una confirmación de que el usuario está de acuerdo con el borrado los datos antes de hacerlo y un plugin debe también permitir al usuario la opción de mantener los datos sobre la desinstalación. (Esta idea de @EAMann.)

Relacionados

Vamos a nombre de la carpeta plugin de ser cambiado

/ plugins / pluginname / {} diferentes

El "pluginname" que se utiliza para la carpeta debe ser siempre cambiante.

Esto normalmente se maneja mediante la definición de constantes y consistentemente su uso en todo el plugin.

Ni que decir tiene muchos plugins populares son pecadores.

Relacionados:

  • plugins_url() para enlazar fácilmente a los recursos, incluido con plug-in.

Uso WordPress (incorporada) Tratamiento de errores

No se limite a return; si alguna entrada del usuario que estaba mal. a entregar alguna información sobre era que estaba mal hecho.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

Un error (objeto) para todos

Se puede configurar un objeto de error global para el tema o plug-in durante el arranque:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

Más tarde se puede añadir un número ilimitado de errores en la demanda:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

A continuación, puede traer a todos al final de su tema. De esta manera no interrumpa la prestación de la página y todavía puede salir todas sus errores para el desarrollo

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

Se puede encontrar más información en este Q . Un billete relacionada solucionar el "trabajando juntos" de WP_Error y wp_die() está enlazada desde allí y otro boleto seguirá. Comentarios críticos, y tal es apreciado.

Minimizar nombres agregados al espacio de nombres global

Un plugin debe reducir su impacto lo más posible por minimizando el número de nombres que se suma al espacio de nombres global .

Esto se puede hacer mediante la encapsulación de las funciones del plugin en una clase o utilizando el espacios de nombres de PHP cuentan . Anteponiendo todo puede ayudar también, pero no es tan flexible.

Al lado de funciones y clases, un plugin no debe introducir variables globales. Utilización de las clases normalmente se les deja obsoleto y se simplifica el mantenimiento plug-in.

Relacionados

Comentario usando PHPDoc

La mejor práctica es cercano al estilo PHPDoc. Si no se utiliza un IDE como "Eclipse", sólo puede echar un vistazo en el PHPDoc Manual .

Usted no tiene que saber exactamente cómo funciona este. Desarrolladores Profesionales puede leer el código de todos modos y sólo necesita esto como un resumen. programadores y usuarios de la manía puede apreciar la forma en que explica que en el mismo nivel de conocimientos.

API utilizar los ajustes antes add_option

En lugar de añadir opciones a la base de datos a través de la función add_option, debe guardarlas como una matriz con el uso de la API de configuración que se encarga de todo para usted.

utilizar el tema Modificaciones API antes add_option

El Modificaciones API es una construcción sencilla y bastante una manera segura que permite añadir y recuperar opciones. Todo se guarda como valor serializado en su base de datos. Fácil, seguro y sencillo.

Proteger Plugin privacidad de los usuarios

(Anteriormente: Anónimo API de comunicación)

Si un plugin se comunica con un sistema externo o API (por ejemplo, algunos de servicio web), debe hacerlo de forma anónima o proporcionar al usuario una opción anónimo que garantice que no los datos relacionados con el usuario de las fugas plugin para un segundo partido sin control.

Plugins anfitrión en WordPress.org

Utilice la SVN repositorio proporcionado en WordPress.org para alojar plugins. Se convierte en una actualización de experiencia de usuario más fácil y si usted nunca ha usado antes de SVN, se pone a comprender realmente por su uso en un contexto que lo justifique.

proporcionar control de acceso utilizando permisos

En muchos casos, los usuarios pueden no queremos que todos tengan acceso a las zonas creadas por su plugin especialmente con plugins que hacen múltiples operaciones complejas, un solo cheque capacidad codificado puede no ser suficiente.

Por lo menos, tener cheques capacidad adecuada para todos los diferentes tipos de procedimientos de su plugin se puede utilizar para.

configuración del plugin de importación / exportación

No es que común a través de plugins, pero si su plugin tiene (algunos) los ajustes, que debe proporcionar importación / exportación de datos como la configuración y la entrada del usuario .

Importar / Exportar mejora la usabilidad de un plug-in.

Un ejemplo-plugin que tiene una funcionalidad tal importación y exportación (y así un mecanismo de deshacer) es los listados de NavXT (Wordpress Plugin) (información completa: algún pequeño código por mí en allí, la mayoría ha sido hecho por mtekk).

Relacionados

Organizar su código

Es todos los días difíciles de leer el código que no está escrito en el orden en que llegar de ejecutados. En primer lugar incluir / requieren, definir, wp_enqueue_style y _script, etc., entonces las funciones que necesita el plug-in / temáticos y por último el constructor (ej. Pantalla de administración, cosas que se integra en el tema, etc.).

Trate de cosas separadas como CSS y JS en sus propias carpetas. Además, trate de hacer esto con las funciones que son únicos ayudantes, como flatteners matriz y similares. Mantener el archivo "principal" tan limpio y fácil de leer como sea posible es una manera que ayuda a los usuarios, desarrolladores y que, al intentar la actualización en un año y no ha visto el código para un tiempo más largo.

También es bueno tener una estructura se repitan con frecuencia, por lo que siempre encontrará su camino a través. El desarrollo de una estructura conocida en diferentes proyectos le dará tiempo para que sea mejor e incluso si el cliente cambia a otro desarrollador, nunca se escuchará "dejó un caos". Esto construye su reputación y debe ser un objetivo a largo plazo.

Die con estilo

troquel de una manera decente De los plugins y temas (incluso) funciones deben utilizar wp_die() en lugares críticos para ofrecer al usuario una poca información sobre lo que había sucedido. errores de PHP son molestos y wp_die pueden dar al usuario un mensaje de estilo agradable de lo que el plug-in (o ellos) hizo mal. Además, si el usuario ha desactivado la depuración el plugin solo se romperá.

El uso de wp_die() también ayuda a que sus plugins / temas son compatibles con el wordpress banco de pruebas .

Relacionado:

Proporcionar Pantallas de ayuda para los usuarios

Es más agradable que decir RTFM (clic ayuda) como una respuesta de tener que responder a la pregunta una y otra vez.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

Actualización / nota: (ver los comentarios de Kaiser): el ejemplo anterior es para ser usado en una clase

formas de oferta extensibles

Cuando un plugin ofrece la posibilidad a los datos de entrada, que siempre deben tener un gancho al final, justo antes de que el "enviar" y / o "reset", por lo que los desarrolladores pueden ampliar fácilmente la forma con no sólo los campos, pero botones también.

Ver: API de configuración

Relacionados

incluir siempre a través de la función de gancho, no directamente.

Ejemplo:

  • uso Dont para incluir la clase del complemento a través de nuevo sin gancho

  • El uso del gancho plugins_loaded

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );
    

Actualización: un pequeño ejemplo vivo: Plugin-SVN-tronco-página y un pseudo ejemplo

//avoid direct calls to this file where wp core files not present
if (!function_exists ('add_action')) {
        header('Status: 403 Forbidden');
        header('HTTP/1.1 403 Forbidden');
        exit();
}

if ( !class_exists( 'plugin_class' ) ) {
    class plugin_class {

        function __construct() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

También puede cargar a través de mu_plugins_loaded en múltiples sitios a instalar, consulte el códice de referencia de acción: http://codex.wordpress.org / Plugin_API / Action_Reference También aquí ves, cómo wP inlcude con este gancho: http: // adambrown.info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php I utiliza muy a menudo y no es tan duro y temprano, mejor como una nueva clase dura ();

Plugins licencia bajo una licencia compatible con la GPL

Plug-ins y temas debe se publica bajo una licencia compatible con WordPress. Esto les permite ser redistribuidos con WordPress como un "programa". Una licencia recomendada es la GPL . Tenga cuidado de que todas las bibliotecas de código incluidos con el plug-in son compatibles con la misma licencia.

( sido un problema y grave point de debate tanto en el pasado y presente .)

Su descripción extensión debería precisión detalle las funciones de su plugin. Hay 10 plugins de correos destacados. Todos ellos mostrar mensajes destacados, pero muchos de ellos tienen características diferentes. Debe ser fácil para comparar su plugin para plugins similares mediante la lectura de la descripción.

Debe evitar presumiendo de lo sencillo de su plugin es menos que lo que realmente es muy básico. Debe incluir enlaces útiles en la descripción como el enlace a la configuración.

Minimizar Los efectos secundarios de fuentes de datos remotas y servicios web

Un plugin debe Caché / Escudo de servicio web y / o XMLRPC / SOAP peticiones a través de una capa de almacenamiento en caché de datos / proveedor si se utilizan así que para no hacer front-solicitudes en espera de (lenta) de respuesta de servicio web.

Esto incluye la descarga de RSS y otras páginas. Diseño de sus plugins que solicitan los datos en segundo plano.

Una posible STEP es (Take anuncio a ping.fm como ejemplo): Crear una tabla de tampones, digamos: ping_fm_buffer_post ( fecha, hora, mensaje, submitted_time, estado )

  1. Por cada vez que desea enviar la actualización a ping.fm, añadirlo a esta tabla.
  2. Ahora, tenemos que crear un plugin para manejar estos datos. Este plugin se ejecutará a través de crontab para comprobar cada actualización que no está sometido todavía
  3. Debido a que tenemos esta tabla, también podemos enumerar cada mensaje enviado a ping.fm y comprobar el estado de cada puesto. Sólo en caso de que haya un problema en el lado del ping.fm, podemos volver a enviarlo.

Prueba de su plug-in

definitivamente debe tener algunas herramientas de prueba en nuestro entorno de desarrollo de plug-in.

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

  • Su Unidad de Pruebas debe probar la cantidad más pequeña de comportamiento que una clase puede realizar.
  • Al llegar hasta el nivel de las pruebas funcionales es aquí donde se puede probar el código con las dependencias de Wordpress.
  • En función de lo que su plugin no - considere el uso de pruebas basadas en selenio que ponen a prueba la presencia de datos en el DOM mediante el uso de identificadores
Licenciado bajo: CC-BY-SA con atribución
scroll top