从Woocommerce中的购物车项目获取产品属性值

时间:2018-11-21 17:39:50

标签: php wordpress woocommerce hook-woocommerce custom-taxonomy

添加到购物车后,我需要更改产品的重量。权重取决于产品属性“ quantite-avec-fenetre”。

基于Change cart items weight to update the shipping costs in Woocommerce,我试图在主题的functions.php文件中使用以下功能:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_weight', 10, 1);
function add_custom_weight( $cart_object ) {

    foreach ( $cart_object->get_cart() as $cart_item ) {
         //very simplified example - every item in cart will be 100 kg
        $attr = $cart_item['data']->get_attributes();
        if ($cart_item['data']->get_SKU() == "PSP229AFSF") {
            $qtySF = $attr["pa_quantite-sans-fenetre"];
            $qtyAF = $attr["pa_quantite-avec-fenetre"];
            var_dump($attr);
            //echo $qtyAF;
            //echo $qtySF;

            //echo "oll";
        }
        //echo $attr["pa_impressiont"];
        //$cart_item['data']->set_weight( 0.001 );
    }
    // Testing: cart weight output
}

回声和看起来很奇怪的东西仅供测试。 因此,此展示带有var_dump的购物车中每个产品的所有属性(具有PSP229AFSF的SKU)。

问题是我设置了属性,我将其添加到购物车,在购物车中,我的属性ith值很高,但是他var_dump将此返回给我:

array(7) { 
["pa_impression"]=> string(15) "sans-impression"
["pa_impressionrecto"]=> string(11) "1couleurpms"
["pa_impressionverso"]=> string(12) "sansimpverso"
["pa_fichierimpr"]=> string(12) "designertool" ["pa_bat"]=> string(3)
"non" ["pa_quantite-avec-fenetre"]=> string(0) ""
["pa_quantite-sans-fenetre"]=> string(0) "" }

如您所见,属性“ pa_quantite-avec-fenetre”和“ pa_quantite-sans-fenetre”为空。

这是我的购物车显示的内容(购物车的屏幕截图):

Image of cart

因此该属性在购物车中设置得很好,但是在$cart_item中似乎不可用。

我尝试过没有会影响属性,效果相同的插件,对它的来源有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您需要从购物车项目(而不是从产品本身)获取差异产品属性数据。

所以尝试一下:

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_weight', 10, 1);
function custom_cart_item_weight( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart_object->get_cart() as $cart_item ) {
        if ( $cart_item['data']->get_sku() == "PSP229AFSF" ) {
            $attributes = $cart_item['variation'];
            $attr_key = 'attribute_pa_';

            if( isset($attributes[$attr_key.'impression']) )
                $attr_imp = $attributes[$attr_key.'impression'];

            if( isset($attributes[$attr_key.'impressionrecto']) )
                $attr_imp_rec = $attributes[$attr_key.'impressionrecto'];

            if( isset($attributes[$attr_key.'impressionverso']) )
                $attr_imp_ver = $attributes[$attr_key.'impressionverso'];

            if( isset($attributes[$attr_key.'fichierimpr']) )
                $attr_fich_imp = $attributes[$attr_key.'fichierimpr'];

            if( isset($attributes[$attr_key.'bat']) )
                $attr_bat = $attributes[$attr_key.'bat'];

            if( isset($attributes[$attr_key.'quantite-sans-fenetre']) )
                $attr_qte_sf = $attributes[$attr_key.'quantite-sans-fenetre'];

            if( isset($attributes[$attr_key.'quantite-avec-fenetre']) )
                $attr_qte_af = $attributes[$attr_key.'quantite-avec-fenetre'];

            ## Make your weight calculations ##

            $new_weight = 1; // <=== Make your calculated weight

            $cart_item['data']->set_weight( $new_weight ); // Set the calculated weight
        }
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中。应该会更好。