Dos formas de desarrollar complementos de WordPress programación funcional

Esta segunda parte de una serie analiza dos estilos de programación diferentes (a veces llamados paradigmas de programación) que puede utilizar al escribir complementos de WordPress. En la primera parte, Tom McFarlin cubrió la programación orientada a objetos. En esta parte vamos a ver la programación funcional..

Debido a que el nivel de experiencia de los lectores varía, vamos a hablar sobre la programación a un alto nivel, por lo que si eres un principiante, no deberías tener ningún problema para seguir adelante. Sin embargo, si usted es un desarrollador más experimentado, puede encontrar más información útil más adelante en el artículo..


¿Qué es la programación funcional??

La programación funcional es probablemente el estilo con el que está más familiarizado, y casi universalmente, es el estilo utilizado en los diversos sitios web de fragmentos de código de WordPress que flotan en Internet. Por esta razón, a veces se puede ver como programación de "nivel de entrada": el estilo empleado por los principiantes hasta que aprenden a dominar la programación orientada a objetos. Esto es increíblemente engañoso, ya que si bien la programación funcional es mucho más simple, no es inferior en sí misma..

La programación funcional enfatiza la evaluación de funciones, y evita la noción de estados u objetos en lugar de la programación orientada a objetos, que alienta a pensar en el código como actuar sobre objetos, usar métodos para cambiar esos objetos o interactuar con ellos. Veamos un ejemplo muy simple que compara los dos estilos:

 // Función funcional del método add_two ($ n) return $ n +2;  $ a = 2; $ b = add_two ($ a); // $ b = 4; // Número de clase de método orientado a objetos var $ valor = 0; función __construir ($ a) $ esto-> valor = $ a;  función add_two () $ this-> value = $ this-> value +2;  $ a = nuevo número (2); echo $ a-> valor; // Imprime 2 $ a-> add_two (); echo $ a-> valor; // Impresiones 4

Este sencillo ejemplo ilustra la diferencia fundamental en el estilo de los dos paradigmas: la programación funcional se centra en pasar argumentos y recibir valores de las funciones. No hay "objetos" sobre los que se esté actuando, solo parámetros y valores de retorno. A la inversa, el enfoque orientado a objetos asigna a un objeto varias propiedades (en nuestro caso, un "valor") y los métodos actúan sobre esas propiedades.


Funciones: Los fundamentos.

Definir funciones es muy simple:

 función agregar ($ número, $ número2 = 1) // Ejecutar código que actúa sobre las variables aprobadas $ suma = $ número + $ número2; // Opcional, si es necesario, puede devolver un valor de retorno $ sum; 

Una vez que se declara la función, se puede utilizar en cualquier parte de su complemento, en otras palabras, tiene un alcance global.

 $ a = 4; $ b = 7; añadir eco ($ a, $ b); // Impresiones 11
Las funciones deben tener nombres únicos. Volver a declarar una función producirá un error. Dado que su código se ejecutará junto con otros complementos, temas y el propio WordPress, nunca debe usar nombres genéricos. En su lugar, debe prefijar los nombres de sus funciones con algo único (como el nombre de su complemento).

Usted puede haber notado que en la definición de añadir, el segundo argumento es igual a 1. Esto establece un valor predeterminado para $ numero2 (en este caso, 1), y al hacerlo, hace que el argumento sea opcional. Si el argumento no se proporciona, el valor se toma como el valor predeterminado:

 añadir eco (4); // Imprime 5 echo add (4, 1); // Impresiones 5

Por otro lado, no se proporciona un valor predeterminado para el primer valor, por lo que omitir ese argumento generará un error

 echo add (); // lanza un error ya que $ numero no esta definido

También puede tener un número variable de argumentos. Dentro de la función podemos usar func_num_args () para obtener el número de argumentos recibidos, mientras que func_get_arg () le permite acceder a una determinada variable pasada, indexada desde 0.

 function sum () // Obtenga el número de argumentos dados para sum () $ number_args = func_num_args (); $ suma = 0; if (! $ number_args) devuelve $ sum; para ($ i = 0; $ i < $number_args; $i++ )  $sum += func_get_arg( $i );  return $sum;  echo sum( 1, 2, 3, 4 ); //Prints 10 echo sum( 1, 2 ); //Prints 3 echo sum(); //Prints 0

Lo anterior puede ser usado en métodos de objeto también. Finalmente, al declarar una variable como 'global' puede acceder a la variable desde dentro de una función.

 $ a = 'Hola'; $ b = 'Mundo'; function hello_world () // Esto es necesario para acceder a $ a y $ b // declarados fuera del alcance de la función. global $ a, $ b; $ b = $ a. ". $ b; hello_world (); echo $ b; // Imprime 'Hola mundo'
Generalmente se desaconseja el uso de las globales. En particular, ya que dos complementos que usan el mismo nombre para una variable global pueden causar que uno o ambos complementos se rompan. Si debe usar una variable global, asegúrese de que sea única prefijando con el nombre de su complemento.

¿Por qué usar la programación funcional??

