Ricerca dell'amministratore di WordPress: estensione dei risultati

Pubblicato: 2021-01-20

A volte trovare contenuti su un sito Web può essere difficile. In qualità di amministratore di WordPress, più è facile trovare i contenuti che cerchi, meglio è. Per fortuna, WordPress fornisce una funzione di ricerca sulla maggior parte delle schermate di amministrazione che utilizzerai (ad esempio la schermata dei post). Sebbene questa funzione di ricerca sia buona, è comunque limitata in diversi modi.

Ad esempio, se cerchi un post nella schermata di amministrazione dei post, la funzione di ricerca cercherà, per impostazione predefinita, il testo della query di ricerca nel titolo del post, nell'estratto del post e nel contenuto del post, quindi restituirà quei risultati. Ma cosa succede se si desidera eseguire una ricerca con parole chiave correlate a un campo personalizzato? Queste informazioni non sono incluse nei risultati di ricerca della tabella dell'elenco dei post dell'amministratore, il che può essere frustrante.

In un articolo precedente abbiamo imparato come aggiungere un campo personalizzato nei nostri tipi di post. Diamo un'occhiata a come possiamo includere anche un campo personalizzato nei risultati della ricerca.

Estendi la query di ricerca nella schermata di amministrazione Cerca

Nel nostro esempio lavorato sui campi personalizzati, abbiamo creato un campo personalizzato chiamato "sorgente" in uno dei nostri post e inserito un valore URL.

Se vai nella tabella dell'elenco dei post e utilizzi uno di questi valori "sorgente" nella barra di ricerca, non otterrai alcun risultato poiché WordPress semplicemente non guarda i campi personalizzati durante la ricerca per impostazione predefinita.

Per cambiare questo, dovremo estendere l'hook originale che WordPress fornisce per la funzione di ricerca. L'hook che dobbiamo estendere è il pre_get_posts che è incluso nel file wp-includes/class-wp-query.php intorno alla riga 1779 all'interno della funzione get_posts .

La domanda di WordPress

Ogni volta che visiti una pagina, sia nella vista frontale che nell'area di amministrazione, viene eseguita una catena di script di codice per creare l'oggetto WP_Query corrispondente alla tua richiesta, insieme alle sue proprietà.

Creiamo una vista temporanea di alcuni degli output delle proprietà della query per capire quali modifiche si verificano in ogni caso nell'oggetto WP_Query .

Per visualizzare la query prima che venga eseguita, aggiungeremo la stampa nell'hook dell'azione pre_get_posts . Il filtro pre_get_posts dopo la creazione dell'oggetto variabile di query, ma prima dell'esecuzione della query effettiva.

Nel file functions.php del tuo tema attivo inserisci questo pezzo di codice:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Ora, se visiti la schermata di amministrazione di Posts, gli output di query e query_var verranno stampati in alto.

Per visualizzare il codice più facilmente puoi copiarlo e incollarlo in un abbellitore PHP online gratuito.

L'array $GLOBALS['wp_query']->query (first out) sarà simile al seguente:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Ad esempio, nel caso di una ricerca nella schermata di amministrazione dei post, l'output dell'array cambierà includendo la stringa di ricerca. Se cerchiamo ad esempio "wordpress.org", apparirà così:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Assembla il codice

Tenendo presente le informazioni di cui sopra, inseriremo il codice corretto per ottenere la funzione di ricerca di cui abbiamo bisogno. Per fare ciò, torna al functions.php del tuo tema attivo ed elimina il codice che hai inserito pochi istanti fa nel passaggio precedente. Quindi inserisci il codice qui sotto:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Il passaggio successivo consiste nel modificare le $post_type e $custom_fields in valori che si applicano ai tuoi requisiti. Vediamo cosa abbiamo fatto nel codice.

  • $post_type = 'post'; – Qui definiamo il tipo di post che vogliamo cercare.
  • $custom_fields = array("source",); – Qui definiamo il/i campo/i personalizzato/i che vogliamo cercare.

Poiché stiamo lavorando con l'hook pre_get_posts , è importante assicurarsi nel nostro codice di applicare la nostra estensione di ricerca personalizzata mentre siamo sulla pagina corretta. Per dire a WordPress di visualizzare il nostro codice in condizioni specifiche, utilizziamo alcuni tag condizionali.

  • Il if ( ! is_admin() ) return; condizione garantisce che se non siamo nell'area di amministrazione, nessuno dei nostri codici verrà eseguito.
  • L' if ( $query->query['post_type'] != $post_type ) controlla se lavoriamo sul tipo di post che abbiamo definito nella variabile $post_type . Nel nostro caso, post .
  • Il $search_term = $query->query_vars['s']; è dove teniamo la stringa di ricerca in una variabile e poi la impostiamo di nuovo in modo che sia vuota $query->query_vars['s'] = ''; altrimenti non troverà nulla.

