Die WP-Benutzerabfrage schlägt fehl, wenn Meta-Abfragen und Suchspalten durchsucht werden

Ich erstelle eine erweiterte Benutzersuche mit WP_User_Query, aber mit ungewöhnlichem Verhalten. Ich versuche, mit einem Begriff zu suchen, von dem ich weiß, dass er in den Feldern user_nicename und user_email vorhanden ist, aber nicht zurückkommt, wenn ich in die $ args Meta-Abfrage einschließe.

Mit der folgenden einfachen Abfrage gibt WordPress bei der Suche nach den Daten der Benutzertabelle alles erwartungsgemäß zurück, da der Begriff in user_nicename und user_email existiert.

$args = array ( 'fields' => ['ID'], 'count_total' => true, 'order' => 'ASC', 'orderby' => 'display_name', 'search' => '*'.esc_attr( $search_term ).'*', ); $wp_user_query = new WP_User_Query($args); 

Wenn ich jedoch eine Metaabfrage in die Suche einfüge, um sie mit dem Benutzermeta zu vergleichen, gibt die Abfrage überhaupt keine Ergebnisse zurück – obwohl sie Daten abgleicht, die zuvor die einfache statement verwendet haben. Die meta_query lässt die $ args so aussehen:

 $args = array ( 'fields' => ['ID'], 'count_total' => true, 'order' => 'ASC', 'orderby' => 'display_name', 'search' => '*'.esc_attr( $search_term ).'*', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'description', 'value' => $search_term , 'compare' => 'LIKE' ) ) ); $wp_user_query = new WP_User_Query($args); 

Ich ermittle, welche Spalten aus der Benutzertabelle gesucht werden, indem ich den folgenden Filter implementiere:

 function inc_columns( $search_columns, $search, $this ) { $search_columns[] = 'user_email'; $search_columns[] = 'user_nicename'; $search_columns[] = 'display_name'; return $search_columns; } add_filter('user_search_columns', 'inc_columns', 10, 3); 

Jedes Licht, das darauf geworfen werden kann, warum dies ist, wäre großartig.

Solutions Collecting From Web of "Die WP-Benutzerabfrage schlägt fehl, wenn Meta-Abfragen und Suchspalten durchsucht werden"

Durch die Kombination einer Meta-Abfrage mit einer Suche nach einem Schlüsselwort werden Beiträge zurückgegeben, die sowohl mit der Suchanfrage als auch mit dem Ergebnis der Meta-Abfrage übereinstimmen (auch wenn Sie relation => OR in der Meta-Abfrage verwenden).

Diese Antwort behandelt eine Möglichkeit, das erwartete Ergebnis für Posts zu erreichen. Sie müssen die Abfrage ändern, bevor das Ergebnis abgerufen wird. Dies muss jedoch geändert werden, um mit einer WP-Benutzerabfrage verwendet zu werden. Ich habe versucht, eine Lösung zu finden, die nach dem Suchbegriff in den user_nicename , user_email und meta sucht – ungeprüft, also möglicherweise user_email müssen.

 add_action( 'pre_user_query', 'user_meta_OR_search'); function user_meta_OR_search($q){ if ($search = $q->get('_meta_or_search')){ add_filter( 'get_meta_sql', function( $sql ) use ( $search ){ global $wpdb; // Only run once: static $nr = 0; if( 0 != $nr++ ) return $sql; // Modify WHERE part: $where = sprintf( " AND ( %s OR %s OR %s ) ", $wpdb->prepare( "{$wpdb->users}.user_nicename like '%%%s%%'", $search), $wpdb->prepare( "{$wpdb->users}.user_email like '%%%s%%'", $search), mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) ) ); $sql['where'] = $where; return $sql; }); } } // Then, where you do the searching: $search_term = "test"; $args = array( 'fields' => ['ID'], 'count_total' => true, 'order' => 'ASC', 'orderby' => 'display_name', '_meta_or_search' => '*'.esc_attr( $search_term ).'*', "meta_query" => array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'description', 'value' => $search_term , 'compare' => 'LIKE' ) ) ); $the_query = new WP_User_Query($args); 

Eine andere Lösung besteht darin, zwei Abfragen zu verwenden – eine, die eine allgemeine Suche mit s und eine Suche mit meta_query :

 $args1 = array ( 'fields' => ['ID'], 'count_total' => true, 'order' => 'ASC', 'orderby' => 'display_name', 'search' => '*'.esc_attr( $search_term ).'*' ); $wp_user_query1 = new WP_User_Query($args1); $args2 = array ( 'fields' => ['ID'], 'count_total' => true, 'order' => 'ASC', 'orderby' => 'display_name', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $search_term, 'compare' => 'LIKE' ), array( 'key' => 'description', 'value' => $search_term , 'compare' => 'LIKE' ) ) ); $wp_user_query2 = new WP_User_Query($args2); $result = new WP_User_Query(); $result->results = array_unique( array_merge( $wp_user_query1->results, $wp_user_query2->results ), SORT_REGULAR ); $result->post_count = count( $result->results ); 

Dadurch werden die Ergebnisse der beiden Abfragen in eine dritte Abfrage mit den endgültigen Suchergebnissen zusammengeführt. Ich habe das nicht getestet, also muss es vielleicht etwas optimiert werden!