Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WooCommerce add to cart validation: prevent add to cart

I have a probleme with woocommerce that im trying to fix for few days.

I am creating a website for a guy and he wanted me to add a custom input on the product page, I couldn't do it myself so I used a freelancer online for it.

On the product page I have an add-to-cart button, quantity input and date input.

The "date input" is the freelancer did.

The thing is that when the $_REQUEST['thedate'] is empty the custom error popup but the product still added to the cart.

the code:(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 );    

the view: http://i.stack.imgur.com/a75P6.png

  • How can i prevent the product to add itslef to the cart?

other codes the freelancer did:

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 );
like image 751
Eyal Avitan Avatar asked Jun 09 '15 15:06

Eyal Avitan


Video Answer


1 Answers

I would have said that you should use Product Add-Ons but it doesn't seem to have a date picker. Anyway, I would try modifying your validation function as follows:

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

Instead of returning TRUE you want to return the current status of the $passed variable. I can't promise that will work, because I am not going to set up the rest of the code required to test it, but this is similar to what I have done many times.

On another note, unless you mean to apply this validation to every product in your store, you need to limit this function with some additional conditional logic.

like image 197
helgatheviking Avatar answered Nov 04 '22 14:11

helgatheviking