Suche nach Bindestrich

Ich laufe zurzeit WordPress auf Version 4.6.1 und ich versuche, nach Pfosten zu suchen, die das Zeichen - (Bindestrich) enthalten. Der Suchparameter nimmt jedoch meinen Bindestrich für eine Negation.

Aus der WP_Query- Dokumentation:

Wenn Sie einen Begriff mit einem Bindestrich voranstellen, werden mit diesem Begriff übereinstimmende Beiträge ausgeschlossen. ZB gibt ‘pillow -sofa’ Beiträge zurück, die ‘Kissen’, aber nicht ‘Sofa’ enthalten (verfügbar seit Version 4.4).

Hier ist meine Frage:

 $query = new WP_Query(array( 'post_type' => array('product', 'product_variation'), 's' => '-', 'posts_per_page' => 36 )); 

Ich habe versucht, dem Bindestrich zu entkommen, indem ich Folgendes machte:

 's' => '\-' 

Das Ergebnis bleibt jedoch gleich ( var_dump($query->request) ):

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (((wp_posts.post_title NOT LIKE '%%') AND (wp_posts.post_excerpt NOT LIKE '%%') AND (wp_posts.post_content NOT LIKE '%%'))) AND (wp_posts.post_password = '') AND wp_posts.post_type IN ('product', 'product_variation') AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled') ORDER BY wp_posts.post_date DESC LIMIT 0, 36 

Solutions Collecting From Web of "Suche nach Bindestrich"

Ein Ansatz besteht darin, das Ausschlusspräfix über den wp_query_search_exclusion_prefix Filter zu ändern, der in WP 4.7+ unterstützt wird. Siehe Ticket # 38099 .

Hier ist ein Beispiel, wie wir es ändern können - zum Beispiel ! :

 add_filter( 'wp_query_search_exclusion_prefix', function( $prefix ) { return '!'; // adjust to your needs (default is -) } ); 

wo wir !apple statt !apple verwenden -apple , um apple von den Suchergebnissen auszuschließen. Dann können Sie nach - suchen.

Es sieht so aus, als ob das Ausschluss-Präfix ein einzelnes Zeichen sein muss (oder leer, um diese function zu deaktivieren), wegen dieser Überprüfung im core :

 // If there is an $exclusion_prefix, terms prefixed with it should be excluded. $exclude = $exclusion_prefix && ( $exclusion_prefix === substr( $term, 0, 1 ) ); if ( $exclude ) { $like_op = 'NOT LIKE'; $andor_op = 'AND'; $term = substr( $term, 1 ); } else { $like_op = 'LIKE'; $andor_op = 'OR'; } 

Ansonsten klingt es wie ein Bug , nicht nur nach dem Begriff Exclusion Prefix suchen zu können.

Ich frage mich, ob es besser wäre, einen zusätzlichen $exclusion_prefix !== $term hinzuzufügen, um das zu unterstützen:

 $exclude = $exclusion_prefix && $exclusion_prefix !== $term && ( $exclusion_prefix === mb_substr( $term, 0, 1 ) ); if ( $exclude ) { $like_op = 'NOT LIKE'; $andor_op = 'AND'; $term = mb_substr( $term, 1 ); } else { $like_op = 'LIKE'; $andor_op = 'OR'; } 

wo wir auch mb_substr() anstelle von substr() für eine breitere Char-Unterstützung für das Ausschluss-Präfix verwenden würden.

Ich denke, ich sollte einfach ein Ticket dafür erstellen …

Sie können die Tatsache verwenden, dass NOT LIKE '%%' sehr einzigartig ist. Das kann nur passieren, wenn Sie nach - suchen.

 add_filter( 'posts_where', function( $where, $q ) { $where = str_replace( "NOT LIKE '%%'", "LIKE '%-%'", $where); return $where; }, 10, 2 ); $args = array( 'post_type' => 'post', 'post_status' => 'publish', 's' => '-' ); $q = new WP_Query( $args ); var_dump($query->request); 

Die resultierende Abfrage lautet:

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND (((wp_posts.post_title LIKE '%-%') AND (wp_posts.post_excerpt LIKE '%-%') AND (wp_posts.post_content LIKE '%-%'))) AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC LIMIT 0, 10