J'ai joué avec des extraits de code qui ajoutent des métadonnées aux recherches d'administration.
Le meilleur extrait que j'ai trouvé a été écrit par Stefano sur cette question .
Cependant, il semble avoir 1 bogue ennuyeux lors de la recherche de termes non méta.
Voici quelques captures de mon installation de développement local. J'ai imprimé les 2 requêtes MySQL sur l'écran.
Vue du seul post CPT que j'utilise pour tester
C'est le code qui fonctionne comme prévu et qui me permet de rechercher des métadonnées auprès de l'administrateur
Malheureusement, le code crée des doublons sur les correspondances non méta, dans ce cas sur le titre du message
Une capture montrant le statut du post, le type de post et les ancêtres des dupes
! Une capture montrant le statut du post, le type de post et les ancêtres des dupes
Voici le code que j'utilise, il est fondamentalement le même que celui de Stefano, mais avec mes tentatives grossières pour faire fonctionner la requête.
/*
* 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' );