通过IP限制woocommerce订单

时间:2018-12-19 13:52:41

标签: wordpress woocommerce hook-woocommerce

在woocommerce中,我需要防止每天通过IP地址销售超过30件商品。基本上,它是对机器人的保护。 我认为逻辑必须是这样的:

  • 获取购买商品的客户IP,并将其存储在订单元中
  • 检查在过去24小时内是否还从该IP购买了其他商品
  • 如果超过30,则在付款前显示错误并要求稍后退回

*用户注册已禁用

因此,我不确定从哪里开始以及如何遵循woocommerce钩子规则。

任何代码示例都将受到高度赞赏

1 个答案:

答案 0 :(得分:3)

默认情况下,WooCommerce实际上将客户端IP地址存储在订单元数据中。您可以在get_customer_ip_address()上使用WC_Order方法来访问此元数据。同样,WooCommerce包含WC_Geolocation::get_ip_address()来获取当前连接的客户端的IP。

如果将具有相同IP的用户尝试在给定的时间段内进行过多的购买,则可以使用woocommerce_checkout_process钩将这些错误放在一起。

在这里,我使用wc_get_orders()简要查询最近24小时内具有匹配IP的所有订单,如果结果超过30个,则取消交易。

function my_ip_checker() {
    $last_24_hours_from_ip_results = wc_get_orders(array(
        'date_created'        => '>=' . (time() - 86400), // time in seconds
        'customer_ip_address' => WC_Geolocation::get_ip_address(),
        'paginate'            => true  // adds a total field to the results
    ));
    if($last_24_hours_from_ip_results->total > 30) { 
        wc_add_notice('Too many orders in the last 24 hours. Please return later.', 'error');
    }
}
add_action('woocommerce_checkout_process', 'my_ip_checker', 10, 0);

请注意,对类型为wc_add_notice()的{​​{1}}的调用将阻止交易通过。