Attachments y taxonomías (III) juntos (12)

Seguimos con nuestra serie ‘Crear un plugin desde 0’, y dentro de ella, con la miniserie sobre las taxonomías. Si en los anteriores artículos habíamos empezado a trabajar con las taxonomías, y habíamos incluido AJAX para tal fin, ahora les incorporamos los attachments.

Para empezar, debo avisar que este artículo tiene un nivel técnico muy elevado. Pero, una vez llegados a este punto, supondrá un pequeño máster en la programación de procesos con los terms de las taxonomías.

 

Indice

Desarrollo de la idea. Incluir los attachments a nuestro plugin

Básicamente, vamos a implementar los attachments a nuestro plugin mediante el mismo mecanismo AJAX, funciones muy parecidas y trabajando en paralelo, y funciones WordPress similares.

Actualmente, el código del plugin casi alcanza las 1700 líneas. Por lo tanto, me permitiréis que no lo incluya en este artículo. Pero sí voy a explicar qué funciones he creado y para qué, y las funciones de WordPress que he empleado.

Lo que sí os animo es que probéis el plugin, ya que empieza a tomar cuerpo. No os preocupéis, ya que no modifica ningún registro del sistema, ni de los attachments, ni de los archivos del directorio ‘uploads’. Sólo modifica terms y relaciones de la taxonomía que crea a tal efecto. Y, como muestra, un botón.

Añadimos los attachments a las taxonomías
Añadimos los attachments a las taxonomías

 

Codificación

Primero voy a explicar las diferentes funciones que he creado. Después, las funciones WordPress que he utilizado.

Funciones creadas

Funciones PHP

Las funciones PHP son las que manejan el plugin desde el ‘lado servidor‘, y nos devolverán todo el código HTML, CSS y los scripts necesarios para la ejecución del plugin en el ‘lado navegador‘.

stmpujante_crear_directorios()

Para empezar, creamos la taxonomía, especificando las etiquetas y utilizando register_taxonomy. Más información en el artículo Taxonomy WordPress. Otra forma de trabajar las taxonomías.

stmpujante_funcion_crear_submenu()

Primero, creamos un submenú en la biblioteca de medios, que nos permitirá acceder a la página de nuestro plugin.

stmpujante_funcion_crear_pagina()

Finalmente, para el submenú creado anteriormente montamos la página en la que se centra nuestro plugin.

stmpujante_funcion_recursiva_carpetas()

En cuanto a las taxonomías, primero utilizamos esta función recursiva para pasar a una matriz el árbol de directorios la estructura jerárquica de aquella.

stmpujante_funcion_mostrar_carpetas()

También será recursiva la función que utilizamos para mostrar en pantalla los diferentes términos (terms) y su relación jerárquica.

stmpujante_funcion_operaciones_carpetas()

Por otro lado, esta función auxiliar simplemente nos muestra un select con sus diferentes options.

stmpujante_funcion_enqueue_scripts()

Con respecto a las llamadas AJAX, empezaremos encolando los diferentes scripts, como ya vimos en el artículo AJAX WordPress en las taxonomías.

stmpujante_funcion_modificacion_carpeta()

Finalmente, la llamada AJAX para carpeta acaba en esta función, la cual realizará las modificaciones en la base de datos en función de los parámetros que reciba, y devolverá un resultado.

stmpujante_funcion_modificacion_attachment()

En cuanto a los attachments, el mecanismo es similar. Para empezar, esta función es equivalente a la anterior, pero para los attachments.

stmpujante_funcion_mostrar_attachments()

También en los attachments disponemos de una función para su salida por pantalla. Aunque en este caso no es recursiva, al no ser éstos jerárquicos.

Esta función nos muestra los attachments vinculados a la carpeta que tiene el foco.

stmpujante_funcion_operaciones_attachments()

De la misma forma que con las carpetas, el campo select lo creamos con esta función.

stmpujante_funcion_breadcrumb()

Finalmente, por su especificidad, generamos el breadcrum ( rastro de migas de pan, o ruta simulada ) mediante este snippet.

Funciones JavaScript

