wp_create_nonce( 'botiga-ajax-search-random-nonce' ), 'query_args' => array( 'posts_per_page' => apply_filters( 'botiga_shop_ajax_search_posts_per_page', $posts_per_page ), 'order' => apply_filters( 'botiga_shop_ajax_search_order', $order ), 'orderby' => apply_filters( 'botiga_shop_ajax_search_orderby', $orderby ), 'show_categories' => apply_filters( 'botiga_shop_ajax_search_show_categories', $show_categories ), 'enable_search_by_sku' => apply_filters( 'botiga_shop_ajax_search_enable_search_by_sku', $enable_search_by_sku ), ) ) ); } } add_action( 'wp_enqueue_scripts', 'botiga_enqueue_ajax_search_css_and_js', 11 ); /** * Ajax Search Callback * */ function botiga_ajax_search_callback() { check_ajax_referer( 'botiga-ajax-search-random-nonce', 'nonce' ); $search_term = isset( $_POST['search_term'] ) ? apply_filters( 'botiga_ajax_search_search_term', sanitize_text_field( wp_unslash( $_POST['search_term'] ) ) ) : ''; $posts_per_page = isset( $_POST['posts_per_page'] ) ? absint( $_POST['posts_per_page'] ) : 15; $order = isset( $_POST['order'] ) ? sanitize_text_field( wp_unslash( $_POST['order'] ) ) : 'asc'; $orderby = isset( $_POST['orderby'] ) ? sanitize_text_field( wp_unslash( $_POST['orderby'] ) ) : 'title'; $enable_search_by_sku = isset( $_POST['enable_search_by_sku'] ) && sanitize_text_field( wp_unslash( $_POST['enable_search_by_sku'] ) ) ? true : false; $see_all_button = get_theme_mod( 'shop_search_ajax_display_see_all', 0 ); $args = array( 'post_type' => 'product', 'posts_per_page' => $posts_per_page, 's' => $search_term, 'order' => $order, 'orderby' => $orderby, 'post_status' => array( 'publish' ) ); if( $orderby === 'price' ) { $args[ 'meta_key' ] = '_price'; $args[ 'orderby' ] = 'meta_value_num'; } $output = ''; $qry = new WP_Query( $args ); // Enable search by SKU if( $enable_search_by_sku ) { $qry->posts = array_unique( array_merge( $qry->posts, botiga_ajax_search_get_products_by_sku( $posts_per_page, $order, $orderby, $search_term ) ), SORT_REGULAR ); $qry->post_count = count( $qry->posts ); } if( $qry->have_posts() ) : $output .= '
'. esc_html__( 'No products found.', 'botiga' ) .'
'; wp_send_json( array( 'status' => 'success', 'type' => 'no-results', 'output' => wp_kses_post( $output ) ) ); } } add_action('wp_ajax_botiga_ajax_search_callback', 'botiga_ajax_search_callback'); add_action('wp_ajax_nopriv_botiga_ajax_search_callback', 'botiga_ajax_search_callback'); /** * Get products by SKU. * */ function botiga_ajax_search_get_products_by_sku( $posts_per_page, $order, $orderby, $search_term ) { $args = array( 'post_type' => array( 'product', 'product_variation' ), 'posts_per_page' => $posts_per_page, 'order' => $order, 'orderby' => $orderby, 'post_status' => array( 'publish' ), 'meta_query' => array( 'relation' => 'OR', array( 'key' => '_sku', 'value' => $search_term, 'compare' => 'LIKE' ) ) ); if( $orderby === 'price' ) { $args[ 'meta_key' ] = '_price'; $args[ 'orderby' ] = 'meta_value_num'; } $qry_sku = new WP_Query( $args ); return $qry_sku->posts; } /** * Include the search by SKU in the default search. * */ function botiga_merge_sku_search_with_default_search( $posts, $query ) { $posts_per_page = get_theme_mod( 'shop_search_ajax_posts_per_page', 15 ); $order = get_theme_mod( 'shop_search_ajax_order', 'asc' ); $orderby = get_theme_mod( 'shop_search_ajax_orderby', 'none' ); $enable_search_by_sku = get_theme_mod( 'shop_search_ajax_enable_search_by_sku', 0 ); if( ! $enable_search_by_sku ) { return $posts; } if ( $query->is_main_query() && $query->is_search() && $query->get( 'post_type' ) === 'product' && $query->get( 's' ) !== '' ) { $additional_posts = botiga_ajax_search_get_products_by_sku( $posts_per_page, $order, $orderby, $query->get( 's' ) ); $merged_posts = array_unique( array_merge( $posts, $additional_posts ), SORT_REGULAR ); $query->posts = $merged_posts; $query->post_count = count( $merged_posts ); $query->found_posts = count( $merged_posts ); $query->max_num_pages = ceil( count( $merged_posts ) / $query->get( 'posts_per_page' ) ); return $merged_posts; } return $posts; } add_filter( 'posts_results', 'botiga_merge_sku_search_with_default_search', 10, 2 ); /** * Custom CSS * */ function botiga_ajax_search_custom_css( $css ) { $shop_ajax_search = get_theme_mod( 'shop_search_enable_ajax', 0 ); if( ! $shop_ajax_search ) { return $css; } $css .= Botiga_Custom_CSS::get_border_color_rgba_css( 'color_body_text', '#212121', '.botiga-ajax-search__wrapper ,.botiga-ajax-search__item+.botiga-ajax-search__item:before', '0.1', true ); $css .= Botiga_Custom_CSS::get_background_color_rgba_css( 'color_body_text', '#212121', '.botiga-ajax-search__divider', '0.1', true ); return $css; } add_filter( 'botiga_custom_css_output', 'botiga_ajax_search_custom_css' );