Decidir qué estilo de programación usar se reduce a juicio, y sí, a las preferencias personales. No es más correcto o incorrecto utilizar la programación funcional sobre la orientada a objetos, pero la mayoría de las veces hay un estilo que se adapta mejor a lo que está tratando de lograr.

A veces, la programación orientada a objetos simplemente no es necesaria, y solo complica las cosas o introduce un código superfluo. Un ejemplo podría ser las diversas funciones de 'utilidad' que proporciona WordPress. Estas son funciones genéricas que sirven para realizar un propósito particular. Por ejemplo wp_trim_words ($ texto, $ num_words) simplemente recorta la cadena dada a un tamaño determinado (en palabras). No añadiría nada para definir. wp_trim_words () en cambio, como un método que pertenece a algún objeto, y resultaría en un código más feo. Con programación funcional lleva una línea..

Una de las ventajas de la programación funcional, especialmente para los principiantes, es su simplicidad. No tiene que preocuparse por las funciones estáticas, privadas o protegidas, todas son globales. Tampoco existe la noción de variables estáticas. En el nivel muy básico, su función devuelve una salida derivada de lo que le ha dado. Por ejemplo, obtener el título (7) Volverá el título de la publicación con ID 7..

Otra ventaja de la programación funcional es que las funciones son accesibles globalmente. Con los programas orientados a objetos, para poder actuar sobre un objeto específico, necesita pasar alrededor de ese objeto. Esto a veces puede ser complicado. Para ilustrar esto, tomemos un ejemplo de la primera parte:

 clase DemoPlugin función pública __construct () add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts'));  public function register_plugin_scripts () // Registrar los scripts del complemento $ demo_plugin = new DemoPlugin ();

Cuando WordPress almacena el register_plugin_scripts () método para que pueda ser llamado cuando el wp_enqueue_scripts la acción se activa; lo hace haciendo referencia no solo al método, sino también al objeto $ demo_plugin. Esto se debe a que el mismo método para diferentes instancias de un objeto se considera diferente métodos - eso es, $ demo_plugin-> register_plugin_scripts () y $ copy_of_demo_plugin-> register_plugin_scripts () no son lo mismo. Esto puede parecer extraño, pero los métodos pueden comportarse de manera diferente para diferentes instancias de la misma clase, por lo que necesitamos hacer referencia tanto al método como a la instancia.

Pero ¿por qué esto importa? Esto hace que sea muy difícil para un plug-in o tema de terceros desconectar ese método, ya que para hacerlo necesitarían llamar:

 remove_action ('wp_enqueue_scripts', array ($ demo_plugin, 'register_plugin_scripts'));

Pero en general no tendrán acceso a la $ demo_plugin variable. (Nota: si el método se declara estático, entonces puedes solucionarlo).


Programación orientada a objetos y funcional en WordPress

Por supuesto, la programación orientada a objetos tiene sus ventajas, como se explica en la primera parte. Como Tom también mencionó, es inevitable cuando se utiliza la API de widget de WordPress. Otro ejemplo común es WP_Query (). Aquí, un enfoque orientado a objetos es claramente el mejor: tiene un objeto (en este caso una consulta), que tiene varias propiedades (es decir, criterios de búsqueda, información de paginación, resultados coincidentes) y desea actuar en esa consulta (analizarla, generarla). y desinfectar el SQL correspondiente, y devolver los resultados).

WP_Query () demuestra cuán poderosa puede ser la programación orientada a objetos cuando se usa correctamente. Después de iniciar la consulta:

 $ the_query = new WP_Query (array (…));

No solo puede acceder a los resultados, sino también a otra información como, por ejemplo, los valores de paginación: cuántas páginas de resultados hay, qué página se está viendo, el número total de resultados y el 'tipo' de consulta, p. Ej.. $ the_query-> is_search (), $ the_query-> is_single () También hay toda la infraestructura de 'bucle';

 if ($ the_query-> have_posts ()) echo '
    '; while ($ the_query-> have_posts ()): $ the_query-> the_post (); // The Loop echo '
  • '. get_the_title ($ the_post-> ID). '
  • '; al final eco '
'; wp_reset_postdata ();

Lo que esconde todos los malabarismos internos de resultados y globales detrás de una API amigable para los humanos.

Entonces, ¿qué pasa con get_posts ()? Esto solo sirve como un envoltorio para WP_Query (), y simplemente devuelve una matriz de publicaciones que coinciden con la consulta. Como tal, no recibes las "campanas y silbidos" de WP_Query (), Pero es un poco más eficiente. Así que si deberías usar get_posts () o WP_Query () depende de su caso de uso (por ejemplo, si requiere paginación o no), pero también depende de las preferencias personales.

 $ results = get_posts (array (…)); si ($ resultados) echo '
    '; foreach ($ resultados como $ the_post) echo '
  • '. get_the_title ($ the_post-> ID). '
  • '; eco '
';

Resumen

Esperemos que estos dos artículos hayan ayudado a resaltar las ventajas y desventajas de estos estilos de programación. El punto final es que aquí no hay correcto ni incorrecto, y cada programador tendrá sus propias preferencias personales. Pero algunos contextos se prestan más fácilmente a un cierto estilo de programación, y como tal, debe esperar que su complemento contenga una mezcla de ambos.