Change prices of menu item(s) depending on day of week
Dynamically change menu items prices depending on weekday
a filter to change menu items prices depending on day of week. To use in your theme’s functions.php using the wordpress standard get_post_metadata filter
get_post_metadata (wordpress standard filter)
@param: array
@return: array
example:
/***
change "myprefix" occurences with your own prefix
change sections labelled "== ADJUST .....== as required
***/
add_filter('get_post_metadata', 'myprefix_wppizza_item_price', 10, 4);
function myprefix_wppizza_item_price($metadata, $object_id, $meta_key, $single) {
/********************************
skip if non wppizza meta key
********************************/
if( $meta_key != 'wppizza' ){ return;}
/*******************************
menu item id's that need to change prices depending on day
== ADJUST ID'S (wppizza menu item id's) AS REQUIRED ==
********************************/
$menu_item_ids=array(5,65,66,32);
/**
if menu item id not in array above, skip
**/
if(!in_array($object_id, $menu_item_ids )){return;}
/********************************
get current weekday
*********************************/
$current_weekday=date('w',current_time('timestamp'));//Numeric representation of the day of the week. 0 (for Sunday) through 6 (for Saturday)
/**
only change prices on wednesdays
(i.e current_weekday==3), else skip
== ADJUST WEEKDAY INTEGER AS REQUIRED ==
**/
if($current_weekday!=3){ return ;}
/************************************
ok, now let's change meta prices
*************************************/
/*get current cached data*/
$meta_cache = wp_cache_get( $object_id, 'post_meta' );
/**
if cache is empty (always, on all ajax calls it seems) get meta data
however, we need to remove and re-add filter or we'll end up in an
infinite loop !
**/
if(empty($meta_cache)){
/*remove filter*/
remove_filter( 'get_post_metadata', 'myprefix_wppizza_item_price', 10 );
$meta_cache[$meta_key][0]=get_post_meta($object_id, $meta_key, true );
add_filter('get_post_metadata', 'myprefix_wppizza_item_price', 10, 4);
}
/*filter expects array as return*/
$metadata=array();
/**unserialize meta*/
$metadata[0] = maybe_unserialize($meta_cache[$meta_key][0]) ;
/************************************
set prices as needed
price tiers are zero indexed
[ == ADJUST PRICE ADJUSTMENST AS REQUIRED == ]
if you need this changed differently for each individual menu item,
wrap the below into a conditional like
if($object_id=65){...}
if($object_id=66){...}
etc
*************************************/
/**first (smallest -> index 0 ) size -> minus 0.50**/
$metadata[0]['prices'][0]=$metadata[0]['prices'][0]-0.5;
/**second (medium -> index 1 ) size, if exists -> minus 1.20**/
if(!empty($metadata[0]['prices'][1])){
$metadata[0]['prices'][1]=$metadata[0]['prices'][1]-1.2;
}
/**third (largest -> index 2 ) size, if exists -> minus 1.50**/
if(!empty($metadata[0]['prices'][2])){
$metadata[0]['prices'][2]=$metadata[0]['prices'][2]-1.5;
}
/*
if you have more than 3 sizes, change indexes as required (zero indexed)
the 4th would become
[0]['prices'][3]
the 5th would become
[0]['prices'][4]
and so on
*/
/**return the changed meta data**/
return $metadata;
}