Moteur supplémentaire
Table des matières
SearchWP permet la configuration d'un nombre quelconque de Moteurs, chacun avec sa propre configuration individuelle. Cette segmentation facilite de multiples implémentations personnalisées de la recherche sur votre site.
La seule limitation du Moteur par défaut est que ses Sources doivent être basées sur des objets WP_Post. C'est parce que le cœur de WordPress suppose que les résultats de recherche s'intègrent dans The Loop et que The Loop est composé de WP_Post. Les objets WP_Post sont utilisés pour les Articles, les Pages, les Médias et les Types d'articles personnalisés. Cela couvre beaucoup de choses !
SearchWP facilite également la recherche de Sources personnalisées. Pour en tirer pleinement parti, vous devrez configurer et implémenter un Moteur Supplémentaire.
Configuration
La configuration d'un Moteur Supplémentaire suit le même processus que le Moteur par défaut, mais dans ce cas, toutes les Sources vous sont proposées, pas seulement celles basées sur WP_Post.
Créez un nouveau Moteur Supplémentaire en cliquant sur le bouton Ajouter un nouveau dans l'onglet Moteurs de l'écran des paramètres de SearchWP.
Une fois le nouveau Moteur ajouté, vous pouvez personnaliser les Sources, Attributs et Règles à votre guise.
Après avoir enregistré votre/vos Moteur(s), SearchWP évaluera si l'Index doit être reconstruit et fournira un avis si c'est le cas.
La dernière étape de configuration consistera à noter le nom du Moteur, qui est différent de l'étiquette. Le nom se trouve à côté de l'étiquette du Moteur dans une police à chasse fixe. Le nom est la façon dont le Moteur est référencé dans le code par la suite.
Formulaire
La configuration d'un formulaire de recherche pour votre Moteur Supplémentaire implique la création d'une <input> avec un nom différent de s, car ce nom déclenchera une recherche WordPress native.
Quelque chose comme ceci fonctionnera pour commencer :
| <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> |
Il y a deux points à noter à propos de cet extrait :
- Le
nomde<input>utilisé estsearchwp - L'
actionduformpointe verssite_url( 'search-results/' ). Cela signifie que si l'URL de votre site estexample.com, ce formulaire redirigera versexample.com/search-results/lors de la soumission. Ce guide suppose que l'URL pointe vers une Page que vous avez créée dans le but d'afficher les résultats du Moteur Supplémentaire.
C'est tout ! Ce formulaire de départ correspond étroitement à la sortie par défaut de get_search_form() de WordPress, qui est probablement prise en charge par votre thème. Si ce n'est pas le cas, il peut être stylisé comme n'importe quel autre form sur votre site.
Résultats
Lorsque vous créez votre form de recherche, il a une action qui pointe vers une URL désignée comme la Page pour afficher vos résultats. Pour récupérer les résultats de SearchWP, nous allons d'abord créer un Modèle de Page personnalisé.
Voici un modèle de départ avec lequel nous pouvons travailler :
| <?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(); ?> |
Décomposons ce modèle de démarrage en quatre sections :
- Exécution de la recherche
- Affichage du formulaire de recherche (à nouveau)
- Affichage des résultats
- Affichage de la pagination
Les lignes 7-28 sont responsables de la récupération de la requête de recherche, de l'exécution de la recherche et du remplissage de notre tableau de résultats.
Les lignes 44-60 affichent le formulaire de recherche que nous avons créé ci-dessus.
Les lignes 64-94 sont responsables de l'affichage de nos résultats de recherche.
Notez qu'à la ligne 15, nous avons demandé à \SearchWP\Query de récupérer 'all', ce qui garantit que les résultats sont retournés dans leur type d'objet d'origine (par exemple, WP_Post) tel que configuré dans le \SearchWP\Source.
Note : Par défaut, \SearchWP\Query retournera un objet contenant l’id, la source, le site et la pertinence de chaque résultat. La définition de l’argument fields sur 'all' indique à \SearchWP\Query de remplacer ce résultat par un objet natif de la source elle-même. Alternativement, la définition de l’argument fields sur 'entries' retournera un tableau d’objets \SearchWP\Entry.
Cela signifie que les articles, les pages, les types d’articles personnalisés et les médias reviendront sous forme de leurs objets WP_Post d’origine. Les utilisateurs reviendront sous forme d’objets WP_User. Toutes les sources supplémentaires retourneront également leur objet natif.
Contrairement au travail avec The Loop, lorsque nous travaillons avec un moteur supplémentaire, nous devons déterminer le type de résultat que nous avons avant d’afficher des données.
Dans cet exemple, nous utilisons un switch qui fonctionne bien, car ce moteur de démonstration n’inclut que les articles, les pages et les utilisateurs comme sources.
Note : Si vous souhaitez uniquement la quantité minimale de données retournées avec les résultats de recherche, vous pouvez omettre complètement l’argument fields. Vous devrez alors utiliser les propriétés de l’objet du résultat pour récupérer les données nécessaires à l’affichage de vos résultats.