Las funciones JavaScript están insertadas al final del código de generación de la página. Nos van a permitir la interactuación del usuario con nuestro plugin, pero sin realizar acciones en el ‘lado servidor‘.

Fijaos que, tanto CSS como JavaScript, van al final del código HTML de creación de la página.

stmpujanteToggleApertura()

Para empezar, esta función controla la apertura, cierre o acción nula. Según el caso de que la carpeta contenga sub-carpetas o no.

stmpujanteToggleSeleccion()

En cuanto a esta función, es la encargada de mantener una lista de todas aquellas carpetas que están seleccionadas. Se añadirán aquellas carpetas que nosotros activemos en su checkbox correspondiente, y viceversa.

stmpujanteToggleFoco()

Controla en qué carpeta tenemos el foco. Ello es necesario para las distintas operaciones, tanto sobre carpetas, como sobre attachments.

stmpujanteOperacionCarpeta()

Realiza diversos cometidos:

  • Primero, controla si la operación será individual (foco) o grupal (selección).
  • Además, incluye los comentarios necesarios para que el usuario esté informado de la operación que va a realizar.
  • Finalmente, visualiza la ventana modal de la operación seleccionada.
stmpujanteOpcionesSelect()

Simplemente, controla qué opciones del select de operaciones sobre carpetas están activos o no.

stmpujanteOcultarOperacion()

Finalmente, esta función cierra la ventana modal que esté activa al clickar sobre ‘Cancelar‘.

stmpujanteToggleSelectAttachment()

Hace lo mismo que la función stmpujanteToggleSeleccion() pero sobre los attachments.

stmpujanteOperacionAttachment()

Realiza los mismos cometidos que stmpujanteOperacionCarpeta() pero sin controlar si es individual o grupal. A fin de cuentas, todas las operaciones sobre attachments se realizan según los attachments seleccionados.

Funciones AJAX

Finalmente, las funciones jQuery AJAX nos permiten la interactuación entre el navegador y el servidor en tiempo real.

stmpujanteAjaxOperacionCarpeta()

Primeramente, esta función, ya introducida en el anterior artículo de esta serie. Envía una llamada AJAX al servidor, indicándole los parámetros necesarios para la función requerida, y saca por pantalla la respuesta recibida.

stmpujanteAjaxOperacionAttachment()

Por otra parte, esta nueva función realiza lo mismo que la anterior, pero sobre los attachments.

 

Funciones WordPress

Funciones de trabajo exclusivo con terms
get_terms

Para empezar, la función get_terms ( $args ) viene a ser el equivalente a la función get_posts(), sólo que aplicada a los términos de una taxonomía.

Básicamente, nosotros la utilizamos en la función recursiva stmpujante_funcion_recursiva_carpetas() para buscar las subcarpetas de una carpeta, de la siguiente forma:

Como resultado, nos devolverá una matriz de objetos ( los valores de sus campos se obtienen mediante $hijo_unico->campo ).

wp_insert_term

La función wp_insert_term( $term, $taxonomy, $args ) nos permite crear un nuevo término en una taxonomía, en función de los argumentos que le pasemos.

Nos devuelve una matriz con los valores de ‘term_id’ y ‘term_taxonomy_id’.

Nosotros la utilizamos para crear una nueva carpeta y para copiar una carpeta existente. En este último caso, aprovecharemos los valores devueltos por la función, para realizar una copia de los attachments en la carpeta copiada.

La matriz devuelta es asociativa, $nueva_carpeta[‘term_id’].

wp_update_term

La función wp_update_term( $term_id, $taxonomy, $args) nos permite modificar campos de un term ya existente.

Nosotros la utilizamos para editar el nombre de una carpeta o para mover una carpeta. En este último caso, lo hacemos así:

En ambos casos, no necesitamos modificar los attachments incluidos en dichas carpetas, pues el ‘id’ de éstas no cambia.

wp_delete_term

Utilizamos la función wp_delete_term( $term_id, $taxonomy, $args ) para eliminar un término (term) de una taxonomía.

En nuestro plugin será necesario conservar $term_id, para eliminarlo de los attachments.

Funciones de asignación de terms
get_posts

