我有一个带有“产品配置器”的网站,该网站将用户选择的值保存在数据库表中。
每次用户访问产品配置器并保存其产品设计时,都会创建一个带有参考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']
的值的?
此外,我需要一种在订单和发票上显示这些其他项目元数据字段的方法。