购物车中仅允许 Woocommerce 中定义的产品类别中的一项商品

2024-01-01

在 Woocommerce 中,我发现了一些代码,限制用户对类别 a 或 b 的每个类别购买一个。因此,目前用户可以从 Cat a 购买 2 件物品 1,从 Cat b 购买 1 件。我想限制用户只能使用类别 a 或 b 中的一种产品。我正在使用的代码如下,提前致谢。

add_filter( 'woocommerce_add_to_cart_validation', 'allowed_quantity_per_category_in_the_cart', 10, 2 );function allowed_quantity_per_category_in_the_cart( $passed, $product_id) {

$max_num_products = 1;// change the maximum allowed in the cart
$running_qty = 0;

$restricted_product_cats = array();

//Restrict particular category/categories by category slug
$restricted_product_cats[] = 'cat-a, cat-b';


// Getting the current product category slugs in an array
$product_cats_object = get_the_terms( $product_id, 'product_cat' );
foreach($product_cats_object as $obj_prod_cat) $current_product_cats[]=$obj_prod_cat->slug;


// Iterating through each cart item
foreach (WC()->cart->get_cart() as $cart_item_key=>$cart_item ){

    // Restrict $max_num_products from each category
    if( has_term( $current_product_cats, 'product_cat', $cart_item['product_id'] )) {

    // Restrict $max_num_products from restricted product categories
    //if( array_intersect($restricted_product_cats, $current_product_cats) && has_term( $restricted_product_cats, 'product_cat', $cart_item['product_id'] )) {

        // count(selected category) quantity
        $running_qty += (int) $cart_item['quantity'];

        // More than allowed products in the cart is not allowed
        if( $running_qty >= $max_num_products ) {
            wc_add_notice( sprintf( 'Only %s '.($max_num_products>1?'products from this category are':'product from this category is').' allowed in the cart.',  $max_num_products ), 'error' );
            $passed = false; // don't add the new product to the cart
            // We stop the loop
            break;
        }

    }
}
return $passed;}

尝试这个(但它不处理数量,因为不清楚并且更复杂,因为在购物车页面中它们可以更改):

add_filter( 'woocommerce_add_to_cart_validation', 'limit_cart_items_from_category', 10, 3 );
function limit_cart_items_from_category ( $passed, $product_id, $quantity )
{
    // Accept when cart is empty
    if( WC()->cart->is_empty() ) return $passed;

    // HERE your product categories in this array (can be names, slugs or Ids)
    $categories = array('T-shirts', 'Hoodies');
    $found = $current = false;

    // Check the current product
    if( has_term( $categories, 'product_cat', $product_id ) ){
        $current = true;
    }

    // Loop through cart items checking for product categories
    foreach ( WC()->cart->get_cart() as $cart_item ){
        if( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $found = true;
            break; // stop the loop.
        }
    }

    // Current product and a cart item match with defined product categories
    if( $found && $current ){
        $passed = false;
        $cats_str = implode('" and "', $categories );
        wc_add_notice( sprintf( __('Only one item is allowed from "%s" categories…', 'woocommerce' ), $cats_str ), 'error' );
    }
    return $passed;
}

代码位于活动子主题(或活动主题)的 function.php 文件中。经过测试并工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

