Căutare admin WordPress: extinderea rezultatelor

Publicat: 2021-01-20

Uneori, găsirea de conținut pe un site web poate fi dificilă. În calitate de administrator WordPress, cu cât este mai ușor să găsești conținutul pe care îl urmărești, cu atât mai bine. Din fericire, WordPress oferă o funcție de căutare pe majoritatea ecranelor de administrare pe care le veți folosi (de exemplu, ecranul Postări). Deși această funcție de căutare este bună, este totuși limitată în mai multe moduri.

De exemplu, dacă căutați o postare în ecranul de administrare Postări, funcția de căutare va căuta, în mod implicit, textul de căutare în titlul postării, fragmentul postării și conținutul postării și apoi va returna acele rezultate. Dar, ce se întâmplă dacă doriți să căutați cu cuvinte cheie care au legătură cu un câmp personalizat? Aceste informații nu sunt incluse în rezultatele căutării în tabelul cu lista de postări de administrator, ceea ce poate fi frustrant.

Într-un articol anterior, am învățat cum să adăugați un câmp personalizat în tipurile noastre de postări. Să aruncăm o privire la modul în care putem include un câmp personalizat și în rezultatele căutării.

Extindeți interogarea de căutare în ecranul de administrare Căutare

În exemplul nostru lucrat despre câmpurile personalizate, am creat un câmp personalizat numit „sursă” într-una dintre postările noastre și am inserat o valoare URL.

Dacă intri în tabelul cu liste de postări și folosești una dintre aceste valori „sursă” în bara de căutare, nu vei obține niciun rezultat, deoarece WordPress pur și simplu nu se uită la câmpurile personalizate atunci când caută în mod implicit.

Pentru a schimba acest lucru, va trebui să extindem cârligul original pe care WordPress îl oferă pentru funcția de căutare. Cârligul pe care trebuie să-l extindem este pre_get_posts care este inclus în fișierul wp-includes/class-wp-query.php în jurul liniei 1779 din cadrul funcției get_posts .

Interogarea WordPress

De fiecare dată când vizitați o pagină, fie în partea frontală, fie în zona de administrare, se execută un lanț de scripturi de cod pentru a crea obiectul WP_Query corespunzător solicitării dvs., împreună cu proprietățile acestuia.

Să creăm o vizualizare temporară a unora dintre proprietățile interogării, pentru a înțelege ce modificări apar în obiectul WP_Query în fiecare caz.

Pentru a vizualiza interogarea înainte de a fi executată, vom adăuga imprimarea în hook-ul de acțiuni pre_get_posts . Filtrul pre_get_posts declanșează după ce obiectul variabilă de interogare este creat, dar înainte ca interogarea reală să fie rulată.

În fișierul functions.php al temei dvs. active, introduceți această bucată de cod:

 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>"; }

Acum, dacă vizitați ecranul de administrare Postări, ieșirile de query și query_var vor fi tipărite în partea de sus.

Pentru a vizualiza codul mai ușor, îl puteți copia și lipi într-un înfrumusețator PHP online gratuit.

Matricea $GLOBALS['wp_query']->query (în primul rând) va arăta astfel:

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

În cazul unei căutări în ecranul de administrare Postări, de exemplu, ieșirea matricei se va modifica, inclusiv șirul de căutare. Dacă căutăm „wordpress.org”, de exemplu, va arăta astfel:

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

Asamblați Codul

Având în vedere informațiile de mai sus, vom introduce codul corect pentru a realiza funcția de căutare de care avem nevoie. Pentru a face acest lucru, întoarceți-vă la functions.php ale temei active și ștergeți codul pe care l-ați inserat cu câteva momente în urmă la pasul anterior. Apoi introduceți codul de mai jos:

 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 ); }; }

Următorul pas este să schimbați variabilele $post_type și $custom_fields la valori care se aplică cerințelor dvs. Să vedem ce am făcut în cod.

  • $post_type = 'post'; – Aici definim tipul de postare pe care dorim să o căutăm.
  • $custom_fields = array("source",); – Aici definim câmpurile personalizate pe care dorim să le căutăm.

Deoarece lucrăm cu cârligul pre_get_posts , este important să ne asigurăm în codul nostru că aplicăm extensia noastră de căutare personalizată în timp ce ne aflăm pe pagina corectă. Pentru a spune WordPress să ne afișeze codul în anumite condiții, folosim câteva etichete condiționate.

  • if ( ! is_admin() ) return; condiția asigură că, dacă nu ne aflăm în zona de administrare, niciunul din codul nostru nu se va executa.
  • if ( $query->query['post_type'] != $post_type ) verifică dacă lucrăm pe tipul de post pe care l-am definit în variabila $post_type . În cazul nostru, post .
  • $search_term = $query->query_vars['s']; este locul în care păstrăm șirul de căutare într-o variabilă și apoi îl setăm să se golească din nou $query->query_vars['s'] = ''; altfel nu va gasi nimic.

