WP_User_Query kombiniert keine Meta + normalen Suchmethoden

Ich habe versucht, nach Benutzernamen zu suchen, indem ich dem WordPress-Codex folge, aber es scheint nicht zu funktionieren …

Die folgende Abfrage, die direkt aus dem Codex kopiert wird, gibt 0 Ergebnisse zurück. Wenn ich jedoch den Parameter meta_query (oder ‘search’, je nachdem, ob ich nach dem Benutzernamen oder dem Vornamen suche) lösche, gibt er Ergebnisse zurück. Ist das ein Fehler mit WordPress?

Im Wesentlichen habe ich trotz des Codex und mehrerer Beispiele, in denen ich explizit nachgesehen habe, dass “search” und “meta_query” zusammenlaufen können, nicht der Fall zu sein scheint. Kann mir das jemand bestätigen?

$meta_search = 'Ross'; $qArgs = array ( 'order' => 'ASC', 'orderby' => 'display_name', 'search' => '*'.esc_attr( $meta_search ).'*', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $meta_search, 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $meta_search, 'compare' => 'LIKE' ), array( 'key' => 'description', 'value' => $meta_search , 'compare' => 'LIKE' ) ) ); $find_users = new WP_User_Query($qArgs); 

Lösung: Aufgrund der fehlenden functionalität musste ich zwei separate Abfragen ausführen und diese zusammenführen. Fern Form ideal, aber in Echtzeit kann ich nicht auf einen Bugfix warten. Also, für was es wert ist (was für die höhere Ebene entwickelt wird wird minimal sein, aber für Zwischenprodukte wird hoffentlich nützlich sein) hier ist meine Arbeit –

 // ORIGINAL QUERY $qArgs = array('role' => 'subscriber','posts_per_page' => -1); // SIMPLE SEARCH $search1Args = array('search' => '*'.esc_attr($meta_search).'*'); // merge search with original query $s1Args = array_merge($qArgs, $search1Args); // go fetch $find_users_1 = new WP_User_Query($s1Args); // META QUERY $search2Args = array( 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'first_name', 'value' => $meta_search, 'compare' => 'LIKE' ), array( 'key' => 'last_name', 'value' => $meta_search, 'compare' => 'LIKE' ) ) ); // merge search with original query $s2Args = array_merge($qArgs, $search2Args); // go fetch $find_users_2 = new WP_User_Query($s2Args); // MERGE QUERIES $find_out_1 = $find_users_1->get_results(); $find_out_2 = $find_users_2->get_results(); $found_users = array_merge_recursive($find_out_1, $find_out_2); // rebuild the returned users $find_count_1 = $find_users_1->total_users; $find_count_2 = $find_users_2->total_users; $find_count = ($find_count_1 + $find_count_2); // rebuild the user count // RECOMPILE $find_users = $find_users_1; $find_users->results = $found_users; $find_users->total_users = $find_count; 

Als Warnung habe ich hier keine Paginierung erwogen und es wäre zu überlegen, ob jemand dies auf einer Website mit vielen Benutzern erwarten würde.

Solutions Collecting From Web of "WP_User_Query kombiniert keine Meta + normalen Suchmethoden"

Sie scheinen zusammen zu arbeiten, aber beachten Sie den AND Teil zwischen dem Suchteil und dem Meta-Abfrageteil in der generierten SQL-Abfrage. Ich frage mich, ob Sie stattdessen OR erwartet haben?

Hier sind die generierten SQL-Abfragen für die beiden Fälle, die Sie erwähnt haben:

Suche + Meta-Abfrage:

 SELECT DISTINCT SQL_CALC_FOUND_ROWS wp_users.* FROM wp_users INNER JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id ) WHERE 1=1 AND ( ( wp_usermeta.meta_key = 'first_name' AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%Ross%' ) OR ( wp_usermeta.meta_key = 'last_name' AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%Ross%' ) OR ( wp_usermeta.meta_key = 'description' AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%Ross%' ) ) AND ( user_login LIKE '%Ross%' OR user_nicename LIKE '%Ross%' ) ORDER BY display_name ASC ; 

Nur Suche:

 SELECT SQL_CALC_FOUND_ROWS wp_users.* FROM wp_users WHERE 1=1 AND ( user_login LIKE '%Ross%' OR user_nicename LIKE '%Ross%' ) ORDER BY display_name ASC ; 

coreprüfung:

Im core haben wir die Methode WP_User_Query::get_search_sql() , die einen AND Teil WP_User_Query::get_search_sql() :

 return ' AND (' . implode(' OR ', $searches) . ')'; 

Ähnlich haben wir in der Methode WP_Meta_Query::get_sql_clauses() einen AND Teil:

 $sql['where'] = ' AND ' . $sql['where'];