C’era un’idea che mi frullava per la testa da qualche settimana: migliorare un po’ la funzione di ricerca all’interno di questo blog. Non che la usino in tanti, a dir la verità, stando alle statistiche gentilmente offerte dal provider che mi ospita. Più che altro per me stesso, visto che mi capita di tanto in tanto di cercare uno specifico post da citare o semplicemente per ricordarmi come la pensavo in merito ad un dato argomento. Avevo già implementato un primo miglioramento qualche mese fa, escludendo dalla ricerca predefinita di WordPress certi criteri che la rendevano troppo generica, e quindi non in grado di sfoltire il numero di risultati in maniera efficace. Adesso ho aggiunto la contestualizzazione, se così possiamo chiamarla. In altre parole, quando ti trovi all’interno di una delle stanze del blog, ed effettui una ricerca, il sistema andrà a spulciare solo tra gli articoli in quella stanza. Ad esempio, se stai cercando una ricetta e ti ricordi una delle parole al suo interno, ti converrà entrare prima in cucina, e poi digitare quella parola nel campo di ricerca. D’altro canto, non è forse quello che facciamo nella vita reale?
Se vuoi saperne di più dal punto di vista tecnico, ti consiglio di dare un’occhiata a questo commit nel repository del tema. In breve, ho creato una condizione nella barra laterale, che aggiunge un campo nascosto alla <FORM>
di ricerca, se si sta visitando una categoria (o stanza) del blog:
<?php if ( is_category() ): ?>
<input type="text" id="search-field"
autocomplete="off" name="s"
required="required"
placeholder="Cerca in questa stanza...">
<input type="hidden" name="c" value="<?= $category->term_id ?>">
<?php else: ?>
...
Poi ho definito un filtro nel functions.php, che dice a WordPress di modificare i parametri della WP Query, a seconda di quello che si è ricevuto con la richiesta di effettuare una ricerca:
add_filter( 'posts_clauses', array( __CLASS__, 'post_clauses' ), 10, 2 );
ed il codice eseguito all’interno del filtro:
if ( $query->is_search() && $query->is_main_query() ) {
// Attempt to get the parameter, or default to 0
$category_id = (int)( $_REQUEST[ 'c' ] ?? 0 );
if ( !empty( $category_id ) ) {
$query->set( 'cat', $category_id );
}
}
La bellezza di WordPress è proprio questa: bastano due righe di codice per migliorare una delle funzioni più importanti di questo sistema per la gestione dei contenuti. Senza dover per forza installare plugin di terze parti, come facevo un tempo, per estendere le funzionalità di questa piattaforma.
Commenti
Interessante aggiunta 🙂 poi è incredibile che oggi vadano tutti su REST, Angular ecc e sia così difficile fare il debug in tempo reale su quello che succede
Risposte al commento di Trap
Si, in realtà anche dove lavoro stiamo convertendo tutte le applicazioni in React, perché rende la vita più facile quando si usano spazi statici come AWS S3 per i siti. Però in effetti la complessità aumenta abbastanza, dovendo dare la caccia a possibili errori su vari livelli. Io sul blog avevo pensato ad implementare chiamate Ajax (no, non il detersivo) per caricare i risultati di una ricerca, ma la pigrizia ed il fatto che non è una funzione che usano in tanti, hanno avuto il sopravvento 😀