Author: super_admin_v3x
Coupons and Discounts
Preorder
Customisations WPPizza Preorder
Highlighting preorders for days after today in *emails* sent (for print templates, simply use css declarations)
Your email template(s) selected MUST be set to “Html” for this to make any difference set conditionals as required
@param: array
@param: array
@param: str
@param: int
@param: array
@return: array
add_filter( 'wppizza_filter_template_section_customer_styles', 'myprefix_set_email_styles', 10, 5 ); function myprefix_set_email_styles($template_styles, $parameters, $template_type, $template_id, $order){ /* restricting to email templates here */ if($template_type == 'emails'){ /* set as variable for ease of use */ $pluginSlug = 'wppizza_preorder'; /* get preorder meta value / timestamp this will be something like '2021-02-11 13:45:00' OR 'asap' if nothing was selected */ $preorder = wppizza_get_order_meta($order['ordervars']['order_id']['value'], $pluginSlug, true ); /* end of day today, based on wordpress timezone settings current time */ $eod = date('Y-m-d 23:59:59', WPPIZZA_WP_TIME); /* as an example, make the preorder text in the emails red if preorder time is on/after midnight tonight and set fontsize set your conditionals as required */ if($preorder !='asap' && $preorder > $eod ){ $template_styles[''.$pluginSlug.'-tdall'] = 'color:red;font-size:120%'; } } return $template_styles; }
Adding additional date format(s) – (see php date format for details)
As with all customisations, use at your own risk. You should test this thoroughly, especially if you want to use textual representations of a part of the date (months, weekdays) or separators other than:
- “/”(slash)
- “-“(hyphen)
- ” “(space)
- “.”(dots)
Whatever you do, do not use/enable “j F, Y” here as the comma after a textual month will stop the javascript library used from validating the date
@param: array
@return: array
add_filter( 'wppizza_po_filter_dateformat', 'myprefix_add_po_date_format'); function myprefix_add_po_date_format($date_format){ /* just as example how to do this, this already exists as an option */ $date_format[] = 'M j, Y'; return $date_format; }
Alter preorder date/time format *after an order has been made* (I.e in thank you page, emails etc ), regardless of plugin settings
@param: array
@param: array
@param: array
@param: array
@return: array
add_filter('wppizza_filter_order_details_formatted', 'my_custom_details_formatted', 10, 4); function my_custom_details_formatted($order_formatted, $order_ini, $customer_ini, $order_values){ /* preorder plugin slug */ $plugin_slug = 'wppizza_preorder'; /* order id */ $order_id = $order_values['id']; /* get preorder metavalue timestamp, and reformat from timestamp skip if 'asap' */ $preorder_meta_value = wppizza_get_order_meta( $order_id, $plugin_slug, true); if(!empty($preorder_meta_value) && $preorder_meta_value != 'asap'){ /* set desired format */ $custom_format = date('l, d M Y @ H|i|s', strtotime($preorder_meta_value)); /* alter output of preorder value in emails prints etc */ $order_formatted['sections']['customer'][$plugin_slug]['value'] = $custom_format; } return $order_formatted; }
Layout (Menu Items, General)
Checkout Formfields
Modify the customer form fields available on the checkout page
A few examples as to how you can show/hide/add/modify input formfields available on the checkout page
Simple show/hide formfields using css selectors
If you wish to simply show hide some formfields when an order is set to be a pickup order.
See here , for options as to where to add this css
example:
/********************************************************** target specific elements on pickup use your browsers element inspector to ascertain the exact classname you need to target **********************************************************/ .wppizza-order-ispickup .wppizza-personal-details > .wppizza-cname{display:none} .wppizza-order-ispickup .wppizza-personal-details > .wppizza-caddress{display:none} /* etc etc */
Make sure to not hide things that you have also set to be “required” (unless they are already prefilled in some way) or the customer will never be able to check out …
wppizza_register_formfields
Add / modify a formfield on the checkout page. First of all, you can of course already add/remove and conditionally set various formfield properties by going to WPPizza ->Order Form
. If you however need some more granular control or simply add your own, see the examples below
.
example:
/*************************************************** add the filter and corresponding function ****************************************************/ add_filter('wppizza_register_formfields', 'my_prefix_modify_wppizza_formfields'); function my_prefix_modify_wppizza_formfields($formfields){ /* *unique* identifier for the formfield you want to add if you add more than one, each one must be a unique id for simplicity and demonstration purposes the some is being used here for all ! if you wish ta alter an already existing formfield use that formfields key instead a print_r($formfields) will show you all registered formfields and their keys if you need to identify a particular one */ $unique_ident = 'my_unique_formfield_id'; /*********************************************** adding a text formfield ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* label displayed for the formfield */ 'lbl' => 'some label', /* should be defined as an array, with the first value being false */ 'value' => array(false), /* set to text to display a text input */ 'type' => 'text', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise */ 'required' => true, /* true to make the field required on pickup, false otherwise */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* input placeholder */ 'placeholder' => 'my placeholder', /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array*/ 'validation' => array( 'default' => true, ), ); /*********************************************** adding a select dropdown ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* label displayed for the formfield */ 'lbl' => 'some label', /* an array of available dropdown values*/ 'value' => array('1st value','2nd value','3rd value','Nth value'), /* set to select to display a select dropdown*/ 'type' => 'select ', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise */ 'required' => true, /* true to make the field required on pickup, false otherwise */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* placeholder - used as initial, non-selected value or bool false / empty */ 'placeholder' => '--please select--', /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array, however as this is a select field , the rules as set below are really the only sensible setting here */ 'validation' => array( 'default' => true, ), ); /*********************************************** adding radio inputs ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* label displayed for the formfield */ 'lbl' => 'some label', /* an array of available radio values*/ 'value' => array('1st value','2nd value','3rd value','Nth value'), /* set to select to display radio choices */ 'type' => 'radio', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise */ 'required' => true, /* true to make the field required on pickup, false otherwise */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* ignored for radios */ 'placeholder' => false, /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array, however as these are radio inputs, the rules as set below are really the only sensible setting here */ 'validation' => array( 'default' => true, ), ); /*********************************************** adding a checkbox ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* label displayed for the checkbox */ 'lbl' => 'some label', /* ignored, but should be set to avoid php notices*/ 'value' => array(false), /* set to select to display multiple checkbox choices */ 'type' => 'checkbox', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise */ 'required' => true, /* true to make the field required on pickup, false otherwise */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* ignored for checkboxes*/ 'placeholder' => false, /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array, however as these are radio inputs, the rules as set below are really the only sensible setting here */ 'validation' => array( 'default' => true, ), ); /*********************************************** adding multiple checkbox choices ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* label */ 'lbl' => 'some label', /* an array of checkboxes */ 'value' => array('1st value','2nd value','3rd value','Nth value'), /* set to select to display multiple checkbox choices */ 'type' => 'multicheckbox', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise */ 'required' => true, /* true to make the field required on pickup, false otherwise */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* ignored for checkboxes*/ 'placeholder' => false, /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array, however as these are radio inputs, the rules as set below are really the only sensible setting here */ 'validation' => array( 'default' => true, ), ); /*********************************************** adding a hidden formfield ***********************************************/ $formfields[$unique_ident ] = array( /* sort order - at which position is this field displayed */ 'sort' => 100, /* the unique ident */ 'key' => $unique_ident , /* ignored for hidden fields */ 'lbl' => false, /* should be defined as an array, with the first value being false */ 'value' => array(false), /* set to hidden to display a hidden input */ 'type' => 'hidden', /* true to enable (pointless to set this to false)*/ 'enabled' => true, /* true to make the field required on delivery, false otherwise . Warning: if you set this to true, without prefilling it (see below) the customer will never be able to order when delivery is selected ! */ 'required' => true, /* true to make the field required on pickup, false otherwise . Warning: if you set this to true, without prefilling it (see below) the customer will never be able to order when pickup is selected ! */ 'required_on_pickup' => true, /* true to prefill with a value if it is known (will only ever do anything with 'onregister' being true as well) */ 'prefill' => false, /* true to make field part of the user registration values */ 'onregister' => false, /* true to add the value entered to the email subject */ 'add_to_subject_line' => false, /* ignored for hidden fields */ 'placeholder' => false , /* validation as available wppizza->order form. as there can be multiple validation rules, this should be an array, however as this is a hidden inputs, the rules as set below are really the only sensible setting here */ 'validation' => array( 'default' => true, ), ); /*********************************************** removing a formfield simply unset , or disable ***********************************************/ unset($formfields[$unique_ident]); //unset $formfields[$unique_ident]['enabled'] = false ; //disable /*********************************************** if you want to disable/not show a field when pickup is selected ***********************************************/ if(wppizza_is_pickup()){//simply use !wppizza_is_pickup() for the reverse unset($formfields[$unique_ident]); //unset $formfields[$unique_ident]['enabled'] = false ; //disable } return $formfields; }
For additional conditionals that might be useful (‘cart is empty’ and similar), also see here
Pre-filling form fields
If a formfield is set to have ‘onregister’ and ‘prefill’ set to true, the relevant value will be prefilled/selected when a user logs in, if you want to or need to (especially with hidden fields) always pre-set a specific value I’d suggest something like the below
example:
add_action('init', 'myprefix_prefill_formfields'); function myprefix_prefill_formfields(){ /* prefill a value if it has not ever been set *unique* identifier for the formfield you want to prefill */ $unique_ident = 'my_unique_formfield_id'; if(!isset($_SESSION[WPPIZZA_SLUG.'_userdata'][$unique_ident])){ /* text / hidden formfields */ $_SESSION[WPPIZZA_SLUG.'_userdata'][$unique_ident] = 'some input value'; /* radios - one of the values as defined in 'value' array of the registered formfield*/ $_SESSION[WPPIZZA_SLUG.'_userdata'][$unique_ident] = '2nd value'; /* checkbox (single) - boolean */ $_SESSION[WPPIZZA_SLUG.'_userdata'][$unique_ident] = true; //bool /* checkbox (multiple) - one or more of the values as defined in 'value' array ofthe registered formfield*/ $_SESSION[WPPIZZA_SLUG.'_userdata'][$unique_ident] = array('1st value','3rd value') ; //array } return; }
Email Subject Line
Enable Debug
Headers already sent …
if you get something like:
Warning: session_start(): Cannot start session when headers already sent in [site-path]/wp-content/plugins/wppizza[xyz]/[some-file] on line [some-line]
or
Warning: cannot modify header information - headers already sent by [site-path]/[some-dicetory]/[some-file] on line [some-line]
The problem is that either:
- – php notices/warnings/errors etc are output to the site instead of being logged
- – another plugin – or your theme/child theme – is outputting content where it should not.
Although the session start warning references a wppizza file, this is *not* in fact a wppizza error/fault (as confusing as this might seem, admittedly) but it points to some other file or plugin outputting content before it should do.
If it’s a “cannot modify header information – headers already sent by” instead, it typically also tells some file and line number.
First of all
:
- – make sure you do not output any warnings etc by setting your debug like so or even disabling debug altogether if that’s acceptable in your scenario (wppizza does it’s best to ignore those, but has no influence over other plugins of course)
- – once you have done so, check your site again (clear you browser cache) as this might be all you need to do to make it all work again. Fix other error/notices/warnings at your leaisure
Then – if you are still having session related issues
:
- – disable all other *non*-wppizza plugins and switch to a wordpress default theme (twenty-xyz) , at least temporarily.
- – assuming disabling everything non-wppizza related solves the issue, re-enable your plugins/themes one by one, until it does not work again (so you know what is causing it)
- – fix the issue following the suggestions/guide/answer here or better still, contact the theme/plugin author to fix it.
- – in the event that the above does still not solve your problem, contact me , making sure to send me relevant info (debug.log, url , version numbers etc ) via the usual channels (contact/email/forums)
PS | FYI: Wppizza uses native php sessions – extensively – that simply will not work if other scripts/plugins/themes output content where they should not.