function custom_search_query( $query ) {
if ( !is_admin() && $query->is_search && $query->is_main_query() ) {
// Clean up the search term
$search_term = sanitize_text_field( $query->query_vars['s'] );
// Add meta query to search in the custom fields
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'partnumber', // Custom field partnumber
'value' => $search_term,
'compare' => 'LIKE'
),
array(
'key' => 'oem_num', // Custom field oem_num
'value' => $search_term,
'compare' => 'LIKE'
),
);
// Set the meta query
$query->set( 'meta_query', $meta_query );
// Modify the search in title and content as well
add_filter( 'posts_search', function( $search, $wp_query ) use ( $search_term, $wpdb ) {
if ( empty( $search ) ) return $search;
// Build the search query for custom fields and post title/content
$search .= " OR EXISTS (
SELECT * FROM $wpdb->postmeta
WHERE $wpdb->postmeta.post_id = $wpdb->posts.ID
AND $wpdb->postmeta.meta_key IN ('partnumber', 'oem_num')
AND $wpdb->postmeta.meta_value LIKE '%$search_term%'
)";
return $search;
}, 10, 2 );
}
}
add_action( 'pre_get_posts', 'custom_search_query' );
上面的搜索结果是包含media file的, 也就是直接搜索图片的,如果不希望搜索图片的标题, 可以直接在函数里添加
// Exclude attachments (media files) $query->set( ‘post_type’, array( ‘post’, ‘page’, ‘product’ ) );
能搜索全部字段的功能
function custom_search_query( $query ) {
if ( !is_admin() && $query->is_search && $query->is_main_query() ) {
// Clean up the search term
$search_term = sanitize_text_field( $query->query_vars['s'] );
// Get all custom fields for the current post type
global $wpdb;
// Dynamically retrieve all unique custom field keys
$custom_fields = $wpdb->get_col( $wpdb->prepare(
"SELECT DISTINCT meta_key
FROM $wpdb->postmeta
WHERE meta_key NOT LIKE '\_%'
AND meta_value LIKE %s",
'%' . $wpdb->esc_like( $search_term ) . '%'
) );
// Create meta query dynamically
if ( !empty( $custom_fields ) ) {
$meta_query = array( 'relation' => 'OR' );
foreach ( $custom_fields as $field ) {
$meta_query[] = array(
'key' => $field,
'value' => $search_term,
'compare' => 'LIKE'
);
}
// Set the meta query
$query->set( 'meta_query', $meta_query );
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
}
// Modify the search in title and content as well
add_filter( 'posts_search', function( $search, $wp_query ) use ( $search_term, $wpdb, $custom_fields ) {
if ( empty( $search ) ) return $search;
// Build the search query for custom fields and post title/content
$custom_field_search = " OR EXISTS (
SELECT * FROM $wpdb->postmeta
WHERE $wpdb->postmeta.post_id = $wpdb->posts.ID
AND $wpdb->postmeta.meta_key IN ('" . implode( "', '", array_map( 'esc_sql', $custom_fields ) ) . "')
AND $wpdb->postmeta.meta_value LIKE '%" . esc_sql( $search_term ) . "%'
)";
return $search . $custom_field_search;
}, 10, 2 );
}
}
add_action( 'pre_get_posts', 'custom_search_query' );