Acum, cu aceste actualizări în vigoare, dacă reîmprospătați ultima căutare, veți obține rezultatele corecte. În cazul nostru, vedem postarea „Post 1” în rezultate, care include o intrare de câmp personalizat „sursă”: „https://dev. wordpress.org /reference/functions/add_post_meta/'.

îmbunătățiți căutarea administratorilor wordpress

Extindeți interogarea de căutare în căutarea din față

Acum ne-am „remediat” căutarea de administrator, putem trece la îmbunătățirea funcției noastre de căutare front-end, astfel încât utilizatorii site-ului nostru web să poată căuta și câmpuri personalizate.

În același mod în care anterior căutarea de administrator nu dădea rezultate pentru câmpurile personalizate, căutarea frontală nu reușește să returneze niciun rezultat pentru câmpurile personalizate.

În mod ideal, dorim ca utilizatorii să poată căuta aceste câmpuri. În acest exemplu, avem un câmp „sursă” personalizat într-una dintre postările noastre care conține în prezent adresa URL „https://dev.wordpress.org/reference/functions/add_post_meta/”. Dacă un utilizator caută „wordpress.org”, atunci această postare ar trebui să apară în rezultate. Să aflăm cum să facem asta.

Codul necesar

Mergeți din nou la fișierul functions.php și copiați codul pe care l-ați lipit mai devreme. Acum, lipiți-l direct sub acel cod (deci aveți două copii ale acestui cod în functions.php ) Acum, schimbați numele funcției din acest al doilea lot de cod în ceva de genul extend_front_search . Ar trebui să arate așa:

 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 ); }; }

În continuare, trebuie să eliminăm if ( $query->query['post_type'] != $post_type ) return; condiție.

 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 ); }; }

Trebuie doar să menținem condiția if( is_admin() ) return; pentru a ne asigura că codul se va aplica numai în front-end și suntem gata să mergem.

O strategie alternativă

O altă modalitate de a extinde căutarea WordPress pentru a include câmpuri personalizate este prin modificarea interogării SQL.

Clasa WP_Query vă ajută în acest sens, împărțind-o în bucăți, așa cum este descris în jurul liniei 2897 a fișierului 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'] : '';

După cum am menționat anterior în articolele despre câmpuri personalizate, toate datele câmpurilor personalizate sunt stocate în baza de date în tabelul „postmeta”, care nu este inclus în căutarea WordPress în mod implicit. Deci, primul nostru pas este să unim aceste două tabele folosind codul de mai jos:

 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' );

Am folosit cârligul posts_join , desigur, deoarece filtrează clauza JOIN a interogării.

În continuare, vom folosi cârligul posts_where pentru a modifica piesa WHERE a interogării pentru a satisface nevoile noastre.

 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' );

Nu în ultimul rând, trebuie să prevenim duplicarea. Pentru a realiza acest lucru, folosim hook-ul posts_distinct care filtrează clauza DISTINCT a interogării.

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

Acum să vedem ce se întâmplă în interfață dacă căutăm șirul „wordpress.org”.

căutare wordpress pe front end

După cum era de așteptat, rezultatele sunt corecte de data aceasta. Căutarea WordPress a găsit „post 1” ca rezultat, deoarece conține câmpul „sursă” cu valoarea „https://dev. wordpress.org /reference/functions/add_post_meta/

Tipuri de postări personalizate în rezultatele căutării WordPress

Un alt lucru pe care ați putea dori să-l faceți este să faceți căutarea în Tipuri de postări personalizate (dacă nu sunteți sigur cum să creați un tip de postare personalizat, asigurați-vă că consultați articolele noastre despre asta aici).

Să ne imaginăm că am creat un tip de postare personalizat numit „cărți” și dorim ca acest tip de postare să apară în rezultatele căutării. De data aceasta nu trebuie să recreăm interogarea SQL, ci doar să redefinim tipurile de postări în hook-ul pre_get_posts , așa cum este descris mai jos. Codul trebuie plasat din nou în fișierul 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' );

Ceea ce am făcut aici a fost să adăugăm tipurile de postare dorite pentru a fi incluse în rezultatele căutării ca argumente la cârligul post_type .

Dacă doriți să excludeți un tip, eliminați-l din matrice.

Concluzie

Îmbunătățirea căutării pe site-ul dvs. WordPress poate fi cu adevărat utilă și poate economisi timp enorm. Pentru utilizatorul final este, de asemenea, important ca acesta să poată căuta atât tipuri de postări personalizate, cât și câmpuri personalizate. Sperăm că instrucțiunile de mai sus v-au oferit o perspectivă asupra modului în care puteți realiza acest lucru pe propriul site web.