• Пытался разобраться сам, но не все могу понять.
    Версия плагина 1.0.0. я так понимаю последняя и содержит большинство классных и полезных доработок, но нет пояснений какие можно параметры дописывать к опциям, чтобы упростить работу.
    – Интересует как копировать те же или похожие параметры в продукт, не переписывая его каждый раз(и не делая дубликаты продукта). Вижу в доработках эти функции, но нет общего списка добавочных функций с объяснением для чего они.
    – Вычитал что можно css использовать, но не понял как.
    – Так же нужна функция импорта, но не смог по примерам разобраться.
    – В благодарности к плагину я просил возможность выбора отображения None(Нет).
    Например мне нужно предложить упаковку, опция выбора НЕТ(не нужна упаковка) и ДА(нужна упаковка), то есть НЕТ как бы по умолчанию и если НЕТ, то и отмечать её не нужно и сама кнопка выбора не нужна. То есть по факту только одна кнопка ДА с возможностью отметить.
    Спасибо.

Viewing 12 replies - 1 through 12 (of 12 total)
  • Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    >как копировать те же или похожие параметры в продукт
    If many products have the same options you can use the “Option templates” feature:
    https://hottons.com/po_modifications

    >нет общего списка добавочных функций
    Provide an example or a screenshot of what you need.

    Don’t forget that it is a?free plugin.
    And most of modifications are just an idea of how to do it.
    Without support from my side.

    >функция импорта
    There is a separate plugin to import/export product options:
    https://www.ads-software.com/plugins/pofw-csv-export-import/
    It adds “Product Options” field to the woocommerce CSV product import feature.

    > только одна кнопка ДА с возможностью отметить
    You can use the checkbox option type instead of radio button.

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Приветствую.
    Благодарю за ответы.

    – “If many products have the same options you can use the “Option templates” feature:”
    – “Provide an example or a screenshot of what you need.”

    Да, я понял что есть функция, но не понимаю как правильно ею воспользоваться, так как скриншоты в примере непонятные. Если была бы возможность видео на примере одного продукта, с действиями, то думаю вопросы бы отпали.

    Что имею ввиду.
    Функция Extra option field – она есть, но как её включить не могу понять.
    Функция Option templates – есть, но по скриншотам не могу понять, как её включить?
    Была бы инструкция(может быть видео), по каждой функции палгина, на одном примере продукта – было бы все понятно.
    Получается, что функции есть, но как ими воспользоваться правильно, понимает только автор плагина или я на столько туповат.

    -” Don’t forget that it is a free plugin.
    And most of modifications are just an idea of how to do it.
    Without support from my side. ”
    Это понятно. И огромное спасибо вам за этот плагин. По скольку вы стараетесь поддерживать своими ответами, то вам еще интересно свое создание, ведь оно действительно очень полезное.

    -“You can use the checkbox option type instead of radio button.” – Точно! Я об этом не подумал, спасибо. Это в корне меняет дело.

    Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    >Функция Option templates – есть, но по скриншотам не могу понять, как её включить

    1) You should download the modification and unzip it on your computer.
    It contains a .txt file with instructions of how to apply the modification.

    2) You should modify the files:
    wp-content/plugins/product-options-for-woocommerce/Model/Option.php
    lines 10, 24, 27-30, 44-61, 68-104

    wp-content/plugins/product-options-for-woocommerce/Block/Adminhtml/Product/Edit/Tab/CustomOptions/Options.php
    line 31

    3) You should add a product option with a special title.
    The title of that option should contain a special parameter ” | use_pr ” with SKU of another product.
    Example:

    | use_pr FR-324

    So that instead of this option will be loaded and displayed options of another product with SKU “FR-324”.

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Привет.
    Спасибо за ответы.
    Возникает тогда вопрос:” download the Product Options 1.0.0 plugin with all files modified” А у меня именно эта версия и я пробую – все ломается.
    Попробовал использовать опцию “”Select Options” instead of “Add to Cart” on the category page.” все работает.
    Решил использовать опцию “Absolute price” – не работает. Просто к базовой цене прибавляет цену, которой должна была заменить. Все смотрел инструкцию и скриншоты. Пришлось вернуть все назад.
    Сейчас не работает замена стоимости если выбрано не 1, а 2 или 3 и. т.д. Но в заказе все отображается корректно.
    Если я не утомил еще, возможно дождусь помощи. ??

    Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    I forgot to say that the modifications are for developers.
    And most of them are not compatible with each other.

    So apply just the most important for you.

    Also I cannot talk about multiple problems at the same time.
    Let us fix the first one and then we will continue with the next feature or problem.

    >Product Options 1.0.0 plugin with all files modified

    Yes this version contains all the files already modified. So you can install and try the new feature.
    But you still need to download and unzip the modified files on your computer.
    Because it contains a .txt file with instructions of how to use the modification.

    > все ломается
    Provide more details or a screenshot.

    > не работает замена стоимости если выбрано не 1, а 2 или 3 и
    It is most common problem of this plugin. Javascript code cannot find the HTML tag of the product price.

    Provide a link to the page where I can see it. Or send it to my email [email protected]

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Благодарю за столь быстрый ответ.
    Я сравнил исходный файл плагина и дополнительной функции – да, нужно добавлять, то что сказали. Просто я поверил, что в версии 1.0.0. се уже дополнено – отсюда и непонимание.
    В общем, товар который я создал и все тестирую находится здесь
    https://postelnoe.top/katalog_tovarov/postelnoe-bele/komplekt-postelnogo-belya-viva/
    Все остальное это демо самой темы. Я его как бы оформляю к покупке и все смотрю. Страница товара/корзина/страница оформления заказа.
    Кстати если будете смотреть, то обратите внимание на выезжающую корзину и отображение в ней вариаций товара – можете что то посоветовать?
    Благодарю заранее.
    PS: если вас редиректид на другую страницу (вы поймете) – используйте VPN
    это причуды моего хостинга.

    Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    > что в версии 1.0.0. се уже дополнено
    I have just corrected it.
    Just there is a problem to download it.
    The old and the new file have the same link so an old cached .zip file is downloaded. You if you also have this problem you can use another browser or add some parameter to the download URL like:
    pofw_1.0.0_with_option_templates.zip?a=1

    The new correct modified version contains the words:
    “Applied modifications: option_templates”

    in the file:
    wp-content/plugins/product-options-for-woocommerce/product-options-for-woocommerce.php

    >товар который я создал и все тестирую находится здесь
    I see the price is updated correctly for your product.

    > обратите внимание на выезжающую корзину и отображение в ней вариаций товара

    I have just basic knowledge in CSS styles.
    So I cannot help you much with it.

    You can try to replace:

    
    .woocommerce td.product-name dl.variation dt{float:left;clear:both;
    

    with:

    
    .woocommerce td.product-name dl.variation dt{clear:both;
    

    in the file:
    wp-content/plugins/woocommerce/assets/css/woocommerce.css

    Then refresh the updated file in your browser cache.

    So that it will not display the option title and the selected option value in one line.

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Спасибо за участие.
    Вот что я имел ввиду

    https://youtu.be/vQ88Fd71CwU

    Если нет решения, то я уже готов с этим смириться, главное что далее все хорошо.

    С плагином и добавлением в него модификаций я понял, что нужно просто сравнивать файлы и добавлять если нужно.
    Вот что я уже реализовал:
    1. display_Select_Options_on_cat_page_if_product_has_required
    2. Pre-select drop-down options

    Это хотел бы реализовать:
    1. Option templates (100%.)
    2. Absolute price (50/50)
    3. CSV export-import (не уверен)
    Совместимы ли все эти функции в одном плагине или нужно экспериментировать?

    Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    >Если нет решения, то я уже готов с этим смириться

    I see in your video the item price in the mini cart does not contain the selected options price.

    Try to update the file:
    wp-content/plugins/product-options-for-woocommerce/Model/Observer.php
    modified lines 15-17, 94-145

    <?php
    if (!defined('ABSPATH')) exit;
    
    class Pektsekye_ProductOptions_Model_Observer {  
    
      protected $_productOptions = array();          
      protected $_poPriceAdded = array(); 
                    
          
      public function __construct(){
        add_action('woocommerce_add_to_cart_validation', array($this, 'validate_selected_options'), 10, 2); 
        add_action('woocommerce_add_cart_item_data', array($this, 'save_selected_options'), 10, 2);    
        add_filter('woocommerce_get_item_data', array($this, 'display_selected_options_on_checkout'), 10, 2);
        add_action('woocommerce_new_order_item', array($this, 'display_selected_options_with_order_info'), 1, 3);  
       // add_action('woocommerce_before_calculate_totals', array($this, 'add_option_price_on_checkout'), 99);	
        add_filter('woocommerce_add_cart_item',  array($this, 'add_option_price_on_checkout'), 99);
     	  add_filter('woocommerce_get_cart_item_from_session', array($this, 'add_option_price_on_checkout'), 99);    
    		add_action('delete_post', array($this, 'delete_post'));    	          		
      }	
    
      public function getOptionModel(){
        include_once(Pektsekye_PO()->getPluginPath() . 'Model/Option.php');		
        return new Pektsekye_ProductOptions_Model_Option();    
      }  
      
      
      public function getProductOptions($productId){
        if (!isset($this->_productOptions[$productId])){    
          $this->_productOptions[$productId] = $this->getOptionModel()->getProductOptions($productId);
        }
        return $this->_productOptions[$productId];
      }
    
      public function validate_selected_options($isValid, $productId){
             
        if (!$isValid){
          return false;    
        }
        
        foreach ($this->getProductOptions($productId) as $option){
          $oId = (int) $option['option_id'];      
          if ($option['required'] == 1 && (empty($_POST['pofw_option'][$oId]) || (is_array($_POST['pofw_option'][$oId]) && $_POST['pofw_option'][$oId][0] == ''))){                     
            $isValid = false;
            wc_add_notice(__('Please specify the product required option(s).', 'product-options-for-woocommerce' ), 'error');
            break;       
          }              											                                                    
        }  
          
        return $isValid;
      }
    
      public function save_selected_options($cart_item_data, $product_id){ 
        if (isset($_POST['pofw_option'])) {   
          $optionValues = (array) $_POST['pofw_option'];
          foreach($optionValues as $oId => $value){
            if (is_array($value)){
              $value = array_map('intval', $value);
            } elseif (ctype_digit($value)){
              $value = (int) $value;
            } else {
              $value = sanitize_textarea_field(stripslashes($value));
            }
            $cart_item_data['pofw_option'][$oId] = $value;        
          }
        }
        return $cart_item_data;
      }
    
      public function display_selected_options_on_checkout($cart_data, $cart_item){
        
        $custom_items = array(); 
        if (isset($cart_item['pofw_option'])) {
          $custom_items = $this->formatSelectedValues($cart_item['product_id'], $cart_item['pofw_option']);
        }
      
        return array_merge((array)$cart_data, $custom_items);
      }
    
      public function display_selected_options_with_order_info($item_id, $values, $cart_item_key){
        if (isset($values->legacy_values['pofw_option'])){   
          $selectedValues = $this->formatSelectedValues($values->legacy_values['product_id'], $values->legacy_values['pofw_option']);      
          foreach ($selectedValues as $value){
            wc_add_order_item_meta($item_id, $value['name'], $value['value']);
          }
        }
      }
    
      public function add_option_price_on_checkout($citem){
        $key = $citem['key'];
        
        if (!isset($citem['pofw_option']) || isset($this->_poPriceAdded[$key]))
          return $citem;
           
        $selectedValues = $citem['pofw_option'];
                 
        $productId = $citem["product_id"];
        
        $_product = wc_get_product($productId);
    
        $orgPrice = $citem["data"]->get_price();//$_product->get_price();
        
        $optionPrice = 0;
        
        foreach ($this->getProductOptions($productId) as $oId => $option){
          if (!isset($selectedValues[$oId])){
            continue;
          }
    
          $selectedValue = $selectedValues[$oId];
          
          if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
            if (is_array($selectedValue)){
              continue;
            }
            $vId = (int) $selectedValue;
            if (isset($option['values'][$vId])){
              $optionPrice += (float) $option['values'][$vId]['price'];
            }
          } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
            foreach ((array) $selectedValue as $vId){
              if (isset($option['values'][$vId])){
                $optionPrice += (float) $option['values'][$vId]['price'];
              }            
            }          
          } elseif ($option['type'] == 'field' || $option['type'] == 'area' || $option['type'] == 'file'){
            if (is_array($selectedValue)){
              continue;
            }
            $optionPrice += (float) $option['price'];
          }
                                                                                                      
        }
        
    
        $citem["data"]->set_price($orgPrice + $optionPrice);
        $this->_poPriceAdded[$key] = 1;     
      
        return $citem; 
      }
      
    
      public function formatSelectedValues($productId, $selectedValues){
        
        $formatedValues = array();
    
        foreach ($this->getProductOptions($productId) as $oId => $option){
          if (!isset($selectedValues[$oId])){
            continue;
          }
    
          $selectedValue = $selectedValues[$oId];
          
          $value = '';        
          if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
            if (is_array($selectedValue)){
              continue;
            }
            $vId = (int) $selectedValue;
            if (isset($option['values'][$vId])){
              $value = $option['values'][$vId]['title'];
            }
          } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
            foreach ((array) $selectedValue as $vId){
              if (isset($option['values'][$vId])){
                $value .= ($value != '' ? ', ' : '') . $option['values'][$vId]['title'];
              }            
            }          
          } elseif ($option['type'] == 'field' || $option['type'] == 'area'){
            if (is_array($selectedValue)){
              continue;
            }
            $value = $selectedValue;
          }
          
          if ($value != ''){
            $formatedValues[] = array("name" => $option['title'], "value" => $value);
          }                      											                                                    
        }
        
        return $formatedValues;    
      }  
    
    		
    	public function delete_post($id){
    		if (!current_user_can('delete_posts') || !$id || get_post_type($id) != 'product'){
    			return;
    		}
        $this->getOptionModel()->deleteProductOptions($id);
    	}		
    		
    }
    

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Я прошу меня простить, но я уже запутался с добавлениями.
    И часто уже выдает ошибку при активации плагина.
    Вот моя версия файла /product-options-for-woocommerce/Model/Observer.php

    Можете поменять ? Ну или пусть будет как есть.

    <?php
    if (!defined('ABSPATH')) exit;
    
    class Pektsekye_ProductOptions_Model_Observer {  
    
      protected $_productOptions = array();          
      protected $_poPriceAdded = array(); 
                    
      protected $_hasRequired = array();
    	
      public function __construct(){
        add_action('woocommerce_add_to_cart_validation', array($this, 'validate_selected_options'), 10, 2); 
        add_action('woocommerce_add_cart_item_data', array($this, 'save_selected_options'), 10, 2);    
        add_filter('woocommerce_get_item_data', array($this, 'display_selected_options_on_checkout'), 10, 2);
        add_action('woocommerce_new_order_item', array($this, 'display_selected_options_with_order_info'), 1, 3);  
        add_action('woocommerce_before_calculate_totals', array($this, 'add_option_price_on_checkout'), 99);	
    		add_action('delete_post', array($this, 'delete_post'));    	
            add_filter('woocommerce_product_add_to_cart_url', array($this, 'product_add_to_cart_url') , 10, 2);
    		add_filter('woocommerce_product_supports', array($this, 'product_supports') , 10, 3);
    		add_filter('woocommerce_product_add_to_cart_text', array($this, 'product_add_to_cart_text') , 10, 2);   		
      }	
    
     public function productHasRequired($productId){  
        if (!isset($this->_hasRequired[$productId])){     
          $hasRequired = false; 
          foreach ($this->getProductOptions($productId) as $option){      
            if ($option['required'] == 1){   
              $hasRequired = true;      
              break;           
            }              											                                                    
          }
          $this->_hasRequired[$productId] = $hasRequired;
        }
        return $this->_hasRequired[$productId];
      }
    
      public function product_add_to_cart_url($url, $inst){
        return $this->productHasRequired($inst->get_id()) ? get_permalink($inst->get_id()) : $url;    
      }
    
      public function product_supports($supports, $feature, $inst){
        return $feature == 'ajax_add_to_cart' ? !$this->productHasRequired($inst->get_id()) : $supports;    
      }
      
      public function product_add_to_cart_text($text, $inst){
        return $this->productHasRequired($inst->get_id()) ? __('Выбрать опции', 'product-options-for-woocommerce') : $text;    
      }
      
      public function getOptionModel(){
        include_once(Pektsekye_PO()->getPluginPath() . 'Model/Option.php');		
        return new Pektsekye_ProductOptions_Model_Option();    
      }  
      
      
      public function getProductOptions($productId){
        if (!isset($this->_productOptions[$productId])){    
          $this->_productOptions[$productId] = $this->getOptionModel()->getProductOptions($productId);
        }
        return $this->_productOptions[$productId];
      }
    
      public function validate_selected_options($isValid, $productId){
             
        if (!$isValid){
          return false;    
        }
        
        foreach ($this->getProductOptions($productId) as $option){
          $oId = (int) $option['option_id'];      
          if ($option['required'] == 1 && (empty($_POST['pofw_option'][$oId]) || (is_array($_POST['pofw_option'][$oId]) && $_POST['pofw_option'][$oId][0] == ''))){                     
            $isValid = false;
            wc_add_notice(__('Нужно выбрать опции', 'product-options-for-woocommerce' ), 'error');
            break;       
          }              											                                                    
        }  
          
        return $isValid;
      }
    
      public function save_selected_options($cart_item_data, $product_id){ 
        if (isset($_POST['pofw_option'])) {   
          $optionValues = (array) $_POST['pofw_option'];
          foreach($optionValues as $oId => $value){
            if (is_array($value)){
              $value = array_map('intval', $value);
            } elseif (ctype_digit($value)){
              $value = (int) $value;
            } else {
              $value = sanitize_textarea_field(stripslashes($value));
            }
            $cart_item_data['pofw_option'][$oId] = $value;        
          }
        }
        return $cart_item_data;
      }
    
      public function display_selected_options_on_checkout($cart_data, $cart_item){
        
        $custom_items = array(); 
        if (isset($cart_item['pofw_option'])) {
          $custom_items = $this->formatSelectedValues($cart_item['product_id'], $cart_item['pofw_option']);
        }
      
        return array_merge((array)$cart_data, $custom_items);
      }
    
      public function display_selected_options_with_order_info($item_id, $values, $cart_item_key){
        if (isset($values->legacy_values['pofw_option'])){   
          $selectedValues = $this->formatSelectedValues($values->legacy_values['product_id'], $values->legacy_values['pofw_option']);      
          foreach ($selectedValues as $value){
            wc_add_order_item_meta($item_id, $value['name'], $value['value']);
          }
        }
      }
    
      public function add_option_price_on_checkout($cart){
    
        foreach (WC()->cart->get_cart() as $key => $citem) {
        
          if (!isset($citem['pofw_option']) || isset($this->_poPriceAdded[$key]))
            continue;
            
          $selectedValues = $citem['pofw_option'];
                   
          $productId = $citem["variation_id"] == 0 ? $citem["product_id"] : $citem["variation_id"];
          
          $_product = wc_get_product($productId);
    
          $orgPrice = $citem["data"]->get_price();//$_product->get_price();
          
          $optionPrice = $orgPrice;
            
          foreach ($this->getProductOptions($productId) as $oId => $option){
            if (!isset($selectedValues[$oId])){
              continue;
            }
    
            $selectedValue = $selectedValues[$oId];
            
            if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
              if (is_array($selectedValue)){
                continue;
              }
              $vId = (int) $selectedValue;
              if (isset($option['values'][$vId])){
                if (isset($option['values'][$vId]['abs_price'])){
                  $optionPrice = (float) $option['values'][$vId]['price'];            
                } else {
                  $optionPrice += (float) $option['values'][$vId]['price'];
                }
              }
            } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
              foreach ((array) $selectedValue as $vId){
                if (isset($option['values'][$vId])){
                  if (isset($option['values'][$vId]['abs_price'])){
                    $optionPrice = (float) $option['values'][$vId]['price'];            
                  } else {
                    $optionPrice += (float) $option['values'][$vId]['price'];
                  }
                }            
              }          
            } elseif ($option['type'] == 'field' || $option['type'] == 'area'){
              if (is_array($selectedValue)){
                continue;
              }
              if (!empty($selectedValue)){
                $optionPrice += (float) $option['price'];
              }
            }
                               											                                                    
          }
    
          $citem["data"]->set_price($optionPrice);
          $this->_poPriceAdded[$key] = 1;      
        }
          
        WC()->cart->set_session();  
      }
      
    
      public function formatSelectedValues($productId, $selectedValues){
        
        $formatedValues = array();
    
        foreach ($this->getProductOptions($productId) as $oId => $option){
          if (!isset($selectedValues[$oId])){
            continue;
          }
    
          $selectedValue = $selectedValues[$oId];
          
          $value = '';        
          if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
            if (is_array($selectedValue)){
              continue;
            }
            $vId = (int) $selectedValue;
            if (isset($option['values'][$vId])){
              $value = $option['values'][$vId]['title'];
            }
          } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
            foreach ((array) $selectedValue as $vId){
              if (isset($option['values'][$vId])){
                $value .= ($value != '' ? ', ' : '') . $option['values'][$vId]['title'];
              }            
            }          
          } elseif ($option['type'] == 'field' || $option['type'] == 'area'){
            if (is_array($selectedValue)){
              continue;
            }
            $value = $selectedValue;
          }
          
          if ($value != ''){
            $formatedValues[] = array("name" => $option['title'], "value" => $value);
          }                      											                                                    
        }
        
        return $formatedValues;    
      }  
    
    		
    	public function delete_post($id){
    		if (!current_user_can('delete_posts') || !$id || get_post_type($id) != 'product'){
    			return;
    		}
        $this->getOptionModel()->deleteProductOptions($id);
    	}		
    		
    }

    Спасибо.

    • This reply was modified 2 years, 7 months ago by ruliks.
    • This reply was modified 2 years, 7 months ago by ruliks.
    Plugin Author Pektsekye

    (@pektsekye)

    Hello,

    I have updated your file:
    wp-content/plugins/product-options-for-woocommerce/Model/Observer.php
    modified lines 16-18, 121-172

    <?php
    if (!defined('ABSPATH')) exit;
    
    class Pektsekye_ProductOptions_Model_Observer {  
    
      protected $_productOptions = array();          
      protected $_poPriceAdded = array(); 
                    
      protected $_hasRequired = array();
    	
      public function __construct(){
        add_action('woocommerce_add_to_cart_validation', array($this, 'validate_selected_options'), 10, 2); 
        add_action('woocommerce_add_cart_item_data', array($this, 'save_selected_options'), 10, 2);    
        add_filter('woocommerce_get_item_data', array($this, 'display_selected_options_on_checkout'), 10, 2);
        add_action('woocommerce_new_order_item', array($this, 'display_selected_options_with_order_info'), 1, 3);  
        //add_action('woocommerce_before_calculate_totals', array($this, 'add_option_price_on_checkout'), 99);	
        add_filter('woocommerce_add_cart_item',  array($this, 'add_option_price_on_checkout'), 99);
     	  add_filter('woocommerce_get_cart_item_from_session', array($this, 'add_option_price_on_checkout'), 99);    
    		add_action('delete_post', array($this, 'delete_post'));    	
        add_filter('woocommerce_product_add_to_cart_url', array($this, 'product_add_to_cart_url') , 10, 2);
    		add_filter('woocommerce_product_supports', array($this, 'product_supports') , 10, 3);
    		add_filter('woocommerce_product_add_to_cart_text', array($this, 'product_add_to_cart_text') , 10, 2);   		
      }	
      
      
     public function productHasRequired($productId){  
        if (!isset($this->_hasRequired[$productId])){     
          $hasRequired = false; 
          foreach ($this->getProductOptions($productId) as $option){      
            if ($option['required'] == 1){   
              $hasRequired = true;      
              break;           
            }              											                                                    
          }
          $this->_hasRequired[$productId] = $hasRequired;
        }
        return $this->_hasRequired[$productId];
      }
    
      public function product_add_to_cart_url($url, $inst){
        return $this->productHasRequired($inst->get_id()) ? get_permalink($inst->get_id()) : $url;    
      }
    
      public function product_supports($supports, $feature, $inst){
        return $feature == 'ajax_add_to_cart' ? !$this->productHasRequired($inst->get_id()) : $supports;    
      }
      
      public function product_add_to_cart_text($text, $inst){
        return $this->productHasRequired($inst->get_id()) ? __('Выбрать опции', 'product-options-for-woocommerce') : $text;    
      }
      
      public function getOptionModel(){
        include_once(Pektsekye_PO()->getPluginPath() . 'Model/Option.php');		
        return new Pektsekye_ProductOptions_Model_Option();    
      }  
      
      
      public function getProductOptions($productId){
        if (!isset($this->_productOptions[$productId])){    
          $this->_productOptions[$productId] = $this->getOptionModel()->getProductOptions($productId);
        }
        return $this->_productOptions[$productId];
      }
    
      public function validate_selected_options($isValid, $productId){
             
        if (!$isValid){
          return false;    
        }
        
        foreach ($this->getProductOptions($productId) as $option){
          $oId = (int) $option['option_id'];      
          if ($option['required'] == 1 && (empty($_POST['pofw_option'][$oId]) || (is_array($_POST['pofw_option'][$oId]) && $_POST['pofw_option'][$oId][0] == ''))){                     
            $isValid = false;
            wc_add_notice(__('Нужно выбрать опции', 'product-options-for-woocommerce' ), 'error');
            break;       
          }              											                                                    
        }  
          
        return $isValid;
      }
    
      public function save_selected_options($cart_item_data, $product_id){ 
        if (isset($_POST['pofw_option'])) {   
          $optionValues = (array) $_POST['pofw_option'];
          foreach($optionValues as $oId => $value){
            if (is_array($value)){
              $value = array_map('intval', $value);
            } elseif (ctype_digit($value)){
              $value = (int) $value;
            } else {
              $value = sanitize_textarea_field(stripslashes($value));
            }
            $cart_item_data['pofw_option'][$oId] = $value;        
          }
        }
        return $cart_item_data;
      }
    
      public function display_selected_options_on_checkout($cart_data, $cart_item){
        
        $custom_items = array(); 
        if (isset($cart_item['pofw_option'])) {
          $custom_items = $this->formatSelectedValues($cart_item['product_id'], $cart_item['pofw_option']);
        }
      
        return array_merge((array)$cart_data, $custom_items);
      }
    
      public function display_selected_options_with_order_info($item_id, $values, $cart_item_key){
        if (isset($values->legacy_values['pofw_option'])){   
          $selectedValues = $this->formatSelectedValues($values->legacy_values['product_id'], $values->legacy_values['pofw_option']);      
          foreach ($selectedValues as $value){
            wc_add_order_item_meta($item_id, $value['name'], $value['value']);
          }
        }
      }
    
      public function add_option_price_on_checkout($citem){
        $key = $citem['key'];
        
        if (!isset($citem['pofw_option']) || isset($this->_poPriceAdded[$key]))
          return $citem;
           
        $selectedValues = $citem['pofw_option'];
                 
        $productId = $citem["product_id"];
        
        $_product = wc_get_product($productId);
    
        $orgPrice = $citem["data"]->get_price();//$_product->get_price();
        
        $optionPrice = 0;
        
        foreach ($this->getProductOptions($productId) as $oId => $option){
          if (!isset($selectedValues[$oId])){
            continue;
          }
    
          $selectedValue = $selectedValues[$oId];
          
          if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
            if (is_array($selectedValue)){
              continue;
            }
            $vId = (int) $selectedValue;
            if (isset($option['values'][$vId])){
              $optionPrice += (float) $option['values'][$vId]['price'];
            }
          } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
            foreach ((array) $selectedValue as $vId){
              if (isset($option['values'][$vId])){
                $optionPrice += (float) $option['values'][$vId]['price'];
              }            
            }          
          } elseif ($option['type'] == 'field' || $option['type'] == 'area' || $option['type'] == 'file'){
            if (is_array($selectedValue)){
              continue;
            }
            $optionPrice += (float) $option['price'];
          }
                                                                                                      
        }
        
    
        $citem["data"]->set_price($orgPrice + $optionPrice);
        $this->_poPriceAdded[$key] = 1;     
      
        return $citem; 
      }
      
    
      public function formatSelectedValues($productId, $selectedValues){
        
        $formatedValues = array();
    
        foreach ($this->getProductOptions($productId) as $oId => $option){
          if (!isset($selectedValues[$oId])){
            continue;
          }
    
          $selectedValue = $selectedValues[$oId];
          
          $value = '';        
          if ($option['type'] == 'drop_down' || $option['type'] == 'radio'){
            if (is_array($selectedValue)){
              continue;
            }
            $vId = (int) $selectedValue;
            if (isset($option['values'][$vId])){
              $value = $option['values'][$vId]['title'];
            }
          } elseif ($option['type'] == 'multiple' || $option['type'] == 'checkbox'){
            foreach ((array) $selectedValue as $vId){
              if (isset($option['values'][$vId])){
                $value .= ($value != '' ? ', ' : '') . $option['values'][$vId]['title'];
              }            
            }          
          } elseif ($option['type'] == 'field' || $option['type'] == 'area'){
            if (is_array($selectedValue)){
              continue;
            }
            $value = $selectedValue;
          }
          
          if ($value != ''){
            $formatedValues[] = array("name" => $option['title'], "value" => $value);
          }                      											                                                    
        }
        
        return $formatedValues;    
      }  
    
    		
    	public function delete_post($id){
    		if (!current_user_can('delete_posts') || !$id || get_post_type($id) != 'product'){
    			return;
    		}
        $this->getOptionModel()->deleteProductOptions($id);
    	}		
    		
    }
    

    Stanislav

    Thread Starter ruliks

    (@ruliks)

    Станислав, большое человеческое спасибо вам.

Viewing 12 replies - 1 through 12 (of 12 total)
  • The topic ‘Подробные параметры плагина’ is closed to new replies.