WordPress a Woocommerce nativně neumí vyhledávat podle SKU. Řešením je použití nějakého pluginu nebo přidání jednoduché funkce do functions.php
function wc_get_products_ids_and_skus( $sku_excerpt ) { global $wpdb; return $wpdb->get_results( $wpdb->prepare( " SELECT p.ID as id, pm.meta_value as sku FROM {$wpdb->prefix}posts p INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id WHERE ( p.post_type = 'product' OR p.post_type = 'product_variation' ) AND p.post_status = 'publish' AND pm.meta_key = '_sku' AND pm.meta_value LIKE '%s' AND (( SELECT COUNT(*) FROM {$wpdb->prefix}term_relationships tr WHERE object_id = p.ID AND ( tr.term_taxonomy_id = 6 OR tr.term_taxonomy_id = 7 ) ) = 0) ", '%'.$sku_excerpt.'%' ) ); } function search_by_sku( $search, $query_vars ) { global $wpdb; if(isset($query_vars->query['s']) && !empty($query_vars->query['s'])){ $results = wc_get_products_ids_and_skus( $query_vars->query['s'] ); $products_ids = array(); foreach( $results as $result ) { $parent = wp_get_post_parent_id( $result->id ); if ( isset($parent) && $parent > 0 ) { $products_ids[] = $parent; } else { $products_ids[] = $result->id; } } if ( sizeof( $products_ids ) > 0) { $search = str_replace( 'AND (((', "AND ((({$wpdb->posts}.ID IN (" . implode( ',', $products_ids ) . ")) OR (", $search); } // var_dump( $search ); } return $search; } add_filter( 'posts_search', 'search_by_sku', 999, 2 );
Nejprve se funkcí ‘wc_get_products_ids_and_skus’ z databáze vyberou všechny produkty, jejichž SKU obsahuje hledaný řetězec. Rovněž se prohledají i všechny varianty. Funkce vrátí pole s ID všech nalezených produktů. Pokud jde o variantu, funkce vrátí ID rodičovského produktu.
Funkce ‘search_by_sku’ pak provede vlastní úpravu vyhledávacího dotazu. Injektáží do dotazu vloží příslušnou podmínku.
Pozn: původní funkci ‘wc_get_products_ids_and_skus’ jsem nalezl zde. Nicméně byla vadná. Za prvé neuměla prohledávat i varianty produktů. A za druhé, mnohem vážnější problém byl ten, že vracela i produkty nastavené jako skryté, které se nemají zobrazovat ve výsledcích vyhledávání. Tím docházelo ve výsledcích vyhledávání ke zmatečnému stránkování, když na různých stránkách byly různé počty produktů (někde i žádný).