Plugin Author
Franky
(@liedekef)
You’re mixing up adding a discount (add_action) with a verification (add_filter). See http://www.e-dynamics.be/wordpress/?cat=41
And popup’s in those hooks won’t work as you want them. Read the examples in the link on how to return error codes after verification.
If you want a popup, you’ll need to use jquery code on your page.
Thank you so much for giving me that nudge in the right direction! I didn’t want a popup and I didn’t want to use jQuery but I couldn’t figure out where to start.
This works, but . . .
add_filter('eme_eval_booking_form_post_filter','validate_coupon');
function validate_coupon($event) {
$coupon = $_POST['FIELD9'];
$error = "Invalid Coupon Code!";
if ($coupon == "" || $coupon == "save10") {
// eval is success
return array(0=>1,1=>'');
} else {
// bad form entry
return array(0=>0,1=> $error);
}
}
I’m still a little confused about how to access the coupon code field. The code from the discount action wasn’t working to call the Coupon Code in the validation filter – so I just went back to ‘$_Post’. The other thing that confused me is that I’ve usually done the negative. In other words if the field is not empty and it’s not the right code – then it doesn’t validate. That didn’t seem to work for some reason, so I had to use the positive – if it is empty and it is the right coupon code then it validates.
Anyway, it’s functioning but I’d be grateful for any more comments.
K
Plugin Author
Franky
(@liedekef)
Well, since you’re doing an evaluation on a form not yet entered in the DB, you need to use the $_POST variable, so it is correct.
And in your case the test is logical: either the value is empty (no discount, but no error either) or it has a specific value.
But, as said: that only does an evaluation on what is entered of course. For the actual discount you need add_action(…) (as stated in the doc, with a discount example)
Plugin Author
Franky
(@liedekef)
Btw: it is on my to-do list to provide an easier method of discounts, but it’s a big job …
Thank you, again, for your help. I’ve spent more time playing in straight php and javascript than within the WP framework. Every once in a while, when the gate closes, I go a little crazy trying to figure out how to do things inside the gate.
As I said above, I got the discount ($10) action working before it occurred to me that I needed to validate the field in order to keep any incorrect or invalid codes from being completely ignored. I needed to take $10 off of the total of a multi-price(4 prices) form but I could only find examples for a percentage discount. The examples helped but getting to the total was challenging. I’m not sure I fully understand the elements in that code either (specifically, getting the $coupon variable & using the each individual product price instead of working with the total) but it seems to work.
FWIW, here’s the discount code action for the $10 discount:
add_action('eme_insert_rsvp_action', 'my_eme_coupons',20,1);
/**
* Custom function to calculate coupon code discounts for events
*/
function my_eme_coupons($booking) {
global $wpdb;
$bookings_table = $wpdb->prefix.BOOKINGS_TBNAME;
$where = array();
$fields = array();
// Grab the coupon code from the extra answers
$event_id = $booking['event_id'];
$booking_id = $booking['booking_id'];
$answers = eme_get_answers($booking_id);
$coupon = "";
foreach ($answers as $answer) {
if ($answer['field_name'] == "Coupon") {
$coupon = $answer['answer'];
}
}
// If coupon code used, apply the appropriate price change
/* COUPON CODE TO USE */
if ($coupon == "COUPON_CODE") {
/* TAKE OFF $10 */
$actualseats=$booking['booking_seats'];
$discount = 10;
//Covert Price to Array and take $10 from first price listed
$price=eme_convert_multi2array($booking['booking_price']);
$price[0] = $price[0]- ($discount/$actualseats);
$price[1] = $price[1]- ($discount/$actualseats);
$price[2] = $price[2]- ($discount/$actualseats);
$price[3] = $price[3]- ($discount/$actualseats);
//Convert Array back to price
$fields['booking_price'] = eme_convert_array2multi($price);
$where['booking_id'] = $booking['booking_id'];
$wpdb->update($bookings_table, $fields, $where);
}
return;
}