J'ai un type de message personnalisé qui comprend de nombreux champs personnalisés. Je voudrais les ajouter comme cible de recherche à la recherche d'administrateur.
Actuellement, la recherche admin recherche uniquement le contenu et le titre. J'aimerais également que ces champs personnalisés soient également recherchés.
Y-a-t-il un moyen de faire ça ?
C'est est possible, mais vous devrez jouer un peu avec la requête réelle. Comme toujours, le filtre furieux posts_clauses
vient en action:
function wpse_alter_posts_search( $pieces )
{
global $wpdb;
// Make the input save
$search_string = like_escape( $_GET['s'] );
// Your new WHERE clause
$where = $wpdb->prepare(
"$wpdb->postmeta.%s LIKE %s",
'YOUR_COLUMN', // Should match your col name 1)
"%{$search_string}%"
);
// Not sure if this exactly the same on your install 2)
$pieces['where'] = str_replace( 'AND (((', "AND ((({$where} ", $pieces['where'] );
return $pieces;
}
add_filter( 'posts_clauses', 'wpse_alter_posts_search' );
REMARQUES
$pieces
pour le consulter avant de modifier la requête (juste après la réception du $search_string
).la réponse de kaiser m'a mis sur la bonne voie, mais je devais rejoindre la table postmeta
et ajouter un groupe également.
Maintenant, like_escape
est $wpdb->esc_like
. Remplacez [your_post_type]
par votre type de message et [your_postmeta_key]
par votre clé méta:
//join postmeta for search
add_filter( 'posts_join' , function($join){
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return $join;
});
//search [your_postmeta_key] for search string
add_filter( 'posts_where', function( $where )
{
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$searchstring = '%' . $wpdb->esc_like( $_GET['s'] ) . '%';
//search [your_postmeta_key] as well
$where .= $wpdb->prepare(" OR ($wpdb->postmeta.meta_key = '[your_postmeta_key]' AND $wpdb->postmeta.meta_value LIKE %s) ", $searchstring);
}
return $where;
});
//group by post ID
add_filter( 'posts_groupby', function ($groupby, $query) {
global $wpdb;
if(is_search() && is_admin() && $_GET['post_type'] == '[your_post_type]')
{
$groupby = "{$wpdb->posts}.ID";
}
return $groupby;
}, 10, 2 );