it-swarm.com.de

Wie kann ich die Felder für Administratorsuchposts ändern?

Ich habe einen benutzerdefinierten Beitragstyp, der viele benutzerdefinierte Felder enthält. Ich möchte sie als Suchziel für die Admin-Suche hinzufügen.

Derzeit durchsucht die Administratorsuche nur den Inhalt und den Titel. Ich möchte, dass diese benutzerdefinierten Felder ebenfalls durchsucht werden.

Gibt es eine Möglichkeit, das zu tun?

5
hannit cohen

Es ist möglich, aber Sie müssen ein wenig mit der eigentlichen Abfrage spielen. Wie immer kommt der wütende posts_clauses-Filter zum Einsatz:

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

ANMERKUNGEN

  1. Könnte sein, dass Sie einige Teile unserialisieren müssen, um suchen zu können.
  2. Sie sollten einfach den $pieces ausgeben, um einen Blick darauf zu werfen, bevor Sie die Abfrage ändern (direkt nachdem der $search_string empfangen wurde).
5
kaiser

kaisers antwort brachte mich auf den richtigen weg, aber ich musste mich dem postmeta-tisch anschließen und auch eine gruppe hinzufügen.

Jetzt ist like_escape$wpdb->esc_like. Ersetzen Sie [your_post_type] durch Ihren Beitragstyp und [your_postmeta_key] durch Ihren Metaschlüssel:

//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