Ich versuche, den scope des Standard-WP-Suchalgorithmus zu erweitern. Was mache ich falsch?

Mir ist bewusst, dass es ein Plugin gibt, das das tut, aber es ist zu breit für das, was ich hinzufügen möchte.

Unten ist mein erster Versuch, die Suche zu erweitern, um benutzerdefinierte Felder abzufragen, aber es gibt nichts zurück. Ich habe in der Vergangenheit Code geschrieben, um Abfragen zu erstellen, aber dies ist das erste Mal, dass ich versuche, ein bereits existierendes zu modifizieren, und mir fehlt eindeutig etwas.

function st_search_all( $query ) { if ( $query->is_search ) { $query->set( 'post_type', array( 'page', 'attachment', 'post' ) ); $query->set( 'post_status', 'inherit' ); $query->set( 'meta_query', array( array( 'key' => '_st_plaintext', 'value' => "%{$query->get('s')}%", 'compare' => 'LIKE' ), array( 'key' => 'Training Classes', 'value' => "%{$query->get('s')}%", 'compare' => 'LIKE' ), array( 'key' => 'External Content', 'value' => "%{$query->get('s')}%", 'compare' => 'LIKE' ) ) ); } return $query; } add_filter( 'pre_get_posts', 'st_search_all' ); 

Die andere Sache ist, ich muss eine Suche nach dem Hauptinhalt der Seiten / Beiträge auch einschließen, die dieser Code nicht versucht. Was wäre dieser meta_query , wenn ich ihn in die meta_query ?

EDIT: Dumping die resultierende Abfragezeichenfolge nach @ s_ha_dum vorgeschlagenen Änderungen (Entfernen von % s, Hinzufügen der OR Beziehung und Entfernen der post Typ von der post_type ) gibt Folgendes (Einrückung hinzugefügt). Ich bin nicht sehr vertraut mit SQL, aber es scheint, dass die generierte Abfrage erfordert, dass der Titel oder der Inhalt der Abfrage entspricht, bevor sie sogar eines der hinzugefügten Felder überprüft. Lies ich etwas falsch? Wenn nicht, wie kann ich das über die WP-API ändern?

 string(494) " AND (( (dev_posts.post_title LIKE '%SBIR%') OR (dev_posts.post_content LIKE '%SBIR%') )) AND (dev_posts.post_password = '') AND dev_posts.post_type IN ('page', 'attachment') AND (dev_posts.post_status = 'inherit') AND ((dev_postmeta.meta_key = '_st_plaintext' AND CAST(dev_postmeta.meta_value AS CHAR) LIKE '%SBIR%') OR (mt1.meta_key = 'Training Classes' AND CAST(mt1.meta_value AS CHAR) LIKE '%SBIR%') OR (mt2.meta_key = 'External Content' AND CAST(mt2.meta_value AS CHAR) LIKE '%SBIR%') ) " 

Solutions Collecting From Web of "Ich versuche, den scope des Standard-WP-Suchalgorithmus zu erweitern. Was mache ich falsch?"

Fügen Sie dies vorübergehend Ihrer functions.php . Es wird Dinge brechen, aber Sie können die WHERE Klausel sehen. Achten Sie darauf, es zu entfernen, da die Dinge nicht richtig funktionieren, wenn Sie es dort lassen.

 function dump_where($w){ var_dump($w); } add_filter('posts_where','dump_where'); 

Das erste, was Sie beachten sollten, ist, dass die Prozentzeichen entkamen. Entferne diese und WordPress fügt sie unrescaped zurück. Wenn Sie nur einen von diesen am Anfang oder am Ende wollen, aber nicht beide, könnte das schwieriger sein. Zum Glück nicht.

Zweitens scheint die Standardbeziehung AND zu sein. meta_key Sie also keine Übereinstimmung für jeden dieser meta_key erzwingen wollen, sollten Sie eine relationship zu Ihrer Meta-Abfrage hinzufügen.

  $query->set( 'meta_query', array( 'relation' => 'OR', array( 'key' => '_st_plaintext', /* and the rest of your query */ 

Drittens, Post-Inhalt ist bereits durchsucht. Sie sollten nichts tun müssen, um dies zu ermöglichen. Sehen Sie sich die WHERE Klausel an, die mein temporärer Code ablegt, und Sie sollten sehen können, wo das passiert.

http://codex.wordpress.org/Class_Reference/WP_Query