Получить идентификатор варианта продукта по его парам значений атрибутов продукта в Woocommerce - PullRequest
0 голосов
/ 31 августа 2018

Как я могу получить идентификатор варианта продукта по терминам таксономии?

Например, если у меня есть две таксономии и их термины:

1) Size: medium, large
2) Color: blue, green

И мои варианты продукта:

Variation id 1: medium > blue
Variation id 2: medium > green
Variation id 3: large > blue
Variation id 4: large > green

Я хотел бы получить идентификатор вариации этой комбинации терминов medium > green.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Следующая функция использует очень легкий SQL-запрос для получения идентификатора варианта для переменного продукта для заданных атрибутов продукта «цвет» и «размер» термин «слагы»:

function get_product_variation_id( $size, $color, $product_id = 0 ) {
    global $wpdb;

    if ( $product_id == 0 )
        $product_id = get_the_id();

    return $wpdb->get_var( "
        SELECT p.ID
        FROM {$wpdb->prefix}posts as p
        JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
        JOIN {$wpdb->prefix}postmeta as pm2 ON p.ID = pm2.post_id
        WHERE pm.meta_key = 'attribute_pa_color'
        AND pm.meta_value LIKE '$color'
        AND pm2.meta_key = 'attribute_pa_size'
        AND pm2.meta_value LIKE '$size'
        AND p.post_parent = $product_id
    " );
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


USAGE (2 примера) :

1) Из идентификатора продукта определенной переменной (где 746 - идентификатор продукта родительской переменной):

$variation_id = get_product_variation_id( 'large', 'blue', 746 );

2) На странице отдельного продукта с переменным продуктом (Нет необходимости определять переменный идентификатор продукта) :

$variation_id = get_product_variation_id( 'large', 'blue' );
0 голосов
/ 31 августа 2018

Я не проверял, но это должно быть почти там или готово к отправке.

function get_variation_by($size, $color) {
  $args = array(
    'post_type' => 'product',
    'numberposts' => -1,
  );
  $product_posts = get_posts( $args );

  foreach ( $product_posts as $single_product_post ) {
    $_product = wc_get_product( $single_product_post->ID );
    if ($product_s->product_type != 'variable') continue;

    $avail_vars = $_product->get_available_variations();
    foreach ($avail_vars as $v)
      if ($v["attributes"]["attribute_pa_size"] == $size
          && $v["attributes"]["attribute_pa_color"] == $color)
        return $v;
  }
  return null;
}

$variation = get_variation_by( "large", "green");
$variation_id = $variation->variation_id;

Если у вас уже есть product_id переменной product, вы можете упростить это так:

function get_variation_by($variable_product_id, size, $color) {
  $var_prod = wc_get_product( $variable_product_id );        
  $avail_vars = $var_prod->get_available_variations();

  foreach ($avail_vars as $v)
    if ($v["attributes"]["attribute_pa_size"] == $size
        && $v["attributes"]["attribute_pa_color"] == $color)
      return $v;

  return null;
}
...