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


WooCommerce add to cart validation: prevent add to cart

我有一个woocommerce的问题,我试图修复几天。

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

在产品页面上,我有一个添加到购物车按钮,数量输入和日期输入。

日期输入;是自由职业者做的。

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

代码:(显然也)

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 );    

视图:https://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 );

我本来想说你应该使用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变量的当前状态。我不能保证这将有效,因为我不打算设置测试它所需的其余代码,但这与我已经做过很多次的类似。

另一方面,除非您打算将此验证应用于商店中的每个产品,否则您需要使用一些附加的条件逻辑来限制此函数。

我有这个问题,经过多次试验和错误的修复是调整$priority参数(10是默认值):

add_filter( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );
和往常一样,我先尝试了其他方法……将其更改为15和bingo…!我猜它运行在优先级较低的代码之前,然后让商品进入购物车。
// Allow only pre-defined quantity from specific per category in the cart
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) {
  $running_qty = 0;
  $restricted_product_cats = $restricted_product_cat_slugs = array();
    //Specify the category/categories by category slug and the quantity limit
    $restricted_product_cats[] = array('cat_slug'=> 'skip-bins', 'max_num_products' => 1); // change here
    //$restricted_product_cats[] = array('cat_slug'=> 'caliper-paint-kit', 'max_num_products' => 4); //change here
    foreach($restricted_product_cats as $restricted_prod_cat) $restricted_product_cat_slugs[]= $restricted_prod_cat['cat_slug'];
    // 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 ){

        // Check if restricted category/categories found
      if( array_intersect($restricted_product_cat_slugs, $current_product_cats) ) {
        foreach($restricted_product_cats as $restricted_product_cat){
          if( in_array($restricted_product_cat['cat_slug'], $current_product_cats) && has_term( $current_product_cats, 'product_cat', $cart_item['product_id'] )) {
                    // count(selected category) quantity
            $running_qty += (int) $cart_item['quantity'];
                    // Check if More than allowed products in the cart
            if( $running_qty >= $restricted_product_cat['max_num_products'] ) {
                        //limit to maximum allowed
                        //WC()->cart->set_quantity( $cart_item_key, $restricted_product_cat['max_num_products'] ); // Change quantity
                        // Get the category information
              $catinfo = get_term_by('slug', $restricted_product_cat['cat_slug'], 'product_cat');
              wc_add_notice( sprintf( 'Maximum of  %s '.($restricted_product_cat['max_num_products']>1?'skip bin ('.$catinfo->name.') are':'skip bin').' allowed in the cart. Please remove the existing Skip Bin from the cart to add the new Skip Bin',  $restricted_product_cat['max_num_products'] ), 'error' );
                         ///WC()->cart->empty_cart();
                        $passed = false; // don't add the new product to the cart
                        // We stop the loop
                        break;
                      }
                    }
                  }
                }
              }
              return $passed;
}

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

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

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