Estendi la ricerca di prodotti WooCommerce a tassonomie personalizzate e campi personalizzati

Aug 22 2020

Sto creando una ricerca avanzata per woocommerce e voglio aggiungere sku e product_tag e product_category nella query di ricerca. Di seguito sto usando Abilita tassonomie personalizzate nel codice di risposta per la ricerca di prodotti WooCommerce , che abilita la ricerca di più tassonomie:

add_filter( 'posts_search', 'woocommerce_search_product_tag_extended', 999, 2 );
function woocommerce_search_product_tag_extended( $search, $query ) {
    global $wpdb, $wp;

    $qvars = $wp->query_vars;

    if ( is_admin() || empty($search) || ! ( isset($qvars['s'])
    && isset($qvars['post_type']) && ! empty($qvars['s'])
    && $qvars['post_type'] === 'product' ) ) { return $search;
    }

    // Here set your custom taxonomies in the array
    $taxonomies = array('product_tag', 'product_cat'); $tax_query  = array('relation' => 'OR'); // Initializing tax query

    // Loop through taxonomies to set the tax query
    foreach( $taxonomies as $taxonomy ) {
        $tax_query[] = array( 'taxonomy' => $taxonomy,
            'field'    => 'name',
            'terms'    => esc_attr($qvars['s']), ); } // Get the product Ids $ids = get_posts( array(
        'posts_per_page'  => -1,
        'post_type'       => 'product',
        'post_status'     => 'publish',
        'fields'          => 'ids',
        'tax_query'       => $tax_query, ) ); if ( sizeof( $ids ) > 0 ) {
        $search = str_replace( 'AND (((', "AND ((({$wpdb->posts}.ID IN (" . implode( ',', $ids ) . ")) OR (", $search);
    }
    return $search;
}

Voglio aggiungere anche lo sku del prodotto nella query di ricerca, come aggiungerlo?

Risposte

3 LoicTheAztec Aug 22 2020 at 22:14

Quanto segue estenderà la ricerca del prodotto a più tassonomie (categoria prodotto e tag prodotto) e più campi personalizzati (come SKU qui):

add_filter( 'posts_search', 'woocommerce_search_product_mega_extended', 999, 2 );
function woocommerce_search_product_mega_extended( $search, $query ) {
    global $wpdb, $wp;

    $qvars = $wp->query_vars;

    if ( is_admin() || empty($search) || ! ( isset($qvars['s'])
    && isset($qvars['post_type']) && ! empty($qvars['s'])
    && $qvars['post_type'] === 'product' ) ) { return $search;
    }

    // SETTINGS:
    $taxonomies = array('product_tag', 'product_cat'); // Here set your custom taxonomies in the array $meta_keys  = array('_sku'); // Here set your product meta key(s) in the array

    // Initializing tax query
    $tax_query = count($taxonomies) > 1 ? array('relation' => 'OR') : array();

    // Loop through taxonomies to set the tax query
    foreach( $taxonomies as $taxonomy ) {
        $tax_query[] = array( 'taxonomy' => $taxonomy,
            'field'    => 'name',
            'terms'    => esc_attr($qvars['s']), ); } // Get the product Ids from taxonomy(ies) $tax_query_ids = (array) get_posts( array(
        'posts_per_page'  => -1,
        'post_type'       => 'product',
        'post_status'     => 'publish',
        'fields'          => 'ids',
        'tax_query'       => $tax_query, ) ); // Initializing meta query $meta_query = count($meta_keys) > 1 ? array('relation' => 'OR') : array(); // Loop through taxonomies to set the tax query foreach( $taxonomies as $taxonomy ) { $meta_query[] = array(
            'key'     => '_sku',
            'value'   => esc_attr($qvars['s']), ); } // Get the product Ids from custom field(s) $meta_query_ids = (array) get_posts( array(
        'posts_per_page'  => -1,
        'post_type'       => 'product',
        'post_status'     => 'publish',
        'fields'          => 'ids',
        'meta_query'      => $meta_query, ) ); $product_ids = array_unique( array_merge( $tax_query_ids, $meta_query_ids ) ); // Merge Ids in one array  with unique Ids

    if ( sizeof( $product_ids ) > 0 ) { $search = str_replace( 'AND (((', "AND ((({$wpdb->posts}.ID IN (" . implode( ',', $product_ids ) . ")) OR (", $search); } return $search;
}

Il codice va nel file functions.php del tema figlio attivo (o tema attivo). Testato e funziona.

Correlati: Abilita tassonomie personalizzate nella ricerca di prodotti WooCommerce