Woocommerce添加自定义购物车项目元数据

时间:2019-11-11 14:18:47

标签: wordpress woocommerce

我有一个带有“产品配置器”的网站,该网站将用户选择的值保存在数据库表中。

每次用户访问产品配置器并保存其产品设计时,都会创建一个带有参考ID的新数据库行。

当用户将产品添加到购物篮时,参考ID将传递到购物车项目。

在我的functions.php中有此自定义代码:

// This pops up with with the users design ref on the shop page, or a CTA to design one
function get_design_ref_id(){
    if (isset($_SESSION['design_ref_id'])){
        echo "<div style=background-color:#Ffff00>Your Design Reference:<b>{$_SESSION['design_ref_id']}</b></br></br></div>";
    } else 
    {
        echo "<div>You have not yet created a design";
        echo "<a class=\"et_pb_button  et_pb_button_0 et_pb_module et_pb_bg_layout_dark\" href=\"/create\">Create Now</a>  </div><br/>";
    }

}
add_shortcode("show_design_ref_id", "get_design_ref_id");

add_filter( 'woocommerce_add_cart_item_data', function ( $cartItemData, $productId, $variationId ) {
    if (isset($_SESSION['design_ref_id']))
    {
        $cartItemData['design_ref_id'] = $_SESSION['design_ref_id'];
    }
    return $cartItemData;
}, 10, 3 );

add_filter( 'woocommerce_get_cart_item_from_session', function ( $cartItemData, $cartItemSessionData, $cartItemKey ) {
    if ( isset( $cartItemSessionData['design_ref_id'] ) ) {
        $cartItemData['design_ref_id'] = $cartItemSessionData['design_ref_id'];
    }

    return $cartItemData;
}, 10, 3 );

add_filter( 'woocommerce_get_item_data', function ( $data, $cartItem ) {
    if ( isset( $cartItem['design_ref_id'] ) ) {
        $data[] = array(
            'name' => 'Design Ref. ',
            'value' => $cartItem['design_ref_id']
        );
    }

    return $data;
}, 10, 2 );

add_action( 'woocommerce_add_order_item_meta', function ( $itemId, $values, $key ) {
    if ( isset( $values['design_ref_id'] ) ) {
        wc_add_order_item_meta( $itemId, 'design_ref_id', $values['design_ref_id'] );
    }
}, 10, 3 );

这很完美,并且到目前为止已经足够了...


我要做的是根据数据库表中保存的参数,将其他商品元数据添加到购物车中的商品,其中设计参考ID与会话的“ design_reference_id”相匹配。

我已经尝试在我的functions.php中使用以下内容进行此操作-在这种情况下,我想返回商品meta中的颜色选择。

function get_colour(){
        $ref_id = $_SESSION['design_ref_id'];
        $rValue = "";
        $query = ("SELECT width FROM pmr_colour_v where ref_id=`$ref_id`;");
        $result = mysql_query($query);
        if ($row = mysql_fetch_array($result)){
        $rValue = $row;
        }
    return $rValue;
    }

,然后更改以下内容:

add_filter( 'woocommerce_get_item_data', function ( $data, $cartItem ) {
    if ( isset( $cartItem['design_ref_id'] ) ) {
        $data[] = array(
            'name' => 'Design Ref. ',
            'value' => $cartItem['design_ref_id']
            'name' => 'Colour: ',
            'value' => $get_colour
        );
    }
    return $data;
}, 10, 2 );

不幸的是,这似乎不起作用-购物车商品的唯一元数据条目是:

Colour:-SQL语句的输出未返回任何内容,看来我只能在此数组中使用一项元数据/(或单个名称/值对)。

是否有一种方法可以为每个购物车项目添加多个元数据行,并使它们的值基于SQL语句,而该SQL语句本身是基于用户会话中保存的$_SESSION['design_ref_id']的值的?

此外,我需要一种在订单和发票上显示这些其他项目元数据字段的方法。

0 个答案:

没有答案