购物车中仅允许 Woocommerce 中定义的产品类别中的一项商品 的相关文章

  • 很好地阻止了齿轮工人

    我有许多 Gearman 工作人员不断运行 保存用户页面浏览记录等内容 偶尔 我会更新 Gearman 工作人员使用的 PHP 代码 为了让工作人员切换到新代码 我杀死并重新启动了工作人员的 PHP 进程 有什么更好的方法来做到这一点 据推
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • Smarty 3 或更早版本中有类似 Dwoo-s {with} 或 {loop} 的东西吗?

    Dwoo 模板引擎中的 with 和 loop 插件更改变量名称解析的默认上下文 如果在 Dwoo 中您提供模板 arr foo with arr foo arr foo with 有数据 array arr gt array foo gt
  • 根据数组计数填充复选框

    我是新来的php我已经使用了它的开发php array 我想填充checkboxes根据数组计数 为了做到这一点 我尝试了以下方式 它对我不起作用 有什么方法可以做到这一点 在我的例子中 数组计数 5 所以我相应地需要 5 个复选框
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • 如何在图像附件页面上显示帖子附加的图像数量?

    我使用图像附件页面以幻灯片形式一一显示附加到帖子的图像 我希望能够显示附加到父帖子的图像总数以及任何给定附件页面上显示的特定图像的数量 以便您看到图片和文字 第 3 张图片 共 15 张 例如 更新 我能够使用以下代码获取要显示的总数
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • 访问 public_html 级别之外/以下的文件

    如何通过 url 访问文件 home uzair etc index php 即使我运行域 something com 它显示了 home uzair public html index php 这个文件 任何人请帮助我如何访问放置在 ho
  • 使用 HTTP-Basic 身份验证发出 HTTP GET 请求

    我需要为我正在开发的 Flash Player 项目构建一个代理 我只需要使用 HTTP Basic 身份验证向另一个 URL 发出 HTTP GET 请求 并提供来自 PHP 的响应 就好像 PHP 文件是原始源一样 我怎样才能做到这一点
  • Facebook 中用户的时区是如何编码的

    我需要检查用户的时区 但我找不到它的真正定义 参考API http developers facebook com docs reference api user says 用户的时区与 UTC 的偏移量 现在在维基百科上这些是可能的时区
  • Facebook Graph API v3.1 开发人员访问令牌权限限制

    如您所知 Facebook 将其 API 升级到了 V3 1 现在正在慢慢地淘汰旧的 API 和应用程序 因此我们必须迁移到新的 API 他们做出了一些艰难的决定 这对垃圾邮件网站来说是好事 但对开发人员来说也很难 提醒 Graph API
  • 加载时覆盖 WordPress 插件翻译文件

    我正在使用带有插件的法语版 WordPress活动日历 http wordpress org plugins the events calendar 该插件附带了捆绑的法语翻译 但有一些错误 我想修复它们 但替换原始文件是一个坏主意 因为它
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 如何从控制器访问 Zend Framework 应用程序的配置?

    我有一个基于 Zend 框架的应用程序快速开始 http framework zend com docs quickstart setup 我已经让演示工作起来 现在正在实例化一个新的模型类来完成一些实际工作 在我的控制器中 我想将配置参数
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • laravel 5.4 在请求验证之前修改数据[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有我的自定义请求 它扩展了 Backpack CrudController 现在我想重写 ValidatesWhenResolv
  • Laravel 8、Sanctum、Fortify /logout 在 Postman 中抛出“CSRF 令牌不匹配”

    我安装了 L8 Sanctum 和 Fortify 进行身份验证 我以前可以 login 使用了Pre request Script设置X XSRF TOKEN 我什至得到了 api user成功地 但当我这样做时 logout 我在 Po
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 隐藏产品价格和添加到购物车按钮,但不隐藏 WooCommerce 中未注册用户的变体

    在我的 WooCommerce 商店中 我想隐藏价格 直到客户登录为止 我有以下代码可以实现这一点 add action init hide price function hide price if is user logged in re
  • 如何移动 Zend_Layout 的“视图”

    通常它会是这样的结构 application modules somemodule views scripts index index phtml 我如何将其移动到 application templates somemodule temp

随机推荐

  • extjs,是否可以压缩加载ext-all.js?

    我有一个使用 extjs 库的网站 确切地说 我只需要网格 ajax 和树组件 我的项目是全国使用的 为了避免某些地区带宽低造成的问题 我必须让它尽可能的轻量 当我在chrome中使用开发者工具时 我的网站太重了 特别是在加载 ext al
  • Ruby:查找字符串中的前 N ​​个正则表达式匹配项(并停止扫描)

    想要扫描很长的字符串以查找正则表达式匹配 想知道找到前 N 个正则表达式的最有效方法是什么 例如就像是 abcabcabc scan b limit 2 如果仅扫描支持限制选项 则会在 5 个字符后成功结束 该字符串有几 MB 内存中的记忆
  • FTPWebRequest 530 错误:未登录问题

    我一直在挖掘大量关于如何在 C 中正确登录 FTP 的帖子 但当我真正尝试时 它不起作用 通过我的阅读 我开始认为这是因为我的用户名中有 at 符号 这是真的还是有其他问题 我可以使用 FileZilla 登录 没有问题 var file
  • 如何将nodejs从6.x更新到8.x?

    简单的问题 如何将nodejs从6 x更新到8 x 我有 Ubuntu 16 04 我应该卸载旧版本并安装新版本吗 如果是这样 我该怎么做 一个尝试过的 须藤最新 但它说 sudo n 未找到命令 当我刚刚 最新的 需要 sudo 卧槽 U
  • 有关 SQL Server 触发器的帮助

    假设我有3张桌子 t1 Nid name 1 aaa 2 bbb 3 ccc delT1 Nid name t2 Sid Nid value 1 1 AAA 2 1 BAC 3 2 CSA 表中t1 Nid是主键 是外键t2 现在我想要的是
  • 从 NSUrlConnection didReceiveAuthenticationChallenge 提供有意义的错误

    我正在使用 OWASP 示例证书和公钥固定 https www owasp org index php Certificate and Public Key Pinning 示例使用随机组织 http www random org and
  • 将 *.sdf 文件添加到 .gitignore 的可能影响

    我最近将一个 Visual Studio C 项目推送到了 github 我注意到 VS 创建了一个相对较大的 sdf 文件 25MB 我尝试删除工作区中的这个文件 看看 VS 是否会抛出错误 在 VS 中打开项目后 没有报告任何错误 并且
  • 我什么时候应该使用“类对象”、“类模块”、“模块内核”而不什么都不用?

    我是 ruby 元编程的新手 我看到人们在不同的地方对代码进行元编程 比如class Object class Module module Kernel和 无 即 在类 模块定义块之外 例如 我正在创建一个c attr accessor方法
  • 如何在dompdf中应用bootstrap样式

    我正在使用 bootstrap grid 来显示 我希望我的客户端以 pdf 格式下载它 因此我使用 dompdf 但 dompdf 无法应用 bootstrap 样式 我无法返回并将我的引导网格转换为基本的 html 表并使用不同的插件转
  • 出现错误 - ORA-01858: 在需要数字的地方发现了非数字字符

    我在下面的 sql 中收到错误 ORA 01858 在需要数字的地方发现了非数字字符 SELECT c contract num CASE WHEN MAX TO CHAR TO DATE c event dt YYYY MM DD MMD
  • 根据 Spark scala 中的文件夹名称重命名和移动 S3 文件

    我在 s3 文件夹中有 Spark 输出 我想将所有 s3 文件从该输出文件夹移动到另一个位置 但在移动时我想重命名这些文件 例如 我在 S3 文件夹中有文件 如下所示 现在我想重命名所有文件并放入另一个目录中 但文件的名称如下所示 Fun
  • 为什么 jQuery .insertAfter 在此示例中不起作用?

    在以下示例中 显示了警报 但 消息为空 If I 注释掉 insertAfter 行则 message 会正确显示 为什么 insertAfter 在此示例中不起作用 萤火虫径直跨过它 javascript google load jque
  • XWPF 表格单元格中的新段落

    我正在尝试创建一个包含一列的简单表格 我创建一个新行 并在每行中创建一个新段落 问题是每一行都以一个空行开头 我猜是新段落创建了它 我之前尝试设置间距 缩进等 但没有成功 for int i 0 i
  • 显示水平图像的列表框 WPF

    我正在尝试在 wpf xaml 中创建一个控件 它将显示图像的水平列表 列表框的宽度是固定的 无滚动条 添加新项目时 现有项目会减少显示的图像数量以容纳它 实际图像不仅仅减少显示的图像数量 该功能类似于向具有相对宽度属性 的网格添加新列 并
  • 如何将数据帧(从hive表获取)写入hadoop SequenceFile和RCFile?

    我可以把它写进 ORC PARQUET 直接和 TEXTFILE AVRO 使用来自 databricks 的附加依赖项
  • 使用 OpenCV 进行 gabor 边缘检测

    在 OpenCV 中 我检索用于图像处理的 Gabor 内核 它是一个 9 9 矩阵 使用 Imgproc getGaborKernel 我有原始图像的灰度矩阵 我什至不确定内核是否应该是图像的大小或只是一小段 我相当确定小内核 如何对两者
  • Telegram 机器人不适用于所有用户

    我创建了几个 Telegram 机器人 它们适用于我的帐户以及我测试过的其他几个帐户 但我收到一些用户的报告称机器人从未做出回应 是否有一些用户设置会阻止帐户从机器人获取消息 或者还有其他想法为什么它不适用于某些帐户 好的 找到问题了 是p
  • 最大 XOR 值比仅使用 XOR 更快

    给定一个数字 N 和一个整数数组 均不小于 2 15 A 是数组大小 100000 从数组中查找 N 和整数的最大异或值 Q 是查询数量 50000 start stop 是数组中的范围 Input A Qa1 a2 a3 N 启动停止 O
  • 确定一个字谜是否是回文的最佳算法是什么?

    在此问题中 我们仅考虑小写英文字母 a z 的字符串 如果从左到右和从右到左遍历时字符串具有完全相同的字符序列 则该字符串是回文 例如 以下字符串是回文 kayak codilitytilidoc 从不奥多甚至 如果字符串 A 由完全相同的
  • 购物车中仅允许 Woocommerce 中定义的产品类别中的一项商品

    在 Woocommerce 中 我发现了一些代码 限制用户对类别 a 或 b 的每个类别购买一个 因此 目前用户可以从 Cat a 购买 2 件物品 1 从 Cat b 购买 1 件 我想限制用户只能使用类别 a 或 b 中的一种产品 我正