Gibt es eine effizientere Admin-Suchfunktion / Plugin?

Writer in unserer großen WordPress-Installation verwenden gerne die Inhaltssuchfunktion. So praktisch diese functionalität ist, die Komplexität ihrer Abfragen verlangsamt unsere database erheblich. Hier ist ein Beispiel für eine SQL-Abfrage, die ich in unserem langsamen Abfrageprotokoll vor wenigen Minuten gefunden habe:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND ( ((wp_posts.post_title LIKE '%Made%') OR (wp_posts.post_content LIKE '%Made%')) AND ((wp_posts.post_title LIKE '%in%') OR (wp_posts.post_content LIKE '%in%')) AND ((wp_posts.post_title LIKE '%the%') OR (wp_posts.post_content LIKE '%the%')) AND ((wp_posts.post_title LIKE '%shade:%') OR (wp_posts.post_content LIKE '%shade:%')) AND ((wp_posts.post_title LIKE '%Easy%') OR (wp_posts.post_content LIKE '%Easy%')) AND ((wp_posts.post_title LIKE '%tips%') OR (wp_posts.post_content LIKE '%tips%')) AND ((wp_posts.post_title LIKE '%to%') OR (wp_posts.post_content LIKE '%to%')) AND ((wp_posts.post_title LIKE '%care%') OR (wp_posts.post_content LIKE '%care%')) AND ((wp_posts.post_title LIKE '%for%') OR (wp_posts.post_content LIKE '%for%')) AND ((wp_posts.post_title LIKE '%your%') OR (wp_posts.post_content LIKE '%your%')) AND ((wp_posts.post_title LIKE '%outdoor%') OR (wp_posts.post_content LIKE '%outdoor%')) AND ((wp_posts.post_title LIKE '%furniture%') OR (wp_posts.post_content LIKE '%furniture%')) ) AND wp_posts.post_type = 's5_post' AND ( wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private' ) ORDER BY wp_posts.post_date DESC LIMIT 0, 20 

Schau dir die Größe dieses Typen an! Es ist kein Wunder, dass es langsam läuft.

Ich würde Interesse haben, Ideen zu hören, wie man einige Verbesserungen an dieser functionalität einprogrammiert, um es ein bisschen effizienter zu machen. (Ich habe schon ein paar eigene Ideen; hoffentlich ist deine besser als meine! :))

Solutions Collecting From Web of "Gibt es eine effizientere Admin-Suchfunktion / Plugin?"

Ändern der WHERE Klausel

Es gibt einen Filter namens posts_search , mit dem die SQL WHERE Klausel posts_search kann, die während der Suche für die Abfrage verwendet wird (wenn WP_Query::is_search() zurückgibt und WP_Query->s gesetzt ist):

 add_filter( 'posts_search', 'wpse134392PostsSearchSQL', 20, 2 ); function wpse134392PostsSearchSQL( $sql, $wp_query ) { // Alter SQL clause here return $where; } 

Benutzerdefinierte ORDERBY

Um die ORDERBY statement abzufangen (um zB nach Autor zu sortieren, damit der Autor, der sucht, seine Beiträge zuerst / zuletzt erhält), können Sie posts_search_orderby :

 add_filter( 'posts_search_orderby', 'wpse134392PostsSearchOrderbySQL', 20, 2 ); function wpse134392PostsSearchOrderbySQL( $orderby, $wp_query ) { if ( is_admin() ) return $GLOBALS['wpdb']->posts."post_date"; return $orderby; } 

Feinkörniges SQL

Sie können auch die posts_clauses oder pre_get_posts , um noch feinere Ergebnisse zurückzugeben, indem Sie in Ihrem Callback is_admin() ob is_admin() und $query->is_search() TRUE .

Suche nicht alles

Um allgemeine Begriffe auszuschließen, die nicht helfen, können Sie WP_Query::get_search_stopwords() – oder besser: einen callback für den Filter verwenden. Derzeit sind die Stoppwörter:

 about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www 

Ein Beispiel für einen Filterrückruf:

 add_action( 'wp_search_stopwords', 'wpse134392SearchStopwords' ); function wpse134392SearchStopwords( $stopwords ) { return $stopwords + array( 'my', 'your', 'easy', ); } 

Hinweis: Es sieht so aus, als würde etwas (ein Plugin wahrscheinlich) Ihren Callback abfangen, da dort Wörter drin sind, die nicht durchsucht werden sollten.

Ich würde empfehlen, Ihre Abfrage so zu ändern, dass Ihre $ Argumente so sind

  $args = array( 'post_status' => array('pending', 'draft', 'future' ), 'post_type' => array( 'post', 'page', 'movie', 'book' ), 'orderby' => 'date', 'order' => 'DESC', 's' => 'keyword' ); $search_query = new WP_Query($args); 

Es gibt auch eine genauere Beschreibung hier . Das einzige, was ich nicht finden kann, ist die Abfrage nach mehreren Keywords. Wenn du so etwas machst, könnte es funktionieren

 's' => 'keyword1+keyword2+keyword3'