Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. WordPress

Crear un sencillo CRM en WordPress: Extender la búsqueda de WordPress

by
Read Time:6 minsLanguages:
This post is part of a series called Create a Simple CRM in WordPress.
Create a Simple CRM in WordPress: Adding Columns to WP_List_Table
Create a Simple CRM in WordPress: Restricting / Hiding Menu Items

Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)

Hemos estado viendo cómo crear un sencillo sistema CRM en WordPress. En la última parte de esta serie, añadimos código a nuestro plugin que nos permitió mostrar nuestros campos personalizados avanzados en la tabla List de WordPress (WP_List_Table), y ordenar nuestros datos alfabéticamente en base a esos nuevos campos.

Hoy explicaremos cómo ampliar la funcionalidad de búsqueda para incluir los datos almacenados en nuestros campos personalizados.

Funcionalidad de búsqueda

Cada tipo de entrada que tiene una interfaz de administración que viene con un campo de búsqueda:

WordPress Search BoxWordPress Search BoxWordPress Search Box

De forma predeterminada, cuando un usuario busca entrada(s) en la interfaz de Administración de WordPress, WordPress buscará en la tabla wp_posts para encontrar cualquier coincidencia parcial de contenido en los siguientes campos:

  • Título
  • Contenido
  • Extracto

Si intentamos buscar parte de un número de teléfono, veremos que no aparecen resultados:

Searching our Advanced Custom Fields Data doesnt work Searching our Advanced Custom Fields Data doesnt work Searching our Advanced Custom Fields Data doesnt work

Para nuestro tipo de entrada personalizada Contact, ¡esto no es muy útil en el caso de que queramos encontrar un contacto por número de teléfono o dirección de correo electrónico!

Advanced Custom Fields almacena sus datos en la tabla wp_postmeta, en la cual WordPress no busca de forma predeterminada. Tenemos que usar dos de los filtros proporcionados por WordPress para permitir que la funcionalidad de búsqueda de WordPress busque también datos de Advanced Custom Fields. Estos filtros harán lo siguiente:

  1. realizarán un SQL JOIN entre la tabla Post Meta de WordPress y la tabla Posts de WordPress
  2. anexarán una cláusula WHERE de SQL a la consulta Post de WordPress para buscar en nuestra tabla Posts Meta de WordPress

Realizar un JOIN de SQL

Comencemos añadiendo el filtro posts_join a la construcción de la clase de nuestro plugin para unirla a WordPress:

También necesitamos definir nuestra función search_meta_data_join(), que le indica a WordPress qué tabla queremos unir a la tabla principal Posts de WordPress:

get_query_var() es una función que devuelve la variable de consulta adecuada almacenada en la clase WP_Query. WP_Query es una clase de WordPress que proporciona lo siguiente:

... información que define la solicitud actual... con qué tipo de consulta está tratando (posiblemente un archivo de categoría, archivo de fecha, feed o búsqueda) y recupera las entradas solicitadas. Conserva una gran cantidad de información sobre la solicitud, que se puede extraer en una fecha posterior.

get_query_var() es la magia que nos permite 'tirar' de esa información. En este caso, comprobamos la variable de consulta 's', diciéndonos qué término de búsqueda (si existe) ha solicitado el usuario. También utilizamos esta misma función para comprobar qué tipo(s) de entradas está solicitando el usuario, solo queremos ampliar nuestra búsqueda si el usuario está mirando el tipo de entrada personalizada Contact.

Si se cumplen estas condiciones, unimos la tabla wp_postmeta a la tabla principal wp_posts.

$wpdb también se utiliza aquí, y es una clase definida que:

... contiene un conjunto de funciones utilizadas para interactuar con una base de datos. Su propósito principal es proporcionar una interfaz con la base de datos de WordPress, pero se puede utilizar para comunicarse con cualquier otra base de datos apropiada.

En resumen, $wpdb nos permite acceder a la base de datos MySQL, obtener ajustes de configuración y realizar consultas SQL.

En este caso, utilizamos $wpdb para obtener los nombres de las tablas Post y Post Meta, ya que estas pueden haber sido modificadas en cada instalación de WordPress. Por ejemplo, una instalación podría establecer su prefijo de nombre de tabla en wp_ (que es el valor predeterminado), mientras que otra instalación podría establecerlo en my_awesome_site_. No podemos codificar nombres de tabla, ya que no podemos garantizar que siempre vayan a ser wp_posts y wp_postmeta, de modo que usamos $wpdb->posts y $wpdb->postmeta, que contienen los actuales nombres de tabla específicos de esa instalación de WordPress.

Anexar a la cláusula WHERE de SQL

Con nuestro SQL JOIN completado, ahora tenemos que decirle a WordPress que busque en la tabla Post Meta conectada.

Vuelve a __construct() del plugin y añade una nueva función al filtro posts_where:

También necesitamos definir nuestra función search_meta_data_where(), que le indica a WordPress que busque nuestros datos Post Meta:

De la misma manera que lo hicimos en search_meta_data_join(), comprobamos nuevamente que la consulta de WordPress es una búsqueda en el tipo de entrada personalizada Contacts. Si no es así, devolvemos la cláusula $while sin modificaciones.

Si necesitamos modificar la cláusula $while, lo hacemos mediante:

  • la obtención del inicio de la cláusula WHERE: ' AND(('
  • la obtención del resto de la cláusula WHERE
  • inyectando nuestra cláusula WHERE para buscar en la columna meta_value de la tabla Post Meta para cualquier instancia de nuestro término de búsqueda
  • añadir una condición OR al final de nuestra cláusula WHERE, añadiendo a ella el resto de la consulta
  • agrupar los resultados en base al ID de registro

Necesitamos agrupar los resultados porque normalmente habrá más de una entrada en la tabla Post Meta para un ID de entrada determinado. Debido a que creamos un JOIN entre las entradas y sus Post Meta, si no agrupamos los resultados, obtendríamos el mismo Post repitiéndose en nuestra tabla.

Para comprobar que nuestras cláusulas JOIN y WHERE han funcionado, vuelve a cargar tu tabla de contactos e intenta buscar uno de tus contactos usando parte de su número de teléfono:

We can now search our Advanced Custom FieldsWe can now search our Advanced Custom FieldsWe can now search our Advanced Custom Fields

Si funciona, ¡felicidades! Ahora puedes buscar por cualquier campo personalizado avanzado que especifiques en tu sistema CRM.

Qué viene a continuación...

En el siguiente artículo, vamos a restringir y ocultar la funcionalidad de Administración de WordPress y los elementos de menú que no necesitamos para nuestro CRM.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.