I am querying all orders from a WordPress database that uses the WooCommerce Bookings plugin. I want to display upcoming bookings, and there is a potential to have every hour within 2015 to be booked; which means that I might query over 8700 orders.
I'm new to PHP and did most of this following code myself. I'm not sure if there is a more efficient way of writing this code. I don't want my code to hinder site performance.
<?php
function objectToArray($d) {
if (is_object($d)) {
$d = get_object_vars($d);
}
if (is_array($d)) {
return array_map(__FUNCTION__, $d);
}
else {
return $d;
}
}
$results = $wpdb->get_results("SELECT tzYeb_2_posts.* FROM tzYeb_2_posts INNER JOIN tzYeb_2_term_relationships ON (tzYeb_2_posts.ID = tzYeb_2_term_relationships.object_id) WHERE 1=1 AND ( tzYeb_2_term_relationships.term_taxonomy_id IN (11) ) AND tzYeb_2_posts.post_type = 'shop_order' AND ((tzYeb_2_posts.post_status = 'publish')) GROUP BY tzYeb_2_posts.ID ORDER BY tzYeb_2_posts.post_date DESC");
$time_array = array();
$fname_array = array();
$church_array = array();
$city_array = array();
$state_array = array();
$new_array = array();
foreach ($results as $result) {
$order_items = $wpdb->get_results("SELECT order_item_id, order_item_name, order_item_type
FROM {$wpdb->prefix}woocommerce_order_items
WHERE order_id = " . $result->ID . "
AND order_item_type IN ('line_item')
ORDER BY order_item_id");
foreach ($order_items as $order_item) {
$item_meta = $wpdb->get_results("
SELECT *
FROM {$wpdb->prefix}woocommerce_order_itemmeta
WHERE order_item_id = " . $order_item->order_item_id . "
");
$meta_array = objectToArray($item_meta);
$timestamp = "";
$date = "";
$time = "";
$fname = "";
$church = "";
$city = "";
$state = "";
foreach ($meta_array as $data) {
if ($data['meta_key'] == 'Booking Date')
$date = $data['meta_value'];
if ($data['meta_key'] == 'Booking Time')
$time = $data['meta_value'];
if ($data['meta_key'] == 'First Name - First Name')
$fname = $data['meta_value'];
if ($data['meta_key'] == 'Church Information - Church Name')
$church = $data['meta_value'];
if ($data['meta_key'] == 'Church Information - City')
$city = $data['meta_value'];
if ($data['meta_key'] == 'Church Information - State')
$state = $data['meta_value'];
}
$timestamp = strtotime($time . ' ' . $date);
array_push($time_array, $timestamp);
array_push($fname_array, $fname);
array_push($church_array, $church);
array_push($city_array, $city);
array_push($state_array, $state);
}
}
$arrays = array($fname_array, $church_array, $city_array, $state_array);
foreach ($time_array as $index => $key) {
$t = array();
foreach ($arrays as $array) {
$t[] = $array[$index];
}
$up[$key] = $t;
}
ksort($up);
$i = 0;
foreach ($up as $tsort => $tval) {
if ($tsort > strtotime('now')) {
?>
<div class="wc-upcoming-booking">
<div class="wc-upcoming-time">
<span class="upcoming-hour"><?php echo date('g:i A', $tsort); ?></span>
<span class="upcoming-date"><?php echo date('F j', $tsort); ?></span>
</div>
<div class="wc-upcoming-details">
<?php
if ($tval[0]) {
echo $tval[0];
}
?>
<?php
if ($tval[1]) {
echo ', ' . $tval[1];
}
?>
<?php
if ($tval[2]) {
echo ', ' . $tval[2];
}
?>
<?php
if ($tval[3]) {
echo ', ' . $tval[3];
}
?>
</div>
</div>
<?php
$i++;
if ($i >= 10)
break;
}
}
?>