Php 若要添加到购物车,请从自定义选择字段添加第二个产品

Php 若要添加到购物车,请从自定义选择字段添加第二个产品,php,wordpress,woocommerce,product,cart,Php,Wordpress,Woocommerce,Product,Cart,我需要什么 我想在不使用重量级插件的情况下实现一个简单的产品附加组件,而这些插件对于我的需求来说是多余的。此外,我希望能够保持跟踪的附加组件库存,这是没有任何插件提供。为了让事情更清楚一点,我可以说,主要产品是一个吊坠和附加是一个链。客户应该能够在pendant的页面上选择链,当他或她单击“添加到购物车”按钮时,两个项目都应该添加到购物车 所以我想我可以使用隐藏的单一产品作为附加组件。我们的想法是在我的附加产品中添加一个下拉列表,通过POST获得所选的价值,并将其与主产品一起添加到购物车中。到目

我需要什么

我想在不使用重量级插件的情况下实现一个简单的产品附加组件,而这些插件对于我的需求来说是多余的。此外,我希望能够保持跟踪的附加组件库存,这是没有任何插件提供。为了让事情更清楚一点,我可以说,主要产品是一个吊坠和附加是一个链。客户应该能够在pendant的页面上选择链,当他或她单击“添加到购物车”按钮时,两个项目都应该添加到购物车

所以我想我可以使用隐藏的单一产品作为附加组件。我们的想法是在我的附加产品中添加一个下拉列表,通过POST获得所选的价值,并将其与主产品一起添加到购物车中。到目前为止还不错

我所做的

这是我的密码:

add_操作('woocommerce_之前的'add_to_cart_按钮','chain_selection_字段');
功能链\选择\字段(){
全球$产品;
$domain='woocommerce';
$args=数组(
“sku”=>“一些文本”,
“库存状态”=>“库存”,
);
$products=wc_获取_产品($args);
foreach($products as$product){
$product_id=$product->get_id();
$options[$product\u id]=$product->get\u name();
}
woocommerce\u form\u字段('chain\u type',数组(
'类型'=>'选择',
“label'=>”(链类型选择“,$domain),
“必需”=>true,
“选项”=>$options,
),'');
}
添加操作(“商业添加到购物车”、“产品选项添加到购物车”);
功能产品选项添加到购物车(){
$product\U id=$\U POST['chain\U type'];
$found=false;
如果(sizeof(WC()->cart->get_cart())>0){
foreach(WC()->cart->get_cart()作为$cart\u item\u key=>$value){
$_product=$values['data'];
如果($\u产品->id==$product\u id)
$found=true;
}
如果(!$found)
WC()->购物车->将购物车添加到购物车($product\U id);
}否则{
WC()->购物车->将购物车添加到购物车($product\U id);
}
}
“添加到购物车”的实现从这里开始-

有什么问题吗?

其实有很多问题:

  • 一旦我在下拉列表中选择了某个值,它就会永久保留。即使在刷新页面后,即使我选择了另一个值,它仍然会添加到购物车中。看来我必须以某种方式清除POST值。我尝试添加
    $\u POST=array()
    unset($\u POST)在“添加到购物车”功能的末尾,但这不起作用
  • 主产品未添加到购物车-当我点击“添加到购物车”时,只有附加产品添加到购物车。我用预设的产品ID分别检查了“添加到购物车”功能,发现它按预期工作,两种产品都添加到购物车

  • 问题是我在foreach循环中使用了全局变量
    $product
    。因此,它打破了循环逻辑,使用全局
    $product
    而不是所需的数组值。因此,要使代码正常工作,只需将foreach循环代码更改为如下内容:

    foreach($products作为$single_产品){
    $product_id=$single_product->get_id();
    $options[$product\u id]=$single\u product->get\u name();
    
    否则,代码运行良好,尽管我必须说几句话:

    • 只有通过按“添加到购物车”按钮提交的
      ..
      内调用的钩子插入代码时,代码才会起作用,即
      添加到购物车之前的woocommerce\u按钮
      添加到购物车数量之前的woocommerce\u
      和添加到购物车数量之后的
      woocommerce\u
      (您可以在模板中自己检查)对于简单产品和一些称为内部变量回路vor变量产品的挂钩,可在此处找到-
    • 当在“添加到购物车”按钮之前通过
      woocommerce\u插入时,
      输入字段被放置在产品库存文本和“添加到购物车”按钮之间,这不是最佳位置,看起来您要么必须编辑模板文件,要么使用JS来实现当前WC(4.1)挂钩的更好放置
    • wc\u get\u products()
      函数相当慢。在我的测试中,它比通过
      $wpdb->get\u results进行的类似查询慢10倍
      
      • 最好将
        product\u option\u add\u to\u cart()
        自定义函数代码插入
        if(isset($\u POST['chain\u type')){…}
        ,以防止由于某种原因没有$\u POST值时出现PHP通知

    问题在于我在foreach循环中使用了全局变量
    $product
    。因此它打破了循环逻辑,使用了全局
    $product
    而不是所需的数组值。因此,使代码工作所需的全部工作就是将foreach循环代码更改为类似以下内容:

    foreach($products作为$single_产品){
    $product_id=$single_product->get_id();
    $options[$product\u id]=$single\u product->get\u name();
    
    否则,代码运行良好,尽管我必须说几句话:

    • 只有通过按“添加到购物车”按钮提交的
      ..
      内调用的钩子插入代码时,代码才会起作用,即
      添加到购物车之前的woocommerce\u按钮
      添加到购物车数量之前的woocommerce\u
      和添加到购物车数量之后的
      woocommerce\u
      (您可以在模板中自己检查)对于简单产品和一些称为内部变量回路vor变量产品的挂钩,可在此处找到-
    • 当在“添加到购物车”按钮之前通过
      woocommerce\u插入时,
      输入字段被放置在产品库存文本和“添加到购物车”按钮之间,这不是最佳位置,看起来您要么必须编辑模板文件,要么使用JS来实现当前WC(4.1)挂钩的更好放置
    • wc\u get\u products()
      函数相当慢。在我的测试中,它比类似的查询慢10倍