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?
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
$pieces
ausgeben, um einen Blick darauf zu werfen, bevor Sie die Abfrage ändern (direkt nachdem der $search_string
empfangen wurde).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 );