Primeramente, la función get_posts( $args ) ya la vimos de soslayo en el tercer artículo de esta serie ‘Attachment WordPress. La lista’.

En este artículo, utilizamos esta función, obviamente, para averiguar los attachments localizados dentro de una de nuestras carpetas.

Pero observad la forma en que lo hacemos:

En la primera parte del condicional if ( $foco == 0 ) estaremos en la pseudo-carpeta ‘uploads’. Pero ‘uploads’ no es un term de la taxonomía. Por lo tanto, para saber qué attachments están en esta ‘pseudo’ carpeta, lo que hacemos es, primero, buscar todos los attachments, para luego eliminar aquellos que están vinculados a algún term, con el operador ‘NOT IN’

Por otro lado, en la segunda parte del condicional sí tenemos term sobre el que buscar. Pero get_posts nos dará siempre los attachments que contiene dicha carpeta y sus subcarpetas. Por eso, buscamos los ‘hijos‘ de $foco mediante get_term_children y eliminaremos los attachments vinculados mediante el operador ‘NOT IN’.

get_term

La función get_term( $term_id, $taxonomy, $output, $filter ) la utilizamos únicamente como función auxiliar para conseguir el ‘slug’ necesario para otras funciones.

get_term_children

La función get_term_children( $term, $taxonomy ) también es una función auxiliar cuyo cometido en nuestro plugin ya he comentado en get_posts.

wp_add_object_terms y wp_remove_object_terms

Finalmente, dos son las funciones que vamos a utilizar en las operaciones que realizaremos con los attachments.

En primer lugar, wp_add_object_terms( $object_id, $terms, $taxonomy) nos permite añadir un término asociado al objeto indicado en $object_id.

Por otro lado, wp_remove_object_terms( $object_id, $terms, $taxonomy) nos permite hacer justo lo contrario, eliminar un término asociado a un objeto.

Por ejemplo, al eliminar un attachment de una carpeta, lo que en realidad hacemos es eliminar el término de esa carpeta del attachment. También, al mover un attachment de una carpeta a otra, eliminamos el término del origen y añadimos el de destino. Sin embargo, para copiar de una carpeta a otra, solo debemos añadir.

Dos excepciones a este funcionamiento son copiar y mover desde ‘uploads’, ya que la primera opción es imposible y en la segunda no se mueve ‘desde’, sino sólo ‘hacia’.

También recordad que si son borradas las múltiples copias de un attachments de todas las carpetas en qué se encuentre, acabará apareciendo en ‘uploads’.

 

Conclusión y próximo artículo

En resumen, podemos afirmar que con el estado actual de nuestro plugin, ya tenemos un sistema para ordenar y clasificar nuestros attachments. También podemos decir que es un sistema visual, intuitivo y fácil. Además, es un sistema seguro, ya que sólo trabajamos con una taxonomía.

Pero sería más completo si se pudiera trasladar a la biblioteca de medios de WordPress. Por ese motivo, en el próximo artículo veremos cómo añadir un campo dropdown que nos filtre los attachments según las carpetas o directorios que hemos implementado en nuestro plugin.

De hecho, ya os puedo asegurar que he encontrado el código, lo he probado y funciona. Pero de eso ya hablaremos en el próximo artículo.

 

Fichero de ejemplo

Disponéis de este plugin en mi repositorio de GitHub, así como en el grupo de facebook ‘WordPress en Español’.

 

Contributors

A pesar de que la lista de contributors del plugin sigue siendo la misma, espero que la próxima semana podamos incluir al desarrollador del código que vamos a incorporar.

miguelthepoohsergiotoca

 

Preguntas, retos y previos

El plugin lo he probado en la medida de lo posible, y lo seguiré haciendo estas próximas semanas. Sin embargo, sería de gran ayuda que, cuanta más gente lo probase y me indicara pequeños bugs y posibles mejoras, mucho mejor.

Por eso os pido que lo descarguéis y lo probéis. No tengáis miedo, ya que su uso no afectará ni a los archivos de ‘uploads’, ni a los attachments de vuestro sitio web.

 

Que paséis una buena semana.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *