我在我的woocommerce网站上使用
Woothemes booking
当我构建自定义搜索产品时,我还要搜索可用性,这里是我应该如何管理B.O的可用性以及插件如何存储到数据库
a:8:{i:0;a:4:{s:4:"type";s:4:"days";s:8:"bookable";s:3:"yes";s:4:"from";s:1:"3";s:2:"to";s:1:"3";}i:1;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-09";s:2:"to";s:10:"2015-07-09";}i:2;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-08";s:2:"to";s:10:"2015-07-08";}i:3;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-10";s:2:"to";s:10:"2015-07-10";}i:4;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-15";s:2:"to";s:10:"2015-07-15";}i:5;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-16";s:2:"to";s:10:"2015-07-16";}i:6;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-17";s:2:"to";s:10:"2015-07-17";}i:7;a:4:{s:4:"type";s:6:"months";s:8:"bookable";s:2:"no";s:4:"from";s:1:"8";s:2:"to";s:1:"8";}}
我可以从wordpress内置函数get_post_meta中检索这些值,
$avail = get_post_meta($product->id,'_wc_booking_availability');
结果是:
Array ( [0] => Array ( [type] => days [bookable] => yes [from] => 3 [to] => 3 ) [1] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-09 [to] => 2015-07-09 ) [2] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-08 [to] => 2015-07-08 ) [3] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-10 [to] => 2015-07-10 ) [4] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-15 [to] => 2015-07-15 ) [5] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-16 [to] => 2015-07-16 ) [6] => Array ( [type] => custom [bookable] => yes [from] => 2015-07-17 [to] => 2015-07-17 ) [7] => Array ( [type] => months [bookable] => no [from] => 8 [to] => 8 ) )
正如您所看到的,用户可以在一天或一个月的范围内指定产品是否可预订,所以我的问题是如何进行SQL查询以检查此产品是否有可用的日期变量,我认为Meta_query会做工作(如下所示),但我如何指定不可用的日期?你怎么想?
if($_GET['when']){ /* checkIsAValidDate() >> check date format */ if ( checkIsAValidDate( $_GET['when'] ) ){ $quand = $_GET['when']; $available = array( "post_type" => "product","Meta_query" => array( "relation" => "AND","key" => '_wc_booking_availability',"value" => $when,'compare' => 'IN' ) ); } }
由于元值是一个数组,it may not be possible to use
原文链接:https://www.f2er.com/php/137167.htmlWP_Meta_Query
.虽然我同意使用WP_Meta_Query似乎是更优雅的方式来做到这一点,我总是发现这个功能真的很混乱,因为你可以获得可预订对象的数组,看起来像编写像下面这样的函数会很简单:
/** * Returns an array of bookable products according to supplied criteria * * @param int $pid the $product->ID of the bookable object * @param mixed $when a date in YYYY-MM-DD format or integer representing a day or month * @param string $type a value of 'day','month',or 'custom' * @param string $bookable whether the bookable object is bookable or not ('yes' or 'no') * @return array an array of bookable objects for the product */ function getBookables( $pid,$when,$type,$bookable = 'yes' ) { $result = array(); // is $when in the YYYY-MM-DD format? if ( 'custom' == $type ) { // it's a custom date so convert $when to DateTime $when = DateTime::createFromFormat( 'Y-m-d',$when ); } $availability = get_post_meta( $pid,'_wc_booking_availability' ); foreach ( $availability as $a ) { if ( $a[ 'bookable' ] == $bookable ) { // is it in the YYYY-MM-DD format? if ( $when instanceof DateTime ) { // it's a custom date so use date compare $from = DateTime::createFromFormat( 'Y-m-d',$a[ 'from' ] ); $to = DateTime::createFromFormat( 'Y-m-d',$a[ 'to' ] ); if ( $when >= $from && $when <= $to ) { $result[] = $a; } } else { // it is an integer value (day or month) if ( $type == $a[ 'type' ] && ( $when >= $from && $when <= $to ) ) { $result[] = $a; } } } } return $result; }
请注意,可能需要将类型传递给搜索函数,因为即使我可以将YYYY-MM-DD值与int值区分开来,也没有简单的方法来区分月份和日期值.因此,您可以使用上述功能:
if ( $_GET[ 'when' ] && $_GET[ 'type' ] ) { $when = $_GET[ 'when' ]; $type = $_GET[ 'type' ]; $bookables = getBookables( $product->ID,$type ); }
另请注意,如果将字符串“no”作为第四个参数传递给函数,则可以获取不可用时间列表.
希望这可以帮助!