Skip to content

Instantly share code, notes, and snippets.

@renjith-ph
Last active January 21, 2019 05:52
Show Gist options
  • Save renjith-ph/34f4ebed0daa830fb1677666906b726e to your computer and use it in GitHub Desktop.
Save renjith-ph/34f4ebed0daa830fb1677666906b726e to your computer and use it in GitHub Desktop.
Snippet to change estimate delivery based on variable product (backorder and instock).
/**
* Snippet to change estimate delivery based on variable product (backorder and instock).
* Created at : 19 Jan 2019
* PluginHive Plugins : https://www.pluginhive.com/plugins/
*/
add_filter( 'woocommerce_get_availability', 'woocommerce_get_availability',12,2 );
function woocommerce_get_availability( $stock_arr ,$item) {
if( empty($item) ){
global $product;
if( ! is_object($product) ) {
global $post;
$product = wc_get_product($post->ID);
}
$item = $product;
}
$date_format='d/m/Y'; // should same as date format in plugin settings
$backorder_available=array(
'370' => '21/01/2019', // variable id => no of days for backorder
'61' => '20/12/2018'
);
$instock_available=array(
'370' => '21/01/2019', // variable id => no of days for instock
'61' => '20/12/2018'
);
$product_id=$item->get_id();
if(!empty($stock_arr) && !empty($stock_arr['availability']) && ($item->get_stock_status()=='onbackorder'|| $item->get_stock_status()=='instock') )
{
$display_text="Estimated delivery by"; // should be same as Product Page Text in plugin settings
$text_arr=explode($display_text, $stock_arr['availability']);
$availability=$stock_arr['availability'];
if(isset($text_arr[1]))
{
$product_page_sample_text = get_option('wf_estimated_delivery_product_page_text_simple');
$product_page_sample_text = !empty( $product_page_sample_text ) ? $product_page_sample_text : '<p style="color:green;font-size:small">'.__( 'Estimated delivery by', 'wf_estimated_delivery' ).' [date]</p>';
$product_page_text_range = get_option('wf_estimated_delivery_product_page_text_range');
$product_page_text_range = !empty( $product_page_text_range ) ? $product_page_text_range : '<p style="color:green;font-size:small">'.__( 'Estimated delivery by','wf_estimated_delivery' ).' [date_1] - [date_2]</p>';
$product_page_sample_text = apply_filters( 'wpml_translate_single_string', $product_page_sample_text, 'wf_estimated_delivery', 'product_page_simple_text');
$product_page_text_range = apply_filters( 'wpml_translate_single_string', $product_page_text_range, 'wf_estimated_delivery', 'product_page_range_text');
if($item->get_stock_status()=='instock')
{
if(!isset($instock_available[$product_id]))
{
return $stock_arr;
}
$available_within=date_create_from_format('d/m/Y',$instock_available[$product_id]);
}
else
{
if(!isset($backorder_available[$product_id]))
{
return $stock_arr;
}
$available_within=date_create_from_format('d/m/Y',$backorder_available[$product_id]);
}
$current_time = current_time('Y m d H:i:s');
$today_wp_date = date_create_from_format( 'Y m d H:i:s', $current_time);
$today_wp_date_seconds = $today_wp_date->format('U');
$available_within = ceil( ($available_within->format('U') - $today_wp_date_seconds ) / 86400 );
$date_array=explode('</p>', $text_arr[1]);
$date_arr=explode('-', $date_array[0]);
if(!isset($date_arr[1])) // for simple range
{
$date= date_create_from_format( $date_format ,trim($date_arr[0]));
if( is_a($date, 'DateTime') ) {
$date->modify("+$available_within days");
$true=1;
$wf_workdays=get_option( 'wf_estimated_delivery_operation_days' );
while($true==1)
{
if(in_array( strtolower(date_format($date,'D')), $wf_workdays ))
{
$true=0;
}
else
{
$date->modify( "1 day" );
}
}
$date=$date->format($date_format);
$availability = str_replace('[date]', $date , $product_page_sample_text );
$old_text=str_replace('[date]', trim($date_arr[0]) , $product_page_sample_text );
}
}
$old_availability=explode($old_text,$stock_arr['availability']);
$stock_arr['availability']=$old_availability[0].$availability;
}
}
return $stock_arr;
}
add_filter( 'xa_estimated_delivery_cart_checkout_page_html_formatted_date', 'xa_estimated_delivery_cart_checkout_page_html_formatted_date',10,2 );
function xa_estimated_delivery_cart_checkout_page_html_formatted_date( $text, $test ) {
global $woocommerce;
$date_format='d/m/Y'; // should same as date format in plugin settings
$backorder_available=array(
'370' => '21/01/2019', // variable id => no of days for backorder
'61' => '20/12/2018'
);
$instock_available=array(
'370' => '21/01/2019', // variable id => no of days for instock
'61' => '20/12/2018'
);
$items = $woocommerce->cart->get_cart();
$max_count=0;
foreach($items as $item => $values) {
$product_id=$values['data']->get_id();
if($values['data']->get_stock_status()=='onbackorder' || $values['data']->get_stock_status()=='instock' )
{
if($values['data']->get_stock_status()=='instock')
{
if(!isset($instock_available[$product_id]))
{
return $text;
}
$available_within=date_create_from_format('d/m/Y',$instock_available[$product_id]);
}
else
{
if(!isset($backorder_available[$product_id]))
{
return $text;
}
$available_within=date_create_from_format('d/m/Y',$backorder_available[$product_id]);
}
$current_time = current_time('Y m d H:i:s');
$today_wp_date = date_create_from_format( 'Y m d H:i:s', $current_time);
$today_wp_date_seconds = $today_wp_date->format('U');
$available_within = ceil( ($available_within->format('U') - $today_wp_date_seconds ) / 86400 );
if($max_count<$available_within)
{
$max_count=$available_within;
}
}
}
$display_text = "Estimated Delivery"; // Text for Estimated delivery
$text_array = explode( '<td data-title="'.$display_text.'" >', $text ); //cart
if(!isset($text_array[1])) // check text format is simple
{
$text_array = explode( '<td data-title="'.$display_text.'">', $text ); //checkout
if(!isset($text_array[1])) // check text format is simple
{
return $text;
}
}
$text_array = explode( '</td></tr>', $text_array[1] );
$prev_date_arr = explode( '-', $text_array[0] ); //Contains the date in case of date range
if(!isset($prev_date_arr[1])) {
$max_date = date_create_from_format( $date_format, trim($prev_date_arr[0]) );
$max_date->modify( "$max_count day" );
$true=1;
$wf_workdays=get_option( 'wf_estimated_delivery_operation_days' );
while($true==1)
{
if(in_array( strtolower(date_format($max_date,'D')), $wf_workdays ))
{
$true=0;
}
else
{
$max_date->modify( "1 day" );
}
}
$text = '<tr class="shipping"><th> '.$display_text.'</th><td data-title="'.$display_text.'"> '.$max_date->format($date_format) .'</td></tr>';
}
return $text;
}
// Adjustment on Thank you page.
add_filter( 'xa_estimated_delivery_thank_you_page_html_formatted_date', 'xa_estimated_delivery_thank_you_page_html_formatted_date', 10, 2 );
function xa_estimated_delivery_thank_you_page_html_formatted_date( $text, $test ) {
global $woocommerce;
$date_format='d/m/Y'; // should same as date format in plugin settings
$backorder_available=array(
'370' => '21/01/2019', // variable id => no of days for backorder
'61' => '20/12/2018'
);
$instock_available=array(
'370' => '21/01/2019', // variable id => no of days for instock
'61' => '20/12/2018'
);
$items = $woocommerce->cart->get_cart();
$max_count=0;
foreach($items as $item => $values) {
$product_id=$values['data']->get_id();
if($values['data']->get_stock_status()=='onbackorder' || $values['data']->get_stock_status()=='instock' )
{
if($values['data']->get_stock_status()=='instock')
{
if(!isset($instock_available[$product_id]))
{
return $text;
}
$available_within=date_create_from_format('d/m/Y',$instock_available[$product_id]);
}
else
{
if(!isset($backorder_available[$product_id]))
{
return $text;
}
$available_within=date_create_from_format('d/m/Y',$backorder_available[$product_id]);
}
$current_time = current_time('Y m d H:i:s');
$today_wp_date = date_create_from_format( 'Y m d H:i:s', $current_time);
$today_wp_date_seconds = $today_wp_date->format('U');
$available_within = ceil( ($available_within->format('U') - $today_wp_date_seconds ) / 86400 );
if($max_count<$available_within)
{
$max_count=$available_within;
}
}
}
$display_text = "Estimated Delivery"; // Text for Estimated delivery
$text_array = explode( '-', trim( $text) );
if(!isset($text_array[1])) {
$max_date = date_create_from_format( $date_format, trim($text_array[0]) );
$max_date->modify( "$max_count day" );
$true=1;
$wf_workdays=get_option( 'wf_estimated_delivery_operation_days' );
while($true==1)
{
if(in_array( strtolower(date_format($max_date,'D')), $wf_workdays ))
{
$true=0;
}
else
{
$max_date->modify( "1 day" );
}
}
$text = $max_date->format($date_format);
}
return $text;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment