Motor suplementario
Tabla de contenidos
SearchWP permite la configuración de cualquier número de Motores, cada uno con su propia configuración individual. Esta segmentación facilita múltiples implementaciones personalizadas de búsqueda en todo su sitio.
La única limitación del Motor Predeterminado es que sus Fuentes deben basarse en objetos WP_Post. Esto se debe a que el núcleo de WordPress asume que los resultados de búsqueda encajan dentro de The Loop y The Loop está compuesto por WP_Posts. Los objetos WP_Post se utilizan para Entradas, Páginas, Medios y Tipos de Entrada Personalizados. ¡Eso cubre mucho!
Sin embargo, SearchWP también facilita la búsqueda de Fuentes personalizadas. Para aprovechar al máximo eso, necesitará configurar e implementar un Motor Adicional.
Configuración
La configuración de un Motor Adicional sigue el mismo proceso que el Motor Predeterminado, pero en este caso todas las Fuentes están disponibles para usted, no solo aquellas basadas en WP_Post.
Cree un nuevo Motor Adicional haciendo clic en el botón Añadir Nuevo en la pestaña Motores de la pantalla de configuración de SearchWP.
Una vez que se haya añadido el nuevo Motor, puede personalizar las Fuentes, Atributos y Reglas a su gusto.
Después de haber guardado su(s) Motor(es), SearchWP evaluará si el Índice necesita ser reconstruido y proporcionará un aviso si es así.
El último paso de configuración será anotar el nombre del Motor, que es diferente de la etiqueta. El nombre se encuentra junto a la etiqueta del Motor en una fuente monoespaciada. El nombre es cómo se hace referencia al Motor en el código más adelante.
Formulario
Configurar un formulario de búsqueda para su Motor Adicional implica crear un <input> con un nombre diferente a s, ya que ese nombre activará una búsqueda nativa de WordPress.
Algo como esto funcionará para empezar:
| <form role="search" method="get" class="search-form" | |
| action="<?php echo site_url( 'search-results/' ); ?>"> | |
| <label> | |
| <span class="screen-reader-text"> | |
| <?php echo _x( 'Search for:', 'label' ) ?> | |
| </span> | |
| <input type="search" class="search-field" | |
| name="searchwp" | |
| placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>" | |
| value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>" | |
| title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" /> | |
| </label> | |
| <input type="submit" class="search-submit" | |
| value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" /> | |
| </form> |
Hay dos cosas a tener en cuenta sobre este fragmento:
- El
nombredel<input>utilizado essearchwp - La
accióndelformularioapunta asite_url( 'search-results/' ). Eso significa que si la URL de su sitio esexample.com, este formulario redirigirá aexample.com/search-results/al enviarlo. Esta guía asume que la URL apunta a una Página que ha creado con el propósito de mostrar los resultados del Motor Adicional.
¡Eso es todo! Ese formulario de inicio se alinea estrechamente con la salida predeterminada de get_search_form() de WordPress, que probablemente sea compatible con su tema. Si no lo es, se puede estilizar como cualquier otro formulario en su sitio.
Resultados
Cuando cree su formulario de búsqueda, tendrá una acción que apunta a una URL designada como la Página para mostrar sus resultados. Para incorporar resultados de SearchWP, primero crearemos una Plantilla de Página personalizada.
Aquí hay una plantilla de inicio con la que podemos trabajar:
| <?php | |
| /* Template Name: SearchWP Results */ | |
| global $post; | |
| // Retrieve applicable query parameters. | |
| $search_query = isset( $_GET['searchwp'] ) ? sanitize_text_field( $_GET['searchwp'] ) : null; | |
| $search_page = isset( $_GET['swppg'] ) ? absint( $_GET['swppg'] ) : 1; | |
| // Perform the search. | |
| $search_results = []; | |
| $search_pagination = ''; | |
| if ( ! empty( $search_query ) && class_exists( '\\SearchWP\\Query' ) ) { | |
| $searchwp_query = new \SearchWP\Query( $search_query, [ | |
| 'engine' => 'supplemental', // The Engine name. | |
| 'fields' => 'all', // Load proper native objects of each result. | |
| 'page' => $search_page, | |
| ] ); | |
| $search_results = $searchwp_query->get_results(); | |
| $search_pagination = paginate_links( array( | |
| 'format' => '?swppg=%#%', | |
| 'current' => $search_page, | |
| 'total' => $searchwp_query->max_num_pages, | |
| ) ); | |
| } | |
| get_header(); ?> | |
| <div id="primary" class="content-area"> | |
| <main id="main" class="site-main" role="main"> | |
| <header class="page-header"> | |
| <h1 class="page-title"> | |
| <?php if ( ! empty( $search_query ) ) : ?> | |
| <?php printf( __( 'Search Results for: %s' ), esc_html( $search_query ) ); ?> | |
| <?php else : ?> | |
| SearchWP Supplemental Search | |
| <?php endif; ?> | |
| </h1> | |
| <!-- BEGIN Supplemental Engine Search form --> | |
| <form role="search" method="get" class="search-form" | |
| action="<?php echo site_url( 'search-results/' ); ?>"> | |
| <label> | |
| <span class="screen-reader-text"> | |
| <?php echo _x( 'Search for:', 'label' ) ?> | |
| </span> | |
| <input type="search" class="search-field" | |
| name="searchwp" | |
| placeholder="<?php echo esc_attr_x( 'Search...', 'placeholder' ) ?>" | |
| value="<?php echo isset( $_GET['searchwp'] ) ? esc_attr( $_GET['searchwp'] ) : '' ?>" | |
| title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" /> | |
| </label> | |
| <input type="submit" class="search-submit" | |
| value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" /> | |
| </form> | |
| <!-- END Supplemental Engine Search form --> | |
| </header> | |
| <?php if ( ! empty( $search_query ) && ! empty( $search_results ) ) : ?> | |
| <?php foreach ( $search_results as $search_result ) : ?> | |
| <article class="page hentry search-result"> | |
| <?php | |
| switch( get_class( $search_result ) ) { | |
| case 'WP_Post': | |
| $post = $search_result; | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a> | |
| </h2></header> | |
| <div class="entry-summary"><?php the_excerpt(); ?></div> | |
| <?php | |
| wp_reset_postdata(); | |
| break; | |
| case 'WP_User': | |
| ?> | |
| <header class="entry-header"><h2 class="entry-title"> | |
| <a href="<?php echo get_author_posts_url( $search_result->data->ID ); ?>"> | |
| <?php echo esc_html( $search_result->data->display_name ); ?> | |
| </a> | |
| </h2></header> | |
| <div class="entry-summary"> | |
| <?php echo wp_kses_post( get_the_author_meta( 'description', | |
| $search_result->data->ID ) ); ?> | |
| </div> | |
| <?php | |
| break; | |
| case 'WP_Term': | |
| ?> | |
| <header class="entry-header"> | |
| <h2 class="entry-title"> | |
| <a href="<?php echo get_term_link( $search_result->term_id, $search_result->taxonomy ); ?>"> | |
| <?php echo esc_html( $search_result->name ); ?> | |
| </a> | |
| </h2> | |
| <div class="entry-summary"> | |
| <?php echo esc_html( $search_result->description ); ?> | |
| </div> | |
| </header> | |
| <?php | |
| break; | |
| } | |
| ?> | |
| </article> | |
| <?php endforeach; ?> | |
| <?php if ( $searchwp_query->max_num_pages > 1 ) : ?> | |
| <div class="navigation pagination" role="navigation"> | |
| <h2 class="screen-reader-text">Results navigation</h2> | |
| <div class="nav-links"><?php echo wp_kses_post( $search_pagination ); ?></div> | |
| </div> | |
| <?php endif; ?> | |
| <?php elseif ( ! empty( $search_query ) ) : ?> | |
| <p>No results found, please search again.</p> | |
| <?php endif; ?> | |
| </main> <!-- .site-main --> | |
| </div> <!-- .content-area --> | |
| <?php get_footer(); ?> |
Vamos a desglosar esta plantilla de inicio en cuatro secciones:
- Ejecución de la búsqueda
- Salida del formulario de búsqueda (de nuevo)
- Visualización de resultados
- Visualización de paginación
Las líneas 7-28 son responsables de recuperar la consulta de búsqueda, ejecutar la búsqueda y poblar nuestra matriz de resultados.
Las líneas 44-60 generan el formulario de búsqueda que hicimos arriba
Las líneas 64-94 son responsables de la salida de nuestros resultados de búsqueda.
Observe que en la línea 15 instruimos a \SearchWP\Query para que recuperara 'all', lo que garantiza que los resultados se devuelvan como su tipo de objeto original (por ejemplo, WP_Post) según lo configurado en el \SearchWP\Source.
Nota: Por defecto, \SearchWP\Query devolverá un objeto que contiene el id, source, site y relevance de cada resultado. Establecer el argumento fields en 'all' indica a \SearchWP\Query que reemplace ese resultado con un objeto nativo de la propia Fuente. Alternativamente, establecer el argumento fields en 'entries' devolverá una matriz de objetos \SearchWP\Entry.
Eso significa que las Entradas, Páginas, Tipos de Entrada Personalizados y Medios volverán como sus objetos WP_Post originales. Los Usuarios volverán como objetos WP_User. Cualquier Fuente adicional devolverá su objeto nativo también.
A diferencia de trabajar con The Loop, al trabajar con un Motor Suplementario necesitamos determinar qué tipo de resultado tenemos antes de generar cualquier dato.
En este ejemplo usamos un switch que funciona muy bien, porque este Motor de demostración incluye solo Entradas, Páginas y Usuarios como Fuentes.
Nota: Si en su lugar solo desea la cantidad mínima de datos devueltos con los resultados de la búsqueda, puede omitir el argumento fields por completo. Luego necesitará usar las propiedades del objeto del resultado para recuperar los datos necesarios para mostrar sus resultados.


