2017-02-20 15 views
4

In WooCommerce использовать код, приведенный ниже, чтобы добавить пользовательские метки после того, как цены на продукции в простом и переменных продуктах:Переменная селекторы продукта: Получение живых выбранных значений

add_filter('woocommerce_variation_price_html','prices_custom_labels', 10, 2 ); 
add_filter('woocommerce_price_html','prices_custom_labels', 10, 2); 
function prices_custom_labels($price, $product){ 

    // Set HERE your custom labels names 
    $per_dozen = ' '. __('per dozen', 'woocommerce'); 
    $per_case = ' '. __('per case (20 dozens)', 'woocommerce'); 


    // 1) Variable products 
    if ($product->product_type != 'simple' && $product->variation_id) { 

     // Getting the array of existing attributes values for a variation 
     $variation_attribute_value = $product->variation_data; 
     // Here we keep only the last value in this array 
     $last_variation_attribute_slug_value = ' ' . end($variation_attribute_value); 

     // Finding the word 'case' in the attribute value slug 
     $has_case = strstr($last_variation_attribute_slug_value, 'case'); 

     // Setting the right displayed label depending on attribute value slug 
     if($has_case) 
      $attribute_quantity_name_value = $per_case; 
     else 
      $attribute_quantity_name_value = $per_dozen; 

     // Here the output price + custom label 
     $price = '<ins class="highlight">'.woocommerce_price($product- >regular_price).$attribute_quantity_name_value.'</ins>'; 
    } 
    // 2) Simple products 
    else 
    { 
     // Here the output price + custom default label 
     $price = '<ins class="highlight">'.woocommerce_price($product- >regular_price).$per_dozen.'</ins>'; 
    } 
    return $price; 
} 

Но в переменных продуктах, у меня есть проблема с добавленный пользовательский ярлык в текущей отображаемой цене. Код, который я использую, отображается только после текущей цены «на дюжину».

мне нужно будет получить выбранное значение на «количество» пользовательского выбора, чтобы добавить правильную метку после того как цена:

  • Если выбрано значение «Дюжина» Мне нужно отобразить после живой цены " на дюжину ",
  • Если выбранное значение -« Дело (20 дюжин) «Мне нужно отобразить после реальной цены» в каждом случае (20 дюжин) ».

Этот скриншот, что я на самом деле во всех случаях:

enter image description here

Проверить этот вопрос на моем веб-сайте specific product page

Так что я должен был бы получить атрибут «количество «выбранное значение, чтобы добавить правую метку к текущей цене.

Любая помощь? Как я могу это сделать?

Я пробовал много кода, и я не могу заставить его работать.

+0

Невозможно открыть ссылку! – Smit

+0

Просто открыт без проблем .. Какую ошибку вы получите? Попробуй еще раз. – Dora

ответ

6

Единственный способ получить эту работу, является использование JavaScript/JQuery, но это сложно поскольку WooCommerce уже запускает на нем некоторый код Javascript/Ajax.

Во-первых, Не возможно обнаружить выбранный выбор клиента на селекторы как WooCommerce удалить "selected" атрибут из <option> HTML-теги.

После того, как клиент должен сделать полный выбор (так выбрал одну вариации от этого переменного продукта), WooCommerce добавить соответствующее значение вариации ID в скрытые <imput> HTML поля и отображать соответствующую цену.

Наш РНР код пропуск JavaScript массив идентификаторов вариаций для этого переменного продукта, с соответствующим значением «количество» атрибут для каждого из них.

Тогда мы можем использовать «на размытость» событий JavaScript на <select> HTML-теги получить, что скрытое значение variation ID, а затем добавить цену с правой «ярлык».

Вот что функциональный код, который будет добавлять пользовательские метки к живой цене в зависимости от выбора клиента (так выбранного изменения продукта):

add_action('woocommerce_after_add_to_cart_form', 'custom_get_variations_js'); 
function custom_get_variations_js() { 
    global $product; 

    // Set HERE your "quantity" attribute slug 
    $attribute_qty_slug = 'pa_quantity'; 
    $attribute_qty_slug_key = 'attribute_'.$attribute_qty_slug; 

    foreach($product->get_available_variations() as $values){ 
     $attribute_qty_slug_value = $values['attributes'][$attribute_qty_slug_key]; 
     $attribute_qty_name_value = get_term_by('slug', $attribute_qty_slug_value, $attribute_qty_slug); 
     $variations_id_arr[$values['variation_id']] = __(' per ', 'woocommerce') . strtolower($attribute_qty_name_value->name); 
    } 

    ## THE JQUERY SCRIPT ## 
    ?> 
    <script> 
     (function($){ 
      var $attributes; 
      <?php 
       // Passing the product variations attributes array to javascript 
       $js_array = json_encode($variations_id_arr); 
       echo 'var $variationsIdsAttr = '. $js_array ; 
      ?> 
      $('td.value select').blur(function() { 
       var $variationId = $('input[name="variation_id"]').val(); 
       if (typeof $variationId !== 'undefined'){ 
        for(key in $variationsIdsAttr){ 
         if(key == $variationId){ 
          $attributes = $variationsIdsAttr[key]; 
          break; 
         } 
        } 
       } 
       if (typeof $attributes !== 'undefined'){ 
        $('.woocommerce-variation-price .woocommerce-Price-amount.amount').append($attributes); 
       } 
      }); 
     })(jQuery); 
    </script> 
    <?php 
} 

