Dzisiaj krótki kawałek kodu, który może się przydać osobom posiadającym wielojęzyczne sklepy oparte na WooCommerce i WPML.
Otóż typowy kod zwracający produkt z WooCommerce na bazie jego SKU wygląda następująco:
function get_product_by_sku( $sku ) { global $wpdb; $product_id = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku)); if ($product_id) { return new WC_Product($product_id); } return null; }
Niestety nie uwzględnia on faktu iż WPML dla każdego produktu tworzy oddzielny rekord w tabeli postów, zatem otrzymamy produkty w jednym języku. Na szczęście możemy to naprawić i to w relatywnie prosty sposób, bo wystarczy zmodyfikować zapytanie:
function get_product_by_sku($sku) { global $wpdb; $product_id = $wpdb->get_var($wpdb->prepare("SELECT pm.post_id FROM ".$wpdb->postmeta." AS pm LEFT JOIN ".$wpdb->prefix."icl_translations AS tr ON pm.post_id = tr.element_id WHERE pm.meta_key='_sku' AND pm.meta_value='%s' AND tr.language_code = '".ICL_LANGUAGE_CODE."'", $sku)); if($product_id) { return new WC_Product($product_id); } return null; }
Powyższy kod działa podobnie do poprzedniego tylko podczas zapytania pobierane są dane z tabeli icl_translations, które pozwalają określić język wpisów powiązanych ze zwracanymi ID. Oczywiście najważniejszy jest ostatni warunek, który wybiera tylko ten rekord, który powiązany jest z obecnie wykorzystywanym językiem na stronie.