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' );