我需要什么
我想做一个简单的产品附加组件的实现,而不需要使用重量级的插件,这对我的需求来说是多余的。另外,我希望能够跟踪附加组件的库存,这是任何一个插件都没有提供的。为了让事情更清楚,我可以说主产品是一个挂件,附加组件是一条链子。客户应该可以在挂件页面选择链子,当他或她点击添加到购物车按钮时,两个项目都应该被添加到购物车。
所以我想可以直接用隐藏的单品作为附加项。我的想法是在我的附加产品中添加一个下拉菜单,然后通过POST获得选择的价值,并将其与主产品一起添加到购物车中。到目前为止,一切都很好。
我做了什么
这是我的代码。
add_action( 'woocommerce_before_add_to_cart_button', 'chain_selection_field' );
function chain_selection_field() {
global $product;
$domain = 'woocommerce';
$args = array(
'sku' => 'SOME_TEXT',
'stock_status' => 'instock',
);
$products = wc_get_products( $args );
foreach ($products as $product) {
$product_id = $product->get_id();
$options[$product_id] = $product->get_name();
}
woocommerce_form_field('chain_type', array(
'type' => 'select',
'label' => __('Chain type selection', $domain),
'required' => true,
'options' => $options,
),'');
}
add_action('woocommerce_add_to_cart', 'product_option_add_to_cart');
function product_option_add_to_cart() {
$product_id = $_POST['chain_type'];
$found = false;
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
WC()->cart->add_to_cart( $product_id );
}
}
"添加到购物车 "的实现是从这里开始的 如何为 "woocommerce_add_to_cart "添加过滤器或钩子?
有什么问题呢?
其实有很多问题。
$_POST = array();
或 unset($_POST);
在添加到购物车功能的最后,但这没有工作。问题是 我使用了全局变量 $product
的 foreach 循环中。所以它打破了循环逻辑,使用全局的 $product
而不是想要的数组值。因此,要使代码正常工作,只需要把foreach循环代码改成类似的代码。
foreach ($products as $single_product) {
$product_id = $single_product->get_id();
$options[$product_id] = $single_product->get_name();
否则代码就能正常工作了,尽管我必须做一些说明:
<form> ... </form>
按下添加到购物车按钮提交,即 woocommerce_before_add_to_cart_button
, woocommerce_before_add_to_cart_quantity
和 woocommerce_after_add_to_cart_quantity
(你可以自己在模板中查看-------------------------------------------------。https:/github.comwoocommercewoocommerceblob4.1.0templatessingle-productadd-to-cartsimple.php。)的简单产品,还有一些叫做内部变化循环vor变量产品的钩子,可以在这里找到--。https:/github.comwoocommercewoocommerceblob4.1.0templatessingle-productadd-to-carvariable.php。woocommerce_before_add_to_cart_button
输入字段被放置在产品库存文本和添加到购物车按钮之间,这不是最好的位置,看起来你必须编辑模板文件或使用JS来实现更好的位置与当前的WC(4.1)挂钩。wc_get_products ()
功能相当慢。在我的测试中,它比类似的查询慢了10倍。$wpdb->get_results
product_option_add_to_cart()
自定义函数代码到 if (isset($_POST['chain_type'])) { ... }
以防止PHP通知因某种原因没有$_POST值。