WooCommerce添加到购物车验证:阻止添加到购物车

时间:2015-06-09 15:46:02

标签: php wordpress woocommerce

嘿伙计们,我有一个关于woocommerce的问题,我试图解决几天。

我正在为一个人创建一个网站,他希望我在产品页面上添加一个自定义输入,我不能自己做,所以我在网上使用了一个自由职业者。

在产品页面上我

添加到购物车按钮,数量输入和日期输入。

“日期输入”是自由职业者所做的。

问题是,当$ _REQUEST ['thedate']为空时,自定义错误弹出,但产品仍然添加到购物车。

代码:(functions.php)

function add_the_date_validation() { 
if ( empty( $_REQUEST['thedate'] )) {
    wc_add_notice( __( 'Please enter a date.', 'woocommerce' ), 'error' );
    return false;
}
return true;
}
add_action( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );    

观点: http://i.stack.imgur.com/a75P6.png

  • 如何阻止产品将其添加到购物车中?

自由职业者所做的其他代码:

function save_add_the_date_field( $cart_item_key, $product_id = null, $quantity= null, $variation_id= null, $variation= null ) {
if( isset( $_REQUEST['thedate'] ) ) {
    WC()->session->set( $cart_item_key.'_the_date', $_REQUEST['thedate'] );
}
}

add_action( 'woocommerce_add_to_cart', 'save_add_the_date_field', 1, 5 );

function render_meta_on_checkout_order_review_item( $quantity = null, $cart_item = null, $cart_item_key = null ) {
if( $cart_item_key && WC()->session->__isset( $cart_item_key.'_the_date' ) ) {
    echo $quantity. '<dl class="">
             <dt class="">Date: </dt>
             <dd class=""><p>'. WC()->session->get( $cart_item_key.'_the_date') .'</p></dd>
          </dl>';
}
}

add_filter( 'woocommerce_checkout_cart_item_quantity', 'render_meta_on_checkout_order_review_item', 1, 3 );

function the_date_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( WC()->session->__isset( $cart_item_key.'_the_date' ) ) {
    wc_add_order_item_meta( $item_id, "the_date", WC()->session->get( $cart_item_key.'_the_date') );
}
}

add_action( 'woocommerce_add_order_item_meta', 'the_date_order_meta_handler', 1, 3 );

function the_date_force_individual_cart_items($cart_item_data, $product_id)
{
$unique_cart_item_key = md5( microtime().rand() );
$cart_item_data['unique_key'] = $unique_cart_item_key;

return $cart_item_data;
}

add_filter( 'woocommerce_add_cart_item_data','the_date_force_individual_cart_items', 10, 2 );

3 个答案:

答案 0 :(得分:3)

我会说你应该使用Product Add-Ons但它似乎没有日期选择器。无论如何,我会尝试按如下方式修改验证函数:

function add_the_date_validation( $passed ) { 
if ( empty( $_REQUEST['thedate'] )) {
    wc_add_notice( __( 'Please enter a date.', 'woocommerce' ), 'error' );
    $passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );  

您想要返回TRUE变量的当前状态,而不是返回$passed。我不能保证会工作,因为我不会设置测试它所需的其余代码,但这与我多次做的类似。

另一方面,除非您的意思是将此验证应用于商店中的每个产品,否则您需要使用一些额外的条件逻辑来限制此功能。

答案 1 :(得分:0)

我遇到了这个问题,经过反复试验,解决方法是在:中调整$ priority参数(默认为10)。

add_filter( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );

和往常一样,我首先尝试了其他所有方法……将其更改为15,然后宾果游戏..!我猜它是在代码优先级较低的代码之前运行的,该代码然后将项目放入购物车。

答案 2 :(得分:-4)

是的,对不起,我是这个论坛的新手。 但是我找到了一个解决方案,我在第900行直接编辑了 class-wc-cart.php ,我在if之前复制了这个函数:

if($passed!=false)
{
    do_action( 'woocommerce_add_to_cart', $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data );
}

现在对我来说它有效,我知道这不是最正确的解决方案,但目前它的工作原理,我只有要小心当我更新woocommerce < /强>