Erweitern der Websitesuche um ein einzelnes benutzerdefiniertes Feld

Ich habe den folgenden Code in meiner functions.php Datei

function __adapted_search_function($search, $query) { if(is_admin() || !$query->is_main_query() || !$query->is_search) return; //determine if we are modifying the right query global $wpdb; $search_term = $query->get('s'); $search = ' AND ('; //point 1 $search .= "($wpdb->posts.post_title LIKE '%$search_term%')"; //need to add an OR between search conditions $search .= " OR "; //point 2 $search .= "($wpdb->posts.post_excerpt LIKE '%$search_term%')"; //need to add an OR between search conditions $search .= " OR "; //point 3 $search .= "($wpdb->postmeta.meta_key = 'mcb-product' AND $wpdb->postmeta.meta_value LIKE '%$search_term%')"; //add the filter to join, sql will error out without joining the tables to the query add_filter('posts_join', '__custom_join_tables'); return $search . ') '; } function __custom_join_tables($joins) { global $wpdb; $joins = "JOIN $wpdb->postmeta ON ($wpdb->postmeta.post_ID = $wpdb->posts.ID)"; return $joins; } 

Was ich gehofft hatte, würde nur den Posttitel, den Auszug und auch ein einzelnes benutzerdefiniertes Feld suchen.

Es funktioniert, wenn ich den Join entferne, aber wirklich muss das enthalten, kann jeder sehen, wo ich falsch gelaufen bin?

Solutions Collecting From Web of "Erweitern der Websitesuche um ein einzelnes benutzerdefiniertes Feld"

Ich habe es getriggers, indem ich die Abfrage erweitert habe

 function extend_search( $search, &$wp_query ) { global $wpdb; if ( empty( $search )) return $search; $terms = $wp_query->query_vars[ 's' ]; $exploded = explode( ' ', $terms ); if( $exploded === FALSE || count( $exploded ) == 0 ) $exploded = array( 0 => $terms ); $search = ''; foreach( $exploded as $tag ) { $search .= " AND ( ($wpdb->posts.post_title LIKE '%$tag%') OR ($wpdb->posts.post_excerpt LIKE '%$tag%') OR EXISTS ( SELECT * FROM $wpdb->postmeta WHERE post_ID = pl_posts.ID AND meta_key = '--KEY--' AND meta_value LIKE '%$tag%' ) )"; } return $search; } 

pre_get_posts nimmt nur einen Parameter, aber Sie scheinen es zu verwenden, als wäre es posts_where . Das ist nicht wirklich pre_get_posts funktioniert. Sie müssen das übergebene $query Objekt ändern, keine SQL Klausel konstruieren und zurückgeben.

Es ist für mich nicht möglich, dies einfach zu testen, aber ich denke, der gewünschte Hook ist entweder posts_where oder der posts_search Filter, der logisch am sinnvollsten ist.

 add_action('posts_where', '__adapted_search_function',1,2); 

Oder

 add_action('posts_search', '__adapted_search_function',1,2); 

Möglicherweise müssen Sie den Code ändern, aber das Ändern des Hooks, den Sie verwenden, ist der Schlüssel.