skip to Main Content

I’ve attempted to use the solution @LoicTheAztec provided in their answer at Enable custom taxonomies in WooCommerce product search

function search_product_by_tag( $search, &$query_vars ) {
    global $wpdb, $pagenow;

    if ( 'edit.php' == $pagenow || empty($search) ) {
        return $search;
    }

    $args = array(
        'posts_per_page'  => -1,
        'post_type'       => 'product',
       'meta_query' => array(
            array(
                'key' => 'taxonomy',
                'value' => 'product_tag',
                'field' => 'name',
                'terms' => array($query_vars->query['s']),
                'compare' => 'LIKE',
    )));
    $posts = get_posts( $args );
    if ( empty( $posts ) ) return $search;
    $get_post_ids = array();
    foreach($posts as $post){
        $get_post_ids[] = $post->ID;
    }
    if ( sizeof( $get_post_ids ) > 0 ) {
        $search = str_replace( 'AND (((', "AND ((({$wpdb->posts}.ID IN (" . implode( ',', $get_post_ids ) . ")) OR (", $search);
    }
    return $search;
}
add_filter( 'posts_search', 'search_product_by_tag', 999, 2 );

However, adding the above snippet to functions.php does not work on the front-end and users cannot search successfully by product_tag.

I’m already using separate snippets to reduce the search to only products and SKUs, using the code below.

function search_by_sku( $search, &$query_vars ) {
    global $wpdb;
    if(isset($query_vars->query['s']) && !empty($query_vars->query['s'])){
        $args = array(
            'posts_per_page'  => -1,
            'post_type'       => 'product',
            'meta_query' => array(
                array(
                    'key' => '_sku',
                    'value' => $query_vars->query['s'],
                    'compare' => 'LIKE'
                )
            )
        );
        $posts = get_posts($args);
        if(empty($posts)) return $search;
        $get_post_ids = array();
        foreach($posts as $post){
            $get_post_ids[] = $post->ID;
        }
        if(sizeof( $get_post_ids ) > 0 ) {
                $search = str_replace( 'AND (((', "AND ((({$wpdb->posts}.ID IN (" . implode( ',', $get_post_ids ) . ")) OR (", $search);
        }
    }
    return $search;
    
}
    add_filter( 'posts_search', 'search_by_sku', 999, 2 );
function searchfilter($query) {

    if ($query->is_search && !is_admin() ) {
        $query->set('post_type',array('product'));
        $query->set('posts_per_page',12);
    }

return $query;
}

add_filter('pre_get_posts','searchfilter');

Could these be causing a conflict?

2

Answers


  1. I see your code has the following information

        'posts_per_page'  => -1,
    

    as well as on another line there is the following code:

     if ( sizeof( $get_post_ids ) > 0 ) {
    

    check this too

    check this data and try again…

    Enable DEBUG and post error log, ok

    Login or Signup to reply.
  2. str_replace( ‘AND (((‘, "AND ((({$wpdb->posts}.ID IN (" . implode( ‘,’, $get_post_ids ) . ")) OR (", $search);

    here must be some ‘ or " missing.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search