¿Le gustaría agregar la funcionalidad de búsqueda avanzada sin depender de los complementos o los temas de tercer tope? Cree su propio complemento de búsqueda avanzado de WordPress, con soporte para sugerencias automáticas, tipos de publicaciones personalizadas, taxonomías, campos personalizados y almacenamiento de caché desde el principio. En este artículo, le mostraré cómo crear un complemento orientado al objeto para agregar un formulario de búsqueda avanzado basado en códigos cortos que se pueden filtrar utilizando publicaciones personalizadas (CPT), taxonomías personalizadas, así como metadatos personalizados utilizando campos avanzados (control ( ACF). El formulario de búsqueda también incluirá una sugerencia automática basada en AJAX y usará transitorios de WordPress para almacenar los resultados en el caché.
Si bien los complementos gratuitos son una forma popular de agregar una mayor funcionalidad, a menudo se les ocurre sus propios problemas. Y hay tantos factores a considerar cuando obtienes esa combinación correcta. A veces, el desarrollo del propio complemento para áreas que requieren un enfoque mejor regulado puede resultar mucho más beneficioso en el esquema más amplio de las cosas. También le permitirá un mayor control sobre el grado de uso, rendimiento y seguridad de las aplicaciones. Nota: Este artículo está destinado a desarrolladores de WordPress intermedios y avanzados. Se supone que debe tener conocimiento práctico sobre PHP, JavaScript, WordPress Loop, Transients y WordPress Plugin API. Si desea una actualización, le recomiendo leer lo siguiente:
Creación de contenido personalizado en WordPress: taxonomías y campos
Desarrollo de WordPress para usuarios intermedios: creación de complementos
Desarrollo Desarrollo Avanzado WordPress: Trabajar con WordPress avanzado: Introducción a la programación orientada a los objetos
Para este artículo, hemos preparado un complemento personalizado de WordPress que agrega un formulario de búsqueda activado para sugerencia automática a cualquier página de WordPress utilizando un código corto. También le permite ajustar los resultados de búsqueda a un solo o más tipos de publicaciones personalizadas y mostrarlas en un aspecto de cuadrícula FlexBox. Puede descargar mi complemento de búsqueda aquí para seguirlo con el artículo.
Más adelante en el artículo, extenderé el mismo complemento y agregaré funciones de búsqueda complejas, como filtrar múltiples taxonomías y costumbres para una biblioteca de videos ficticios, pero el ejemplo se puede extender fácilmente a cualquier escenario, como buscar un producto o incluso facetado. búsqueda. Los CPT y los ACF agregan potencia y funcionalidad extraordinarias y son bastante comunes en cualquier proyecto de desarrollo personalizado. Mi objetivo es ayudarlo a integrar más características avanzadas de WordPress para jugar juntas en una aplicación en el mundo real. Entonces, ¡comencemos!
Nota: Para el resto del artículo y en todo el código, el tipo de publicación del término se refiere a los tipos de publicaciones por publicaciones y páginas, así como cualquier tipo de publicaciones personalizadas. El flujo de control del complemento de búsqueda personalizado antes de hundirse en el código, aquí hay una vista de alto nivel de cómo funciona el complemento detrás de escena. El motor de búsqueda de arado comienza una vez que el usuario ingresa las palabras clave en la barra de búsqueda o cuando se envía el formulario de búsqueda. Y luego muchos dependen del estado de la transitoria. El flujo de control de complementos de búsqueda personalizado
Tenga en cuenta que no solo transmiten los títulos de publicaciones almacenados en caché a través de wp_localise_script, sino también para almacenar en los datos locales en JavaScript. Esto se debe al hecho de que la sugerencia automática puede tener un gran impacto en el rendimiento si se realiza una solicitud AJAX cada vez que se ingresa una clave de búsqueda.

Los países donde se elimina el transitorio
Para un área sensible a los recursos, como buscar aplicaciones, centré mi implementación en torno a las siguientes ideas:

Memor en caché solo lo que se necesita en el transitorio y no en todo el objeto wp_quey
Asegúrese de que, a medida que se realicen pocas llamadas de Ajax para sugerencia automática.
Asegúrese de que los transitorios no tengan información anticuada
Proporcionar configuraciones para controlar qué tipos de publicaciones se incluirán en la búsqueda
Por supuesto, una sola dimensión no se ajustará a todos y se requerirá un cierto cambio de acuerdo con la complejidad de su aplicación.
Examinemos la estructura del complemento para comprender qué está pasando a dónde. La estructura del complemento de búsqueda avanzado El complemento de búsqueda se basa en su propia plantilla de complemento, que es una bifurcación del proyecto original del complemento de WordPress. Así es como se estructura en Backend: Inc/Core/* – Funcionalidad básica del complemento
Inc/core/classinit.php-inc/Creas/class-init.php Registro para el menú de administración, cortocódico, controlador AJAX, notificaciones de administración, scripts y estilos
Inc/admin/class-admin.php-funcionality para el área de configuración del complemento en el tablero del administrador
Inc/Common/Class-Common.php-Functionality para proporcionar un controlador AJAX basado en búsqueda/class-common.php
Inc/Common/Views/* – Formulario de búsqueda y resultados de búsqueda
Inc/Common/JS/* – Handler AutoSugest
Inc/Common/CSS/* – CSS para el formulario de búsqueda
Tras la activación, el complemento agrega una página de opciones como un elemento de menú Subnivel en el menú Administración de configuración. Tipos de publicaciones personalizados registrados junto con publicaciones personalizadas por publicaciones y páginas como opciones que se incluirán en la búsqueda avanzada.
Página de configuración de complementos para seleccionar tipos de publicaciones
No entraré en detalles, pero para ver cómo he agregado la página de administración, eche un vistazo al define_admin_hooks () a Inc/Core/Class -it.php y add_pline_admin_menu () método/admin/class -admin.php. El marcado para la página de configuración se puede encontrar en Inc/Admin/Views/HTML DieadVanced-Search-Admin-Ptions.php. El lugar donde las cosas comienzan a ser interesantes es Inc/Common/Class-Common.php. El punto de entrada es por define_common_hooks () Método de Inc/Core/Class -it.php.
La idea se carga 0E584AE9450B1AB1B9B1D7D61C8B01DECI, comencemos con el código corto.

Correcto para cargar el formulario de búsqueda personalizado Registro_ShortCodes () AC/Common/Class-Common.php agrega el código corto [NDS-Advanced-Search] que se utiliza para conectar el formulario de búsqueda personalizado.
Cargue la idea 5e52011542082b940ae71b6eb0f500b8
Con respecto a la esencia anterior, notará que el contenido del código corto (es decir, el formulario de búsqueda) se devuelve mediante el código de llamada inverso_nds_advanced_search (). Podría haber hecho eso:
La idea D41849A407C0DC49C79B25034A67F4D1 está cargada.
Sin embargo, adopté un enfoque ligeramente diferente. En lugar de marcar directamente Get_Search_Form del formulario de búsqueda en la devolución de llamada de código corto, utilicé el filtro get_search_form y el get_search_form () para cargar el formulario de búsqueda.
La idea se carga 9ECD1B55FA3A31FA22379BDFE271DE10
He hecho esto para permitirle más control sobre el formulario de búsqueda. Vamos a ver cómo funciona. Get_search_form Filter Hook y get_search_form () get_search_form () La plantilla es una excelente manera de tomar el control sobre la pantalla de búsqueda de WordPress. Primero, busca ver si el tema contiene forma de búsqueda.php y carga la marca definida por él; De lo contrario, cargue el formulario de búsqueda construido en WordPress. O puede reemplazar completamente el formulario de búsqueda utilizando el gancho de filtro get_search_form, en cuyo caso get_search_form () devolverá la marca definida por get_search_form () del filtro.
Al enviar el formulario de búsqueda predeterminado, WordPress se hará cargo y reproducirá los resultados de búsqueda utilizando la plantilla Search.php, siempre que se cumplan las siguientes condiciones: el formulario de búsqueda realiza una obtención en la página de inicio del sitio.
El atributo de nombre del campo de texto de entrada se llama S
En mi ejemplo, no quiero que WordPress se encargue de la búsqueda y reemplacé el formulario predeterminado usando el gancho de filtro: add_filter (‘get_search_form’, array ($ this, ‘avanzado_search_form_markup’))))))))
El contenido de $ formulario antes del filtro get_search_form se aplica
Aquí, interrumpí la ejecución para inspeccionar la forma $ transmitida por el filtro. Contiene el formulario HTML proporcionado por SearchForm.php del tema de veinte dieciséis, que será reemplazado por el marcado de mi formulario de búsqueda en Inc/Common/Views/HTML-Dedvanced-Search.php.
La idea se carga E77C3DF9FDC9F9E9F503AFF73E3839C5
Como no respeto ninguna de las reglas anteriores con respecto a la acción de la forma o el nombre de la entrada de la entrada, WordPress no hará nada. Esto está bien, porque quiero tomar el control total sobre los resultados de búsqueda y también cargarlos en la misma página que el código corto.
Cargando el formulario de búsqueda personalizado con un código corto

El uso de un formulario personalizado con get_search_form es simplemente una decisión de diseño y puede tener otra get_search_form. Intencionalmente, mantuve el formulario de búsqueda y el que ofrece el complemento por separado. También se asegura que el formulario de búsqueda utilizado por un tema de la barra lateral, encabezado, etc. no se ve afectado por el formulario de búsqueda personalizado. Administración de la forma del formulario El formulario de búsqueda del complemento se envía a la misma página que la del código corto y, por lo tanto, la devolución de llamada del código corto también trata la presentación del formulario.
Si, por alguna razón, desea administrar los datos del formulario en otra página, eche un vistazo a mi artículo sobre la gestión de formularios que envían en WordPress. Veamos ahora cómo el complemento muestra los resultados de búsqueda. Uso de WP_Query para consultar publicaciones en los tipos de publicaciones y expresión de búsqueda Los resultados de búsqueda se recopilan utilizando un WP_Query personalizado y renderizado por Inc/Common/Views/HTML-Deadvanced-Search-Results.php. WP_QUEY Customized toma los siguientes argumentos:
‘s’ => $ search_term – donde $ seech_term es la palabra clave a buscar
‘Oración’ => verdadero: realizar una búsqueda de expresión completa

‘post_type’ => $ post_types – incluye publicaciones que pertenecen a $ post_types que contienen los tipos de publicaciones especificadas en la configuración del complemento
‘Post__in’ => $ Cached_Post_ids-‘Post__in ‘=> $ Cached_Post_ids solo después de $ Cached_Post_ids disponible en $ Cached_Post_IDS
‘NO_FOUND_ROWS’ => true – ‘no_found_rows’ => tru la ejecución de interrogación sin contar el número de líneas encontradas que el medidor de sentencia hará que las publicaciones de retorno de WP_Query en las que está presente el tiempo de búsqueda completo. Esto es como una búsqueda estricta y probablemente reducirá el conjunto de resultados. Puede funcionar o no a su favor y debe cambiarlo de acuerdo con sus requisitos de No_Found_rows es otro parámetro que funciona para mí, porque no necesito la paginación en mi bucle. También uso el parámetro Post__in para restringir aún más la búsqueda de publicaciones que pertenecen a ciertas publicaciones. Las publicaciones de las publicaciones variarán según los tipos de publicaciones seleccionadas y a medida que se creen publicaciones nuevas o antiguas.
La idea FD6A0AB49C87C07231DD15EB9325A está cargada.
Si observa el diagrama al comienzo del artículo, notará la lógica condicional para verificar las publicaciones almacenadas en caché en transición en la esencia anterior. El uso de transitorios de WordPress para almacenar publicaciones get_transient () devuelve el estado de transición. Si lo hay, devuelve la matriz que contiene las publicaciones de caché y las publicaciones para los tipos necesarios. Si el transitor expira o no existe o se elimina durante una publicación o actualización de la configuración, devolverá falso y get_posts () será invocado por el cache_posts_in_post_types ().
La idea se carga 5183A85C67FC40917F1D416686B59CE3
Es posible que deba ajustar los argumentos para get_posts () dependiendo de sus requisitos, ya que controla qué identificadores posteriores se almacenan en caché. El método CACHE_POSTS_IN_POST_TYPES () también es utilizado por el cacheo_posts_in_post_types () para almacenar las publicaciones en caché. Si no tiene la intención de usar get_posts (), puede acelerar aún más ID de get_posts () usando el parámetro de campos de retorno. La consulta personalizada es una apariencia de FlexBox
Veamos ahora la última pieza del rompecabezas, la sugerencia de búsqueda automática.
Agregar una función de sugerencia automática al formulario de búsqueda utilicé el widget de vómitos de ui jquey para proporcionar sugerencias de búsqueda porque ya está incluida en WordPress. Sin embargo, hay muchas otras bibliotecas externas que puede usar. Encue_scripts Un método A Inc/Common/Class-Common.php se encarga de cargar el script requerido.
Cargue el esencial B8172AA19D803B36A30236612CFF3DE2
Si los títulos de las publicaciones almacenados en caché están disponibles en transición, también están disponibles para JavaScript por WP_LOCALSE_CRIPT a través de la función wp_localise_script. Esto ayuda a minimizar el número de llamadas AJAX a WordPress para sugerencias de búsqueda. El siguiente código es bastante rudimentario, pero tiene como objetivo administrar la sugerencia automática.
Se carga la idea 38B541BF057403BF1C72AA3C3489995F.
Aquí hay algunos aspectos importantes del script de sugerencia automática:
JQuery.grep () para filtrar publicaciones. Puede refinar aún más coincidencia usando expresiones regulares

Las claves de búsqueda se almacenan nuevamente en caché en un objeto local para reducir las llamadas GREP, pero también puede aprovechar la API de almacenamiento web HTML para hacer que el caché persistente Ajax se realice solo cuando wp_localise_crizt transmite un valor vacío para publicaciones
Entonces, veamos cómo se gestiona la solicitud AJAX. Handler AJAX AutoSugest Action: “NDS_Advanced_Search_Autosugest” Propiedad de acción: “nds_advanced_search_autosugest” de la solicitud AJAX Especifica la WordPress WP_AJAX_ {Action} y permite administrar la solicitud AJAX en el servidor.

La idea se carga 344ACC19008825B234D40116BC1BC8A3
Get_posts () indirectamente invoque get_posts () a través de cache_posts_in_post_types () que vio anteriormente y luego envía las publicaciones de publicaciones como AJAX usando la función wp_send_json ().
Sugerencia automática para búsqueda personalizada.
Asegurar que los datos de transición no estén desactualizados es importante para eliminar la transición cuando las publicaciones pertenecientes a los tipos requeridos se crean, actualizan, etc. Delete_post_cache_for_post_type () un método class-admin.php se encarga de esto y se invoca usando el gancho de acción transition_post_status de define_common_hooks () de class-it.php.
La idea se carga 92F6B3233882349EEF6C814E662736
Además, tenga en cuenta que los transitorios caducados no se abaradren de la base de datos, porque WordPress los eliminará cada vez que se refiera a ella. ¡Eso es genial! En esta etapa, tenemos un complemento de búsqueda avanzado completamente funcional. Llevemos esto al siguiente nivel implementando una búsqueda de páginas con taxonomías personalizadas y campos personalizados avanzados. Estudio de caso: Implementación de la búsqueda de video personalizada con los filtros de búsqueda Una búsqueda más avanzada generalmente permitiría a los usuarios refinar la búsqueda utilizando filtros. Puede hacerlo fácilmente usando Post -Metadata, como términos de taxonomía y filtros de búsqueda personalizados. Esto es lo que quiero decir: búsqueda avanzada de filtros de búsqueda utilizando taxonomías personalizadas y campos personalizados avanzados
Utilizamos campos personalizados avanzados para agregar metadatos personalizados para una publicación de video personalizada. Algunos de estos aparecen como filtros de búsqueda, como se muestra arriba, y el resto se usan para mostrar los resultados de búsqueda.
Meta personalizada para la publicación de video personalizada creada con campos personalizados avanzados
También agregué algunas taxonomías personalizadas: tipos de video y ubicaciones de video al tipo de publicación personalizado. Los términos de taxonomía se utilizan como cuadros de selección en el filtro de búsqueda.
Taxonomías personalizadas para videos Tipo de publicación personalizada
Nota: Aquí, supuse que las taxonomías personalizadas y los campos personalizados están registrados para un solo tipo de publicación o se comparten entre las publicaciones requeridas. También supuse que los tipos de publicación no utilizan las taxonomías incorporadas post_tag y la categoría. El código completo para la implementación de filtros de búsqueda se puede descargar aquí para referencia. Definir la estructura de la forma de datos es una buena idea para definir la estructura de la forma HTML antes de agregar el marcado. Decidí usar una matriz asociativa para agrupar su información relacionada. Al enviar el formulario, quería que los datos del formulario estuvieran disponibles en el superglobal $ _post como se muestra a continuación: Captura de las entradas de formulario almacenadas en una matriz asociativa en la devolución de llamada de código corto

Esto es simplemente una preferencia de codificación, porque me permite capturar la entrada de formulario en menos variables que puedo pasar fácilmente, pero hace que la forma HTML sea más compleja. Por lo tanto, comencemos con la modificación del formulario de búsqueda en Inc/Common/Views/HTML Deadvanced-Search-Form.php para agregar taxonomías personalizadas como filtros de búsqueda. Creación de una lista dinámica de cuadros de selección utilizando taxonomías personalizadas para que el filtro de búsqueda se haga cargo de las taxonomías asociadas con el tipo de publicación de video, utilicé get_object_taxonomies () con el segundo parámetro establecido en objetos. Esto me dio acceso al slog, el nombre y la etiqueta de la taxonomía, que luego usé para recopilar los términos respectivos con get_terms () como se muestra a continuación:
Cargue la idea 9B2256EA5B63F9AF0519F13724B1C0
Según el número de taxonomías personalizadas y términos devueltos, el marcado HTML para los cuadros de selección se crea dinámicamente en el bucle for. El interrogatorio de mensajes utilizando taxonomía le pedirá que establezca el parámetro Tax_Query de WP_Query. Creación de una consulta de Tax_Dicamic para interrogar publicaciones utilizando Taxonomes Personalizados El parámetro Tax_Query adquiere una matriz de matriz donde cada matriz interior representa una taxonomía. Aquí, creo una Dynamic Tax_query de Tax_query basado en los términos seleccionados por el usuario. Si el usuario selecciona términos de varias taxonomías en el filtro de búsqueda, se generan varias taxonomías con el parámetro de relación establecido en “o” en la matriz exterior.
Además, Tax_Query se agrega a los argumentos WP_Query solo si el usuario selecciona un término en los cuadros de selección del filtro de búsqueda. Del mismo modo, veamos cómo se pueden usar campos personalizados como filtros de búsqueda para refinar la búsqueda más personalizada. Creación de los filtros de búsqueda utilizando metadatos personalizados creados con campos personalizados avanzados Los campos personalizados para el tipo de publicación de video que ha visto anteriormente se crearon utilizando el tipo de campo de grupo proporcionado con la versión premium de ACF. Para usar el lenguaje personalizado y los campos de duración como listas de objetivos, primero tuve que extraer sus valores únicos. Para lograr esto, utilicé la función ACF get_field_object () que devuelve una matriz única basada en el campo personalizado.

Inspeccionar el objeto de datos devuelto por la función get_field_object () ACF
Aquí sería muy útil un borde, porque identificar el campo necesario en matrices grandes puede ser aburrido. Una vez que identifiqué que la información que necesitaba está disponible en la matriz de opciones, pudimos generar el elemento de marcado HTML. La idea 42E915395DFFCEA559336555DA861F331

Los filtros de búsqueda para el rango de datos se crearon utilizando JQuey UI DatePicker. No entraré en detalles, pero puede consultar todo el código para los filtros de búsqueda aquí. Interrogar mensajes utilizando campos personalizados le pedirá que establezca el parámetro Met_query de WP_Query. Creación de una meta_query dinámica para interrogar publicaciones utilizando campos personalizados similares a Tax_query, el parámetro Meta_Query también puede tomar una matriz de matriz, donde cada matriz interior representa metadatos en forma de pares de clave/valor. Aquí, basado en el tipo de campo personalizado seleccionado por el usuario, Metri_query Matrix Metri_query.
La idea se carga 19AB4BCF48E8AA44AAABA35CC80FD0FB5

En la esencia anterior, notará que uso el operador de comparación ‘entre’ para interrogar las publicaciones de un rango de datos. Para que esto funcione, la fecha debe almacenarse en A yyyy-MM-DD y también requiere la conversión de la fecha devuelta por JQuey UI DatePicker con el mismo formato para la comparación con el trabajo. Nota: En mi ejemplo, debido a que las taxonomías y los campos personalizados no se comparten entre los tipos de publicaciones, solo las publicaciones pertenecientes al tipo de publicación de video se devolverán si se utilizan los filtros de búsqueda. Agregar los botones de filtrado a los resultados de búsqueda para mejorar el grado de uso y la experiencia de usar los formularios de búsqueda, las funciones como los botones de clasificación y filtro se usan comúnmente en las aplicaciones. Te recomiendo que eches un vistazo a un isótopo de biblioteca popular.js que hace muy bien el trabajo de clasificación y filtrado del DOM. Aquí hay un ejemplo bruto del uso de botones HTML para continuar filtrando los resultados de búsqueda que se muestran con JQuey.
Para trabajar, aproveché WordPress Loop, donde agregué los botones HTML en función de los términos de taxonomía seleccionados y también la taxonomía de cada publicación al atributo de clase de su contenedor de lista.

Lo esencial de Fe39C11fea5DA4380FA8278247069231 está cargado
El código completo para reproducir los resultados de búsqueda con botones de filtración está disponible aquí como referencia. Código de bonificación: Cargue los resultados de la búsqueda en un cuadro de luz modal Mi estudio de caso para buscar videos no se completará sin un mecanismo para cargar videos devueltos en los resultados de búsqueda. Aquí, uso una biblioteca de ColorBox de JQuey para cargar sus videos de búsqueda en un cuadro de diálogo modal. Llevar videos desde la búsqueda Resulta en un cuadro de diálogo modal con ColorBox
La URL y los créditos de video se extraen de los campos personalizados avanzados que ha visto anteriormente.
Cargue la idea 9268620a803f9868e94916025756ee91
Utilicé los atributos de fecha HTML para mostrar préstamos, pero con este enfoque, puede cargar casi cualquier cosa que desee.
Se carga la idea 7F314FB6C6BC8EF1DF1D255F8A7C041.

La conclusión cubrí muchas tierras aquí y espero que hayas encontrado este artículo útil. Siéntase libre de usar mi complemento de búsqueda y el ejemplo de estudio de ejemplo para crear su maravillosa página de búsqueda avanzada.
¿Utiliza una búsqueda personalizada en su sitio? Háganos saber en los comentarios a continuación.
Etiquetas:
Búsqueda de taxonomía personalizada
está buscando tipos de publicaciones personalizadas
Búsqueda avanzada de WordPress


Codifique su propio complemento WordPrin Advance Activado para Automatic Sugerir
Tags codificado
homefinance blog