Ora, con questi aggiornamenti in atto, se aggiorni l'ultima ricerca otterrai i risultati corretti. Nel nostro caso, vediamo il post "Post 1" nei risultati che include una voce del campo personalizzato "fonte": "https://dev. wordpress.org /reference/functions/add_post_meta/'.

migliorare la ricerca degli amministratori di wordpress

Estendi la query di ricerca nella ricerca della vista frontale

Ora che abbiamo "risolto" la nostra ricerca di amministrazione, possiamo passare al miglioramento della nostra funzione di ricerca front-end in modo che gli utenti del nostro sito Web possano anche cercare campi personalizzati.

Allo stesso modo in cui in precedenza la ricerca dell'amministratore non produceva risultati per i campi personalizzati, anche la ricerca front-end non restituisce alcun risultato per i campi personalizzati.

Idealmente, vogliamo che gli utenti siano in grado di cercare questi campi. In questo esempio, abbiamo un campo 'sorgente' personalizzato in uno dei nostri post che attualmente contiene l'URL 'https://dev.wordpress.org/reference/functions/add_post_meta/'. Se un utente cerca "wordpress.org", questo post dovrebbe apparire nei risultati. Scopriamo come farlo.

Il codice richiesto

Vai di nuovo al tuo file functions.php e copia il codice che hai incollato in precedenza. Ora, incollalo direttamente sotto quel codice (in modo da avere due copie di questo codice in functions.php ) Ora, cambia il nome della funzione in questo secondo lotto di codice in qualcosa come extend_front_search . Dovrebbe sembrare come questo:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Successivamente, dobbiamo rimuovere il if ( $query->query['post_type'] != $post_type ) return; condizione.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Abbiamo solo bisogno di mantenere la condizione if( is_admin() ) return; per garantire che il codice venga applicato solo nel front-end e siamo a posto.

Una strategia alternativa

Un altro modo per estendere la ricerca di WordPress per includere campi personalizzati è alterare la query SQL.

La classe WP_Query ti aiuta in questo rompendolo in pezzi come descritto intorno alla riga 2897 del file wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Come accennato in precedenza negli articoli sui campi personalizzati, tutti i dati dei campi personalizzati sono archiviati nel database nella tabella 'postmeta' che non è inclusa nella ricerca di WordPress per impostazione predefinita. Quindi il nostro primo passo è unire queste due tabelle usando il codice qui sotto:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Ovviamente abbiamo usato l'hook posts_join in quanto filtra la clausola JOIN della query.

Successivamente, utilizzeremo l'hook posts_where per modificare la parte WHERE della query per soddisfare le nostre esigenze.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Ultimo ma non meno importante, dobbiamo prevenire i duplicati. Per ottenere ciò utilizziamo l'hook posts_distinct che filtra la clausola DISTINCT della query.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Ora vediamo cosa succede nel frontend se cerchiamo la stringa “wordpress.org”.

ricerca wordpress sul front-end

Come previsto, questa volta i risultati sono corretti. La ricerca di WordPress ha trovato "post 1" come risultato in quanto contiene il campo "source" con valore "https://dev. wordpress.org /reference/functions/add_post_meta/

Tipi di post personalizzati nei risultati di ricerca di WordPress

Un'altra cosa che potresti voler fare è rendere ricercabili i tipi di post personalizzati (se non sei sicuro di come creare un tipo di post personalizzato, assicurati di controllare i nostri articoli su questo qui).

Immaginiamo di aver creato un tipo di post personalizzato chiamato "libri" e vogliamo che questo tipo di post venga visualizzato nei risultati di ricerca. Questa volta non dobbiamo ricreare la query SQL, ma solo ridefinire i tipi di post pre_get_posts come mostrato di seguito. Il codice deve essere nuovamente inserito nel file functions.php .

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

Quello che abbiamo fatto qui è stato aggiungere i tipi di post desiderati da includere nei risultati della ricerca come argomenti post_type .

Se desideri escludere un tipo, rimuovilo dall'array.

Conclusione

Migliorare la ricerca sul tuo sito Web WordPress può essere davvero utile e un enorme risparmio di tempo. Per il tuo utente finale è anche importante che possa cercare sia i tipi di post personalizzati che i campi personalizzati. Si spera che le istruzioni di cui sopra ti abbiano dato un'idea di come raggiungere questo obiettivo sul tuo sito web.