2017-03-04 143 views
0

我正在使用woocommerce並在一個頁面上有5個變量產品。他們都使用高度,寬度和顏色的屬性。我想要做的是,如果產品選擇了紅色,我想在其他4個產品中選擇。高度和寬度相同。強制woocommerce產品變量下拉菜單

我認爲這很簡單,只需用jQuery強制選擇下拉選項即可。所以我開始看,我發現了一些事情。他們似乎都在將html複製到產品-2的領域。因此,如果我們在product-1中選擇了紅色,product-2在選擇克隆的下拉列表中將有2個紅色作爲選項。

我最終調整了一些我發現的.change而不是.clone。我使用了名稱,因爲所有產品上的選擇ID都是相同的。

jQuery("select[name='wccp_attribute_pa_length[1488195634]'").change(function() { 
    alert('working'); 
    if (jQuery(this).data('options') == undefined) { 
    /*Taking an array of all options-2 and kind of embedding it on the select1*/ 
    jQuery(this).data('options', jQuery('select[name="component_1486761669_bundle_attribute_pa_length_186695"] option').change()); 
    } 
    var id = jQuery(this).val(); 
    var options = jQuery(this).data('options').filter('[value=' + id + ']'); 
    jQuery('select[name="component_1486761669_bundle_attribute_pa_length_186695"]').html(options); 
}); 

乍一看,它似乎在做伎倆。它在視覺上改變了第二個產品的下拉菜單。但是,如果我手動選擇不同的變體選項(如顏色),它將恢復爲下拉菜單的第一個選項。其次,這不會更新產品價格。它好像woocommerce不知道選擇變化。

如果有人知道更好的方法,我不會結婚使用上面的代碼。我試圖尋找某種產品過濾器,但是我在搜索過程中空了。我是woocommerce的noob。

我真的被卡住了。一如既往,任何幫助都會受到讚賞。

乾杯

回答

0

的add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name');

function display_price_in_variation_option_name($ term){ global $ wpdb,$ product;

$result = $wpdb->get_col("SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'"); 

$term_slug = (!empty($result)) ? $result[0] : $term; 


$query = "SELECT postmeta.post_id AS product_id 
      FROM {$wpdb->prefix}postmeta AS postmeta 
       LEFT JOIN {$wpdb->prefix}posts AS products ON (products.ID = postmeta.post_id) 
      WHERE postmeta.meta_key LIKE 'attribute_%' 
       AND postmeta.meta_value = '$term_slug' 
       AND products.post_parent = $product->id"; 

$variation_id = $wpdb->get_col($query); 

$parent = wp_get_post_parent_id($variation_id[0]); 

if ($parent > 0) { 
    $_product = new WC_Product_Variation($variation_id[0]); 
    return $term . ' (' . woocommerce_price($_product->get_price()) . ')'; 
} 
return $term; 

}