Затем нам нужно изменить свой существующий код, чтобы избежать отображений вторых пользовательские меток на этой специфике переменных продуктов (в первую крючковатой функцию):

add_filter('woocommerce_variation_price_html','prices_custom_labels', 10, 2); 
add_filter('woocommerce_price_html','prices_custom_labels', 10, 2); 
function prices_custom_labels($price, $product){ 

    // Custom label name 
    $per_dozen = ' '. __('per dozen', 'woocommerce'); 

    // Set HERE your "quantity" attribute slug 
    $attribute_qty_slug = 'pa_quantity'; 

    $attribute_qty_slug_key = 'attribute_'.$attribute_qty_slug; 
    $append_label = ''; 

    // 1) Variable products 
    if ($product->product_type != 'simple' && $product->variation_id) { 

     // Getting the attribute "quantity" value 
     $attribute_qty_is_set = $product->variation_data[$attribute_qty_slug_key]; 
     echo '<pre>'; print_r($product->variation_data[$attribute_qty_slug_key]); echo '</pre>'; 

     // if "quantity" not set we display " per dozen" 
     if(! $attribute_qty_is_set) 
      $append_label = $per_dozen; 


     // Outputed price + custom label 
     $price = '<ins class="highlight">'.woocommerce_price($product->regular_price).$append_label.'</ins>'; 
    } 
    // 2) Simple products 
    else 
    { 
     // Here the output price + custom default label 
     $price = '<ins class="highlight">'.woocommerce_price($product->regular_price).$per_dozen.'</ins>'; 
    } 
    return $price; 
} 

add_filter('woocommerce_variable_price_html', 'prices_custom_labels_min_max', 20, 2); 
function prices_custom_labels_min_max($price, $product) { 

    // Custom label name 
    $per_dozen = ' '. __('per dozen', 'woocommerce'); 
    $per_case = ' '. __('per case', 'woocommerce'); 

    // Set HERE your quantity attribute slug 
    $attribute_qty_slug = 'pa_quantity'; 


    // Getting the min and max variations prices 
    $variation_min_reg_price = $product->get_variation_regular_price('min', true); 
    $variation_max_reg_price = $product->get_variation_regular_price('max', true); 
    $variation_reg_price = $product->get_variation_regular_price(); 


    if($variation_min_reg_price == $variation_max_reg_price) 
    { 
     $price = '<ins class="highlight">'.woocommerce_price($variation_reg_price) . $per_dozen . '</ins>'; 
    } 
    else 
    { 
     if(!in_array($attribute_qty_slug, array_keys($product->get_attributes()))) 
     { 
      $price = '<ins class="highlight">' . woocommerce_price($variation_min_reg_price) . $per_dozen . ' - ' . woocommerce_price($variation_max_reg_price) . $per_dozen . '</ins>'; 
     } 
     else 
     { 
      $price = '<ins class="highlight">' . woocommerce_price($variation_min_reg_price) . $per_dozen . ' - ' . woocommerce_price($variation_max_reg_price) . $per_case . '</ins>'; 
     } 
    } 
    // print_r($product->get_attributes()); 
    return $price; 
} 

код идет в functi on.php файла вашей активной дочерней темы (или темы), а также в любом файле плагина.


Связанные ответ:

1

Это не должно быть «case», оно должно «Case», strstr - это чувствительная к регистру функция, и поскольку она является логической, нижняя статута всегда возвращает false. Поскольку значения в селекторе убраны Case (20 dozens) не case (20 dozens) См. Ссылку ниже, чтобы узнать больше.

Таким образом изменить строку ниже:

$has_case = strstr($last_variation_attribute_slug_value, 'case'); 

к:

$has_case = strstr($last_variation_attribute_slug_value, 'Case'); 

исх: https://www.w3schools.com/php/func_string_strstr.asp

+0

Это делает магию. Большое большое спасибо ! – Dora

+0

Я следил за вашими инструкциями, но для некоторых продуктов я показываю «каждый случай», но для этого продукта у меня нет варианта с именем «Дело»? Как можно показать мне «за случай» в цене, когда у меня нет изменений в продукте? Например: http://www.wholesaleunderwear.co/product/rose-ladys-lace-boyshort-4/ Но этот продукт не имеет «Case» как вариант. http://i.imgur.com/WiuNnyZ.png?1 – Dora

+0

В настоящее время он показывает по дюжине. правильно? но вы хотите показать в каждом случае? – Smit