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