Ich habe mit Codefragmenten herumgespielt, die Metadaten zur Administratorsuche hinzufügen.
Das beste Snippet, das ich gefunden habe, wurde von Stefano zu dieser Frage geschrieben .
Es scheint jedoch einen nervigen Fehler bei der Suche nach Nicht-Meta-Begriffen zu geben.
Hier sind einige Beispiele aus meiner lokalen Entwicklerinstallation. Ich habe die 2 MySQL-Abfragen auf den Bildschirm gedruckt.
Ansicht des einzelnen CPT-Beitrags, den ich zum Testen verwende
Dies ist der Code, der wie erwartet funktioniert und es mir ermöglicht, Metadaten vom Administrator zu durchsuchen
Leider erstellt der Code Duplikate für Nicht-Meta-Übereinstimmungen, in diesem Fall für den Post-Titel
Ein Grab, der den Post-Status, den Post-Typ und die Post-Vorfahren von Dupes zeigt
! Ein Grab, das den Post-Status, den Post-Typ und die Post-Vorfahren von Dupes zeigt
Hier ist der Code, den ich ausführe. Er ist im Grunde der gleiche wie der von Stefano, aber mit meinen groben Versuchen, die Abfrage zum Laufen zu bringen.
/*
* 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 '<br><strong>JOIN</strong>: ';
print_r ( $join );
echo '<br>';
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 '<br><strong>WHERE</strong>: ';
print_r ( $where );
echo '<br>';
return $where;
}
add_filter( 'posts_where', 'rel_search_where' );
plugin-development
custom-field
wp-admin
search
jnthnclrk
quelle
quelle
Antworten:
Eine
GROUP BY
Anweisung kann Ihre Beiträge nach dem gruppierenJOIN
. Für Wordpress können Sie denposts_groupby
Filter verwenden.quelle
Vielen Dank für Ihre Arbeit, Leute. Dieser Code hat mich größtenteils dorthin gebracht, aber mit WP 3.8 wurde ein nicht eindeutiger SQL-Tabellen- / Alias-Fehler angezeigt, sodass ich einige Änderungen vorgenommen habe. Damit es in meinem Setup funktioniert, musste ich einen $ wpdb-> postmeta-Alias festlegen, der in der JOIN-Anweisung verwendet wurde. Ich überprüfe auch nur einmal, ob die Haken verwendet werden sollten, damit sie nicht jedes Mal ausgelöst werden. Hoffe das hilft jemandem!
quelle