Ad
Add A Custom Select Field With Collection Times In WooCommerce Checkout
I have created a custom checkout field for collection times on my website (see image attached)
This is my current code:
add_action('woocommerce_before_order_notes', 'njengah_add_select_checkout_field');
function njengah_add_select_checkout_field( $checkout ) {
woocommerce_form_field( 'daypart', array(
'type' => 'select',
'class' => array( 'njengah-drop' ),
'label' => __( 'Collection Time' ),
'required' => true,
'options' => array(
'blank' => __( 'Select a collection time', 'njengah' ),
'5:00_PM' => __( '5:00 PM', 'njengah' ),
'5:30_PM' => __( '5:30 PM', 'njengah' ),
'6:00_PM' => __( '6:00 PM', 'njengah' ),
'6:30_PM' => __( '6:30 PM', 'njengah' ),
'7:00_PM' => __( '7:00 PM', 'njengah' ),
'7:30_PM' => __( '7:30 PM', 'njengah' ),
'8:00_PM' => __( '8:00 PM', 'njengah' )
)
), $checkout->get_value( 'daypart' ));
}
However, the intention is to hide collection times when time has passed
E.G. - If its 6pm hide: 5:00 PM and 5:30 PM
Any help would be great
Ad
Answer
Use WordPress current_time() function which retrieves the current time based on specified type.
From that point on you can further customize your code to suit your needs, so you get:
function action_woocommerce_before_order_notes( $checkout ) {
// Open and close time
$start_time = strtotime( '9:00 AM' );
$stop_time = strtotime( '1:00 PM' );
/* END SETTINGS */
// Current time
$current_time = current_time( 'timestamp' );
// Initialize
$remaining_times = array();
$required = true;
// Closed
if( $current_time > $stop_time || $current_time <= $start_time ) {
// Default value
$default[''] = __( 'Closed', 'woocommerce');
// False
$required = false;
} else {
// Default value
$default[''] = __( 'Select a collection time', 'woocommerce');
// Determine first value
$first_value = strtotime( date( 'g:i A', ceil( $current_time / 1800 ) * 1800 ) );
// Add a new option every 30 minutes
while( $first_value <= $stop_time && $first_value >= $start_time ) {
$value = date( 'g:i A', $first_value );
$remaining_times[$value] = $value;
// Add 30 minutes
$first_value = strtotime( '+30 minutes', $first_value );
}
}
// Options
$options = array_merge( $default, $remaining_times );
// Add field
woocommerce_form_field( 'daypart', array(
'type' => 'select',
'class' => array( 'njengah-drop' ),
'label' => __( 'Collection Time', 'woocommerce' ),
'required' => $required,
'options' => $options,
), $checkout->get_value( 'daypart' ));
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );
E.G.
- Current time = 9:14 AM
- First value = 9:30 AM
- Last value = 1:00 PM (stop time)
Additional question: Suppose the start time is 5:00 PM and the stop time is 8:00 PM. How can I give the customers the opportunity to order from 12:00 PM, while the first slot is 5:00 PM?
Use the following code instead:
function action_woocommerce_before_order_notes( $checkout ) {
// Display time, open and close time
$display_time = strtotime( '12:00 PM' );
$start_time = strtotime( '5:00 PM' );
$stop_time = strtotime( '8:00 PM' );
// END SETTINGS
// Current time
$current_time = current_time( 'timestamp' );
// Initialize
$remaining_times = array();
$required = true;
// Closed
if( $current_time > $stop_time || $current_time <= $display_time ) {
// Default value
$default[''] = __( 'Closed', 'woocommerce');
// False
$required = false;
} else {
// Default value
$default[''] = __( 'Select a collection time', 'woocommerce');
// Determine first value
$first_value = strtotime( date( 'g:i A', ceil( $current_time / 1800 ) * 1800 ) );
// First value is less than start time
if ( $first_value < $start_time ) {
$first_value = $start_time;
}
// Add a new option every 30 minutes
while( $first_value <= $stop_time && $first_value >= $start_time ) {
$value = date( 'g:i A', $first_value );
$remaining_times[$value] = $value;
// Add 30 minutes
$first_value = strtotime( '+30 minutes', $first_value );
}
}
// Options
$options = array_merge( $default, $remaining_times );
// Add field
woocommerce_form_field( 'daypart', array(
'type' => 'select',
'class' => array( 'njengah-drop' ),
'label' => __( 'Collection Time', 'woocommerce' ),
'required' => $required,
'options' => $options,
), $checkout->get_value( 'daypart' ));
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );
E.G.
- Current time = 12:05 PM
- First value = 5:00 PM
- Last value = 8:00 PM (stop time)
Ad
source: stackoverflow.com
Related Questions
- → "failed to open stream" error when executing "migrate:make"
- → October CMS Plugin Routes.php not registering
- → OctoberCMS Migrate Table
- → OctoberCMS Rain User plugin not working or redirecting
- → October CMS Custom Mail Layout
- → October CMS - How to correctly route
- → October CMS create a multi select Form field
- → October CMS - Conditionally Load a Different Page
- → How to disable assets combining on development in OctoberCMS
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → OctoberCms component: How to display all ID(items) instead of sorting only one ID?
- → In OctoberCMS how do you find the hint path?
- → How to register middlewares in OctoberCMS plugin?
Ad