Wie kann ich dieses Admin-Abfrage-Snippet verbessern, um zu vermeiden, dass bei Nicht-Meta-Suchen doppelte Ergebnisse generiert werden?

Ich habe mit Code-Snippets herumgespielt, die Metadaten zu Admin-Suchen hinzufügen.

Der beste Ausschnitt, den ich gefunden habe, wurde von Stefano in dieser Frage geschrieben .

Es scheint jedoch, 1, lästigen Fehler bei der Suche nicht-Meta-Begriffe.

Hier sind einige Grabs von meiner lokalen Entwickler-Installation. Ich habe die 2 MySQL-Abfragen auf den Bildschirm gedruckt.

Ansicht des einzelnen CPT-Posts, den ich zum Testen verwende

Ansicht des einzelnen CPT-Posts, den ich zum Testen verwende

Dies ist der Code, der wie erwartet funktioniert und mir erlaubt, Metadaten von admin zu suchen

Dies ist der Code, der wie erwartet funktioniert und mir erlaubt, Metadaten von admin zu suchen

Leider erzeugt der Code Duplikate bei Nicht-Meta-Übereinstimmungen, in diesem Fall beim Post-Titel

Leider erzeugt der Code Duplikate bei Nicht-Meta-Übereinstimmungen, in diesem Fall beim Post-Titel

Ein Grab, der den Post-Status anzeigt, Post-Typ und Post-Vorfahren von Dupes

! Ein Grab, der den Post-Status anzeigt, Post-Typ und Post-Vorfahren von Dupes

Hier ist der Code, den ich benutze, es ist im Grunde der gleiche wie bei Stefano, aber mit meinen groben Versuchen, die Abfrage funktionieren zu lassen.

/* * Search custom fields from admin keyword searches */ function rel_search_join( $join ) { global $pagenow, $wpdb; if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') { $join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id '; } echo '
JOIN: '; print_r ( $join ); echo '
'; return $join; } add_filter('posts_join', 'rel_search_join' ); function rel_search_where( $where ) { global $pagenow, $wpdb; if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); $where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where ); $where = str_replace( "OR wp_posts.post_status = 'private'", "", $where ); $where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where ); $where = str_replace( "OR wp_posts.post_status = 'future'", "", $where ); } echo '
WHERE: '; print_r ( $where ); echo '
'; return $where; } add_filter( 'posts_where', 'rel_search_where' );

Solutions Collecting From Web of "Wie kann ich dieses Admin-Abfrage-Snippet verbessern, um zu vermeiden, dass bei Nicht-Meta-Suchen doppelte Ergebnisse generiert werden?"

Eine GROUP BY statement kann Ihre Posts nach dem JOIN gruppieren. Für WordPress können Sie den posts_groupby Filter verwenden.

 add_filter( 'posts_groupby', 'my_post_limits' ); function my_post_limits($groupby) { global $pagenow, $wpdb; if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) { $groupby = "$wpdb->posts.ID"; } return $groupby; } 

Danke für deine Arbeit, Leute. Dieser Code hat mir den größten Teil des Weges gebracht, aber mit WP 3.8 habe ich einen nicht eindeutigen SQL-Tabellen / Alias-Fehler bekommen, also habe ich einige Änderungen vorgenommen. Damit es in meinem Setup funktioniert, musste ich einen $ wpdb-> postmeta-Alias ​​setzen, der in der JOIN-statement verwendet wurde. Ich überprüfe auch nur einmal nach, ob die Haken benutzt werden sollten, damit sie nicht jedes Mal feuern. Hoffe das hilft jemandem!

 global $postmeta_alias, $is_specials_search; $cpt_name = 'special'; $postmeta_alias = 'pdpm'; // Change this to whatever your custom post type is $is_specials_search = is_admin() && $pagenow=='edit.php' && isset( $_GET['post_type'] ) && $_GET['post_type']==$cpt_name && isset( $_GET['s'] ); // Extend search to include 'description' field if ( $is_specials_search ) { add_filter( 'posts_join', 'pd_description_search_join' ); add_filter( 'posts_where', 'pd_description_search_where' ); add_filter( 'posts_groupby', 'pd_search_dupe_fix' ); } function pd_description_search_join ($join){ global $pagenow, $wpdb, $postmeta_alias, $is_specials_search; if ( $is_specials_search ) $join .='LEFT JOIN '.$wpdb->postmeta. ' as ' . $postmeta_alias . ' ON '. $wpdb->posts . '.ID = ' . $postmeta_alias . '.post_id '; return $join; } // END search_join function pd_description_search_where( $where ){ global $pagenow, $wpdb, $postmeta_alias, $is_specials_search; if ( $is_specials_search ) $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$postmeta_alias.".meta_value LIKE $1)", $where ); return $where; } // END search_where function pd_search_dupe_fix($groupby) { global $pagenow, $wpdb, $is_specials_search; if ( $is_specials_search ) $groupby = "$wpdb->posts.ID"; return $groupby; } // END pd_search_dupe_fix