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' );
plugin-development
custom-field
wp-admin
search
jnthnclrk
la source
la source
Réponses:
Une
GROUP BY
déclaration peut regrouper vos messages après leJOIN
. Pour Wordpress, vous pouvez utiliser leposts_groupby
filtre.la source
Merci pour votre travail là-dessus, les amis. Ce code m'a permis de faire la plupart du chemin, mais en utilisant WP 3.8, j'obtenais une erreur de table / alias non unique SQL, j'ai donc apporté quelques modifications. Pour que cela fonctionne sur ma configuration, j'ai dû définir un alias $ wpdb-> postmeta utilisé dans l'instruction JOIN. Je vérifie également une seule fois pour voir si les crochets doivent être utilisés afin qu'ils ne se déclenchent pas à chaque fois. J'espère que cela aide quelqu'un!
la source