6
votes

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

3 Answers

9
votes

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.

2
votes

I had this issue and after much trial and error the fix was to adjust the $priority parameter (10 is default) in :

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

As per usual, I tried everything else first...changed this to 15 and bingo..! I guess it was running ahead of code ranked lower priority, which then let items into cart.

-9
votes

Yes, sorry i'am new in this forum. However i have found a solution, i have edit directly class-wc-cart.php at line 900, and i have copy the function before the if:

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

Now for me it works, i know that isn't the most correct solution but for the moment it works, i have only to be careful when i will update woocommerce