Как вывести вариации товара по attributes?
$args = array(
'post_type' => 'product',
'posts_per_page' => 100,
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product;
$args = array(
'post_type' => 'product_variation',
'post_status' => array( 'publish' ),
'numberposts' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
'post_parent' => get_the_ID() // get parent post-ID
);
$variations = get_posts( $args );
foreach ( $variations as $variation ) {
// get variation ID
$variation_ID = $variation->ID;
// get variations meta
$product_variation = new WC_Product_Variation( $variation_ID );
// get variation featured image
$variation_image = $product_variation->get_image();
$variation_link = $product_variation->get_permalink();
//get variation name
$variation_name = $product_variation->get_variation_attributes();
$fasovka = [ 'attribute_pa_paint' => $variation_name [ 'attribute_pa_paint'] ];
if (($variation_name[attribute_pa_scale]=="1-24")&&(strpos($variation_image, '_G_1-18') !== false)) {
echo '<a href="'.$variation_link.'">'.$variation_image.'</a><br>';
}
}
endwhile;
wp_reset_query();
Данный код выводит все вариации товаров.
Но сейчас выводятся вариации с значением атрибута painted и unpainted. Мне нужно выводить только вариации содержащие значение атрибута painted.
Как это правильно сделать?
Атрибут paint имеет в себе значение painted и unpainted
Ответы (1 шт):
Используйте wc_get_products c параметром type => variable - это сократит вам кол-во запросов в несколько раз:
$products = wc_get_products( [
'status' => 'publish',
'limit' => -1,
'type' => 'variable'
] );
Для того, чтобы получить нужный атрибут у WC_Product (также и WC_Variation_Product), есть метод get_attribute( string $name );
$product->get_attribute( 'painted' );
Но, скорее всего, атрибут будет называться pa_painted, т.к. стандартное именование аттрибутов начинается с приставки pa_.
Что касается написания своего запроса, то в нём нет смысла т.к. вам кроме аттрибутов, нужны данные товара. Данные всех аттрибутов будут получены при запросе wc_get_products.
Еще стоит подумать над лимитом. Если действительно задача требует лимита -1, то стоит задуматься над кеширование ваших запросов.
Например:
$products = get_transient( 'my_amazing_variation_products' );
if ( false === $products ) {
$products = wc_get_products( [
'status' => 'publish',
'limit' => -1,
'type' => 'variable'
] );
set_transient( 'my_amazing_variation_products', $products, DAY_IN_SECONDS );
}