在我的woocommerce网站上,我列出了可以运往印度和国际目的地的两种产品。Am分配only-india
某些产品的装运类别,以便将其标记为仅适用于印度。
现在我正在尝试在结帐页面中添加验证,以防止用户完成订单,如果他们选择了国际目的地,但有一些only-india
他们的购物车中的产品以及国际产品。
到目前为止,我尝试的是:
add_action(\'woocommerce_checkout_order_review\', \'abc_validating_international_delivery\');
add_action(\'woocommerce_update_order_review\', \'abc_validating_international_delivery\');
function abc_validating_international_delivery(){
$has_local_products = false;
$post_data = $_POST[\'post_data\'];
parse_str( $post_data, $abc_array );
if( isset($abc_array[\'ship_to_different_address\']) )
$shipping_country = $abc_array[\'shipping_country\'];
else
$shipping_country = $abc_array[\'billing_country\'];
if( !empty( $shipping_country ) )
{
foreach ( WC()->cart->cart_contents as $cart_content_product ) {
$shipping_class = $cart_content_product[\'data\']->get_shipping_class();
if($shipping_class == \'only-india\')
{
$has_local_products = true;
}
}
if( $has_local_products && $shipping_country != \'IN\' )
{
wc_add_notice( sprintf( \'<strong>You have added some products into your cart, which will not be delivered outside India!<br>Please visit <a href="https://www.example.com/my-account/">My Account</a> page and update the shipping/billing location or <a href="https://www.example.com/cart/">review the products</a> you added in cart!</strong>\' ), \'error\' );
return false;
}
else
return true;
}
}
当访问结帐页面并单击下订单按钮时,它第一次工作。我的意思是,假设我添加了3个国际交货可用产品和1个
only-india
当我选择国外时(比如,
US
), 然后单击下订单按钮,它会显示通知(有时会显示两个以上的重复通知)。但如果我不做任何更改,再按下订单按钮,它只会将我带到支付网关页面。我的意思是,它似乎没有进行验证,也没有阻止我完成订单!
对改进代码有什么建议吗?请随时询问您是否需要任何澄清或解释。
非常感谢。
SO网友:B. Shea
因为在检查了上面的逻辑之后,我没有一个很好的答案给你(似乎没问题)。。我还注意到了其他一些事情。
add_action(\'woocommerce_update_order_review\' ...
您是否正在使用最新的更新?我在这里看不到参考文件。woothemes。com/wc apidocs/hook文档。html或在github depo上执行该do\\u操作。
Here is the current layout 用于窗体签出上的挂钩/过滤器。php。。是否确实使用了正确的add\\u操作?(如果你注意到的话,Woocommerce的文档非常糟糕)。您还希望根据您的附加条件(装运类别/装运国家/地区)对其进行验证after 他们提交了“结帐审查”,对吗?(如果需要,可在该点拒绝并显示消息)。意思:如果他们在结帐审核页面上更新发货(新提交的发货值),会怎么样?
额外的idea 如果装运条件匹配,将不允许添加到购物车。(删除“添加到购物车”按钮,替换为短消息:“仅限印度”等),从而避免将其放在购物车的首位。或者离开按钮,当他们点击时弹出消息。(显然,只有在之前已输入装运信息的情况下,这两个选项中的任何一个才起作用)。
希望这有点帮助。。