web-dev-qa-db-fra.com

Comment puis-je modifier les champs des publications de recherche admin?

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 ?

5
hannit cohen

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

  1. Il se peut que vous deviez désérialiser certaines pièces pour pouvoir effectuer une recherche.
  2. Vous feriez mieux de simplement vider le $pieces pour le consulter avant de modifier la requête (juste après la réception du $search_string).
5
kaiser

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 );
0
jordan314