Motore supplementare
Indice
SearchWP consente la configurazione di qualsiasi numero di Motori, ognuno con la propria configurazione individuale. Questa segmentazione facilita molteplici implementazioni personalizzate della ricerca nel tuo sito.
L'unica limitazione del Motore Predefinito è che le sue Fonti devono essere basate su oggetti WP_Post. Questo perché il core di WordPress presuppone che i risultati della ricerca rientrino ne The Loop e The Loop è composto da oggetti WP_Post. Gli oggetti WP_Post sono utilizzati per Post, Pagine, Media e Tipi di Post Personalizzati. Questo copre molto!
SearchWP facilita anche la ricerca di Fonti personalizzate. Per sfruttare appieno tale funzionalità, dovrai configurare e implementare un Motore Supplementare.
Configurazione
La configurazione di un Motore Supplementare segue lo stesso processo del Motore Predefinito, ma in questo caso tutte le Fonti ti sono rese disponibili, non solo quelle basate su WP_Post.
Crea un nuovo Motore Supplementare facendo clic sul pulsante Aggiungi Nuovo nella scheda Motori della schermata delle impostazioni di SearchWP.
Una volta aggiunto il nuovo Motore, puoi personalizzare le Fonti, gli Attributi e le Regole a tuo piacimento.
Dopo aver salvato i tuoi Motori, SearchWP valuterà se l'Indice deve essere ricostruito e fornirà un avviso in tal caso.
L'ultimo passaggio di configurazione consisterà nel annotare il nome del Motore, che è diverso dall'etichetta. Il nome si trova accanto all'etichetta del Motore in un font monospaziato. Il nome è il modo in cui il Motore viene referenziato successivamente nel codice.
Modulo
La configurazione di un modulo di ricerca per il tuo Motore Supplementare comporta la creazione di un <input> con un diverso name rispetto a s, poiché tale name attiverà una ricerca nativa di WordPress.
Qualcosa di simile funzionerà per iniziare:
| <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> |
Ci sono due cose da notare riguardo a questo snippet:
- Il
namedell'<input>utilizzato èsearchwp - L'
actiondelformpunta asite_url( 'search-results/' ). Ciò significa che se l'URL del tuo sito èexample.com, questo modulo reindirizzerà aexample.com/search-results/dopo l'invio. Questa guida presuppone che l'URL punti a una Pagina creata allo scopo di visualizzare i risultati del Motore Supplementare.
Tutto qui! Quel modulo di avvio si allinea strettamente all'output predefinito di get_search_form() di WordPress, che è probabilmente supportato dal tuo tema. Se non lo è, può essere stilizzato come qualsiasi altro form sul tuo sito.
Risultati
Quando crei il tuo form di ricerca, ha un action che punta a un URL designato come Pagina per visualizzare i tuoi risultati. Per recuperare i risultati da SearchWP, creeremo prima un Modello di Pagina personalizzato.
Ecco un modello di avvio con cui possiamo lavorare:
| <?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(); ?> |
Suddividiamo questo template di base in quattro sezioni:
- Esecuzione della ricerca
- Output del modulo di ricerca (di nuovo)
- Visualizzazione dei risultati
- Visualizzazione della paginazione
Le righe 7-28 sono responsabili del recupero della query di ricerca, dell'esecuzione della ricerca e del popolamento del nostro array di risultati.
Le righe 44-60 producono il modulo di ricerca che abbiamo creato sopra
Le righe 64-94 sono responsabili dell'output dei nostri risultati di ricerca.
Nota che alla riga 15 abbiamo istruito \SearchWP\Query a recuperare 'all', il che garantisce che i risultati vengano restituiti come tipo di oggetto originale (ad es. WP_Post) come impostato in \SearchWP\Source.
Nota: Per impostazione predefinita, \SearchWP\Query restituirà un oggetto contenente id, source, site e relevance per ogni risultato. Impostando l'argomento fields su 'all' si dice a \SearchWP\Query di sostituire quel risultato con un oggetto nativo della Sorgente stessa. In alternativa, impostando l'argomento fields su 'entries' verranno restituiti un array di oggetti \SearchWP\Entry.
Ciò significa che Post, Pagine, Tipi di Post Personalizzati e Media torneranno come i loro oggetti WP_Post originali. Gli utenti torneranno come oggetti WP_User. Qualsiasi Sorgente aggiuntiva restituirà anche il proprio oggetto nativo.
A differenza del lavoro con The Loop, quando si lavora con un Motore Supplementare è necessario determinare di che tipo di risultato si tratta prima di produrre qualsiasi dato.
In questo esempio utilizziamo uno switch che funziona bene, perché questo Motore dimostrativo include solo Post, Pagine e Utenti come Sorgenti.
Nota: Se invece desideri solo la quantità minima di dati restituiti con i risultati della ricerca, puoi omettere completamente l'argomento fields. Dovrai quindi utilizzare le proprietà dell'oggetto del risultato per recuperare i dati necessari per visualizzare i tuoi risultati.


