Crear un CRM simple en WordPress Extender la búsqueda de WordPress

Hemos estado viendo cómo crear un sistema de CRM simple en WordPress. En la última parte de esta serie, agregamos código a nuestro complemento que nos permitió mostrar nuestros Campos personalizados avanzados en la Tabla de listas de WordPress (WP_List_Table), y ordenar nuestros datos alfabéticamente por esos nuevos campos.

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

Funcionalidad de búsqueda

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

De forma predeterminada, cuando un usuario busca Publicaciones en la interfaz de administración de WordPress, WordPress buscará wp_posts tabla para encontrar coincidencias de contenido parcial en los siguientes campos:

  • Título
  • Contenido
  • Extracto

Si intentamos buscar un número de teléfono parcial, veremos que no aparece ningún resultado:

Para nuestro tipo de mensaje personalizado de contacto, esto no es muy útil si queremos encontrar un contacto por número de teléfono o dirección de correo electrónico!

Advanced Custom Fields almacena sus datos en el wp_postmeta Tabla, que WordPress no busca por defecto. Necesitamos usar dos de los proporcionados de WordPress. filtros para permitir que la funcionalidad de búsqueda de WordPress también busque datos de Campos personalizados avanzados. Estos filtros:

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

Realizando un SQL JOIN

Comencemos agregando el posts_join filtre a la construcción de nuestra clase de complemento para unirse a WordPress:

/ ** * Constructor. Se llama cuando el complemento se inicializa * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', array (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array (& $ this, 'define_sortable_table_columns')); if (is_admin ()) add_filter ('request', array (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', array (& $ this, 'search_meta_data_join'));  

También necesitamos definir nuestros search_meta_data_join () función, que le dice a WordPress qué tabla queremos unir a la tabla principal de Publicaciones de WordPress:

/ ** * Agrega una combinación a la tabla meta de WordPress para búsquedas de clave de licencia en la Administración de WordPress * * @param string $ join instrucción SQL JOIN * @return string declaración SQL JOIN * / function search_meta_data_join ($ join) global $ wpdb; // Únase a la tabla de metadatos posteriores si estamos realizando una búsqueda si (vacío (get_query_var ('s'))) return $ join;  // Únase a la tabla de metadatos de la publicación si estamos en el Tipo de publicación personalizada de los contactos if ('contact'! = Get_query_var ('post_type')) return $ join;  // Únase a la tabla meta de la tabla $ join. = "IZQUIERDA ÚNICA $ wpdb-> postmeta ON $ wpdb-> posts.ID = $ wpdb-> postmeta.post_id"; devuelve $ join;  

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

... información que define la solicitud actual ... con qué tipo de consulta está tratando (posiblemente un archivo de categoría, archivo con fecha, fuente o búsqueda), y recupera las publicaciones 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' esa información. En este caso, comprobamos la variable de consulta. 's', indicándonos qué término de búsqueda (si corresponde) ha solicitado el usuario. También utilizamos esta misma función para verificar qué tipo de publicaciones solicita el usuario; solo queremos ampliar nuestra búsqueda si el usuario está mirando el tipo de publicación personalizada de contacto..

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

$ wpdb También se usa 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 puede usarse para comunicarse con cualquier otra base de datos apropiada.

En breve, $ 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 ser modificadas por cada instalación de WordPress. Por ejemplo, una instalación puede establecer su prefijo de nombre de tabla en wp_ (que es el valor predeterminado), mientras que otra instalación puede establecerlo en my_awesome_site_. No podemos codificar los nombres de las tablas, ya que no podemos garantizar que siempre serán wp_posts y wp_postmeta, entonces usamos $ wpdb-> mensajes y $ wpdb-> postmeta, que contienen los nombres de tablas reales específicos para esa instalación de WordPress.

Anexando a la cláusula WHERE de SQL

Con nuestro SQL JOIN completo, ahora necesitamos decirle a WordPress que busque la tabla Post Meta unida.

Volver al plugin __construir(), y añadir una nueva función a la posts_where filtrar:

/ ** * Constructor. Se llama cuando el complemento se inicializa * / function __construct () add_action ('init', array (& $ this, 'register_custom_post_type')); add_action ('plugins_loaded', array (& $ this, 'acf_fields')); add_filter ('manage_edit-contact_columns', array (& $ this, 'add_table_columns')); add_action ('manage_contact_posts_custom_column', array (& $ this, 'output_table_columns_data'), 10, 2); add_filter ('manage_edit-contact_sortable_columns', array (& $ this, 'define_sortable_table_columns')); if (is_admin ()) add_filter ('request', array (& $ this, 'orderby_sortable_table_columns')); add_filter ('posts_join', array (& $ this, 'search_meta_data_join')); add_filter ('posts_where', array (& $ this, 'search_meta_data_where'));  

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

/ ** * Agrega una cláusula where a la tabla meta de WordPress para búsquedas de clave de licencia en la Administración de WordPress * * @param string $ where Cláusulas WHERE de SQL * @return string Cláusulas WHERE de SQL * / function search_meta_data_where ($ where)  $ wpdb global; // Únase a la tabla de metadatos posteriores si estamos realizando una búsqueda si (vacío (get_query_var ('s'))) return $ where;  // Únase a la tabla de metadatos de la publicación si estamos en el Tipo de publicación personalizada de los contactos if ('contact'! = Get_query_var ('post_type')) return $ where;  // Obtenga el inicio de la consulta, que es 'AND (('), y el resto de la consulta $ startOfQuery = substr ($ where, 0, 7); $ restOfQuery = substr ($ where, 7); // Inyecte nuestra cláusula WHERE entre el inicio de la consulta y el resto de la consulta $ where = $ startOfQuery. "(". $ Wpdb-> postmeta. ".Meta_value LIKE '%". Get_query_var (' s '). "% 'O ". $ RestOfQuery." GROUP BY ". $ Wpdb-> posts." .Id "; // Volver revisado cláusula WHERE return $ where; 

De la misma manera que hicimos en search_meta_data_join (), nuevamente verificamos que la consulta de WordPress es una búsqueda en el tipo de publicación personalizada de contactos. Si no es así, devolvemos el $ mientras cláusula sin modificación.

Si necesitamos modificar el $ mientras Cláusula, lo hacemos por:

  • obteniendo el inicio de la cláusula WHERE: 'Y (('
  • obteniendo el resto de la cláusula WHERE
  • inyectando nuestra cláusula WHERE para buscar en la tabla Post Meta meta_valor columna para cualquier instancia de nuestro término de búsqueda
  • agregando una condición OR al final de nuestra cláusula WHERE, agregándole el resto de la consulta
  • Agrupando los resultados por la ID de publicación.

Necesitamos agrupar los resultados porque normalmente habrá más de una entrada en la tabla Post Meta para una ID de publicación dada. Debido a que configuramos una UNIÓN entre las Publicaciones y su Post Meta, si no agrupáramos los resultados, obtendríamos la misma Publicación en nuestra tabla..

Para verificar que nuestras cláusulas JOIN y WHERE hayan funcionado, vuelva a cargar la tabla de contactos e intente buscar uno de sus contactos por parte de su número de teléfono:

Si funciona, felicidades! Ahora puede buscar por cualquier campo personalizado avanzado que especifique en su sistema CRM.

Hasta la próxima…

En el próximo artículo, vamos a restringir y ocultar las funciones de administración de WordPress y los elementos de menú que no necesitamos para nuestro CRM.