Richard Polák logo

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ý).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

17 − 6 =

uděluji souhlas se zpracováním mých osobních údajů (jméno, e-mail) za účelem odpovědi na můj dotaz, zaslaný prostřednictvím kontaktního formuláře umístěného na webových stránkách správce.

 

Souhlas

Udělením tohoto souhlasu se zpracováním osobních údajů poskytujete souhlas k tomu, aby Richard Polák, Příčná 593, 330 08 Zruč-Senec (dále jako „správce“) zpracovávala Vaše osobní údaje poskytnuté na základě tohoto souhlasu dle dále uvedených podmínek.

 

Rozsah zpracování Vašich osobních údajů

Správce bude na základě tohoto souhlasu zpracovávat Vaše jméno a e-mail, a to za dále uvedeným účelem.

 

Účel zpracování Vašich osobních údajů

Správce bude Vaše osobní údaje poskytnuté na základě tohoto souhlasu zpracovávat za účelem evidence a zpracování odpovědi na položený dotaz, zaslaný prostřednictvím kontaktního formuláře umístěného na webových stránkách správce.

 

Právní základ zpracování osobních údajů

Právním základem zpracování je tento Váš souhlas. Vaše Osobní údaje jsou zpracovávány v souladu s Obecným nařízením o ochraně osobních údajů – Nařízením Evropského parlamentu a rady (EU) 2016/679 ze dne 27.4.2016 – (dále jako „GDPR“).

 

Doba, po níž budou Vaše osobní údaje zpracovávány

Správce bude Vaše osobní údaje zpracovávat po dobu nezbytně nutnou, maximálně však 5 let ode dne odeslání formuláře, pokud tento souhlas neodvoláte dříve.

 

Odvolání souhlasu se zpracováním osobních údajů

Tento Váš dobrovolně udělený souhlas se zpracováním osobních údajů můžete kdykoli bezplatně odvolat, a to prostřednictvím zaslání e-mailu na adresu: mail@richardpolak.cz
Odvoláním souhlasu není dotčena zákonnost zpracování vycházejícího ze souhlasu, který byl dán před jeho odvoláním.

 

Osoby s přístupem k Vaším osobním údajům

K Vašim osobním údajům bude mít přístup správce.

 

Kontaktní údaje správce

Správce můžete kontaktovat na e-mailu: mail@richardpolak.cz či písemně na adrese provozovny správce (Richard Polák, Příčná 593, 330 08 Zruč-Senec, Česká republika). Správce je oprávněn požadovat prokázání Vaší totožnosti za účelem zamezení přístupu neoprávněným osobám k Vašim osobním údajům.

 

Vaše práva související s ochranou Vašich osobních údajů

Máte právo kdykoliv odvolat svůj souhlas, opravit či doplnit osobní údaje, požadovat omezení zpracování, vznést námitku či stížnost proti zpracování osobních údajů, požadovat přenesení údajů, přístupu ke svým osobním údajům, být informován o porušení zabezpečení osobních údajů, výmazu a další práva stanovená v GDPR.

 

Právo podat stížnost u dozorového úřadu

Kdykoliv můžete podat stížnost týkající se zpracování Vašich osobních údajů nebo neplnění povinností správce plynoucích z GDPR k dozorovému úřadu – Úřad pro ochranu osobních údajů, se sídlem Pplk. Sochora 27, 170 00 Praha 7, www.uoou.cz.

 

Povinnost poskytnout osobní údaje. Následky neposkytnutí osobních údajů

Vaše osobní údaje poskytujete zcela dobrovolně. Nemáte žádnou povinnost je poskytnout. V případě, že Vaše osobní údaje neposkytnete, nehrozí Vám žádná sankce.

Skip to content