星期二 , 15 4 月 2025

(精华)search搜索自定义字段加标题和内容

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