| Current Path : /home/krobertfnz/www/wp-content/plugins/booked-woocommerce-payments/lib/ |
| Current File : /home/krobertfnz/www/wp-content/plugins/booked-woocommerce-payments/lib/class-static-functions.php |
<?php
class Booked_WC_Functions {
private static $calls = array();
private function __construct() {
}
public static function get_products() {
// check if the products has been already retrieved
// dont make additional requests
if (
!isset(self::$calls['products'])
|| empty(self::$calls['products']['objects'])
) {
$products = get_posts(array(
'posts_per_page' => 200, // there shouldn't be more than 200 product
'post_type' => 'product',
'meta_query' => array(
array(
'key' => '_booked_appointment',
'compare' => '=',
'value' => 'yes'
)
),
'suppress_filters' => false
));
$options = array();
foreach ($products as $product) {
$options[$product->ID] = apply_filters('the_title', $product->post_title);
}
self::$calls['products']['objects'] = $products;
self::$calls['products']['options'] = $options;
}
return self::$calls['products'];
}
public static function get_calendar_page_info( $calendar_id = null ) {
global $wpdb;
$pages = false;
$shortcode = '[booked-calendar';
if ( $calendar_id ) {
$calendar_id = intval($calendar_id);
$search_query = "`post_type` = 'page' AND `post_content` LIKE '%calendar={$calendar_id}%'";
$search_query .= " OR `post_type` = 'page' AND `post_content` LIKE '%calendar=\"{$calendar_id}\"%'";
$search_query .= ' OR `post_type` = "page" AND `post_content` LIKE "%calendar=\'{'.$calendar_id.'}\'%"';
$query = "SELECT * FROM `{$wpdb->posts}` WHERE ".$search_query;
$pages = $wpdb->get_results($query);
}
if ( !$pages ) {
$shortcode = '[booked-calendar';
$query = "SELECT * FROM `{$wpdb->posts}` WHERE `post_type` = 'page' AND `post_content` LIKE '{$shortcode}'";
$pages = $wpdb->get_results($query);
}
if (!$pages){
return;
}
// return the first found calendar
return $pages[0];
}
public static function get_login_page_info() {
global $wpdb;
$query = "SELECT * FROM `{$wpdb->posts}`
WHERE `post_type` = 'page'
AND `post_content` LIKE '%[booked-login]%'";
$pages = $wpdb->get_results($query);
if ( !$pages ) {
return;
}
// return the first found calendar
return $pages[0];
}
public static function get_appointments_page_info() {
global $wpdb;
$query = "SELECT * FROM `{$wpdb->posts}`
WHERE `post_type` = 'page'
AND `post_content` LIKE '%[booked-appointments]%'";
$pages = $wpdb->get_results($query);
if ( !$pages ) {
return;
}
// return the first found calendar
return $pages[0];
}
public static function booked_new_appointment_form() {
if (
!empty($_POST['action'])
&& $_POST['action']==='booked_new_appointment_form'
&& !empty($_POST['source'])
&& $_POST['source']==='booked_wc_extension'
) {
$booking_form = Booked_WC_Fragments::get_path('ajax-loaded/appointment', 'change-date');
include($booking_form);
exit;
}
}
public static function get_calendar_id_from_post_request() {
$calendar_id = (isset($_POST['calendar_id']) ? $_POST['calendar_id'] : false);
$calendar_id = array($calendar_id);
$calendar_id = array_map( 'intval', $calendar_id );
$calendar_id = array_unique( $calendar_id );
if ( !empty($calendar_id) && is_numeric($calendar_id[0]) ) {
return $calendar_id[0];
}
return false;
}
public static function get_custom_fields() {
$calendar_id = self::get_calendar_id_from_post_request();
$custom_fields = array();
if ( $calendar_id ) {
$custom_fields_option_name = 'booked_custom_fields_' . $calendar_id;
$custom_fields = json_decode(stripslashes(get_option($custom_fields_option_name)),true);
}
if ( !$custom_fields ) {
$custom_fields = json_decode(stripslashes(get_option('booked_custom_fields')),true);
}
return $custom_fields;
}
// filtrates the custom field values before creating a new appointment
public static function booked_custom_field_data( $custom_field_data = array() ) {
// get custom fields
$custom_fields = self::get_custom_fields();
if ( empty($custom_fields) ) {
return $custom_field_data;
}
// handle the custom fields data
$has_product = false;
foreach($custom_fields as $key => $field) {
$field_name = $field['name'];
$field_parts = explode('---',$field_name);
$field_type = $field_parts[0];
$field_marker = '';
if ( $field_type !== 'paid-service-label' ) {
continue;
}
if ( !isset($_POST[$field_name]) || empty($_POST[$field_name]) ) {
continue;
}
$field_title = $field['value'];
$product_id = intval($_POST[$field_name]);
$product = Booked_WC_Product::get($product_id);
$end_of_string = explode('___',$field_parts[1]);
$numbers_only = $end_of_string[0];
$is_required = (isset($end_of_string[1]) ? true : false);
// set product title
$custom_field_data[$key]['value'] = esc_html($product->title);
$field_marker .= 'product_id::' . $product_id;
$option_name = str_replace($field_type, 'paid-service-variation', $field_name);
if ( isset($_POST[$option_name]) && !empty($_POST[$option_name]) ) {
$variation_id = intval($_POST[$option_name]);
if ( isset($product->variations[$variation_id]) ) {
$variation_details = $product->variations[$variation_id];
$variation_title = $variation_details['variation_title'];
// add variation value
$custom_field_data[$key]['value'] .= '<br />[ ' . esc_html($variation_title) . ' ]';
$field_marker .= '|variation_id::' . $variation_id;
}
}
// add a marker containing the product ID
// simple-product -> product_id::ID
// variable-product -> product_id::ID|variation_id::ID
$custom_field_data[$key]['value'] .= "<!-- {$field_marker} -->";
$has_product = true;
}
if ( $has_product ) {
// check for a calendar assignee
$calendar_id = self::get_calendar_id_from_post_request();
if ( $calendar_id ) {
$term_meta = get_option( "taxonomy_{$calendar_id}" );
$assignee_email = $term_meta['notifications_user_id'];
if ( $assignee_email && ($usr=get_user_by('email', $assignee_email)) ) {
$custom_field_data['booking-agent'] = array(
'label' => esc_attr__('Booking Agent', 'booked-woocommerce-payments'),
'value' => $usr->display_name
);
}
}
add_filter('booked_new_appointment_args', array('Booked_WC_Functions', 'booked_new_appointment_args_on_create'), 10, 1);
}
return $custom_field_data;
}
// filtrates the custom field values before creating a new appointment
public static function booked_prepare_sending_reminder( $send = true, $appt_id = false ) {
if ( empty( $appt_id ) ):
return false;
endif;
if ( is_array( $appt_id ) ):
return false;
else:
$custom_field_val = get_post_meta( $appt_id, '_cf_meta_value', true );
$is_wc_order = strpos( $custom_field_val, '<!-- product_id' );
if ( $is_wc_order ):
$order = new Booked_WC_Appointment_Payment_Status( $appt_id );
if ( !empty($order) && isset($order->is_paid) && !$order->is_paid ):
return false;
else:
return true;
endif;
else:
return true;
endif;
endif;
return true;
}
// filtrates the appointment data before creating it
// this hook should be called only in Booked_WC_Functions::booked_custom_field_data() only if product option is available
public static function booked_new_appointment_args_on_create( $post_params=array() ) {
// just in case, remove the filter
remove_filter('booked_new_appointment_args', array('Booked_WC_Functions', 'booked_new_appointment_args_on_create'), 10, 1);
// set post status to awaiting payment
$post_params['post_status'] = BOOKED_WC_PLUGIN_PREFIX . 'awaiting';
return $post_params;
}
// filtered the appointment information before populating to the calendar
public static function booked_appointments_array( $appointments_array ) {
return $appointments_array;
}
public static function booked_store_appointment_creation_date( $appointment_id=null ) {
if ( !$appointment_id ) {
return;
}
$current_time = current_time('timestamp');
update_post_meta($appointment_id, '_' . BOOKED_WC_PLUGIN_PREFIX . 'time_created', $current_time);
update_post_meta($appointment_id, '_' . BOOKED_WC_PLUGIN_PREFIX . 'date_created', date('Y-m-d H:i:s', $current_time));
}
public static function booked_get_custom_fields_information() {
$custom_fields = self::get_custom_fields();
$submission_values = array();
$previous_field = false;
$is_product = false;
foreach($custom_fields as $field) {
$field_name = $field['name'];
$field_title = $field['value'];
$field_parts = explode('---',$field_name);
$field_type = $field_parts[0];
switch ($field_type) {
case 'paid-service-label':
$is_product = true;
$current_group_name = $field_title;
break;
case 'checkboxes-label':
case 'radio-buttons-label':
$is_product = false;
$current_group_name = $field_title;
break;
case 'single-checkbox':
case 'single-radio-button':
$is_product = false;
// Don't change the group name yet
break;
default:
$is_product = false;
$current_group_name = $field_title;
break;
}
if ( $field_name===$previous_field ) {
continue;
}
$previous_field = $field_name;
if ( !isset($_POST[$field_name]) || empty($_POST[$field_name]) ) {
continue;
}
// set regular field data and conitnue
if ( !$is_product ) {
$field_value = $_POST[$field_name];
if (is_array($field_value)){
$field_value = implode(', ',$field_value);
}
$submission_values[$current_group_name] = $field_value;
continue;
}
// if the field is a product
$product_id = intval($_POST[$field_name]);
$product = Booked_WC_Product::get($product_id);
$end_of_string = explode('___',$field_parts[1]);
$numbers_only = $end_of_string[0];
$is_required = (isset($end_of_string[1]) ? true : false);
// set product title
$submission_values[$current_group_name] = esc_html($product->title);
$option_name = str_replace($field_type, 'paid-service-variation', $field_name);
if ( isset($_POST[$option_name]) && !empty($_POST[$option_name]) ) {
$variation_id = intval($_POST[$option_name]);
if ( isset($product->variations[$variation_id]) ) {
$variation_details = $product->variations[$variation_id];
$variation_title = $variation_details['variation_title'];
// add variation value
$submission_values[$current_group_name] .= '<br />[ ' . esc_html($variation_title) . ' ]';
}
}
}
return $submission_values;
}
public static function booked_store_custom_fields_information( $appointment_id = null ) {
if ( !$appointment_id ) {
return;
}
$custom_fields = self::booked_get_custom_fields_information();
$i = 0;
$separator = '--SEP--';
$meta_key = '_' . BOOKED_WC_PLUGIN_PREFIX . 'cfield_';
foreach ($custom_fields as $field_label => $field_value) {
$this_meta_key = $meta_key . strval($i);
$value_to_store = $field_label . $separator . $field_value;
// save the value
update_post_meta($appointment_id, $this_meta_key, $value_to_store);
$i++;
}
}
public static function booked_new_appointment_created( $appointment_id = null ) {
if ( is_admin() && isset($_POST['booked_form_type']) && $_POST['booked_form_type'] == 'admin' ):
return;
endif;
$appointment_id = intval($appointment_id);
try {
$appointment = Booked_WC_Appointment::get($appointment_id);
} catch (Exception $e) {
return;
}
// check if the appointment has assigned products to it
if ( !$appointment->products ) {
return;
}
self::booked_store_custom_fields_information($appointment_id);
$added_to_cart = Booked_WC_Cart::add_appointment($appointment_id);
if ( !$added_to_cart ) {
return;
}
}
// add edit button to the front front end appointments listing
public static function booked_shortcode_appointments_buttons( $appointment_id=null ) {
// add change date and pay buttons
$edit_button = Booked_WC_Fragments::get_path('appointment', 'buttons');
include($edit_button);
}
public static function booked_shortcode_appointments_additional_information( $appointment_id=null ) {
$additional_info = Booked_WC_Fragments::get_path('appointment', 'additional-info');
include($additional_info);
}
// Don't show cancel button on appointment with products
public static function booked_shortcode_appointments_allow_cancel($allow_cancel, $app_id) {
$appointment = Booked_WC_Appointment::get(intval($app_id));
return !$appointment->products;
}
// Add "booked_wc_awaiting" to the "Pending" status types
public static function booked_admin_pending_post_status($statuses) {
$statuses = array('draft','booked_wc_awaiting');
return $statuses;
}
// remove delete button if order attached
public static function booked_fea_shortcode_appointments_buttons($button_html, $appt_id) {
$appointment = Booked_WC_Appointment::get(intval($appt_id));
$status = get_post_status(intval($appt_id));
if ($appointment->order_id):
$status_class = $status !== 'publish' && $status !== 'future' ? 'pending' : 'approved';
$button_html = '<div class="booked-fea-buttons">';
$button_html .= ($status_class == 'pending' ? '<button data-appt-id="'.$appt_id.'" class="approve button button-primary">'.__('Approve','booked-woocommerce-payments').'</button>' : '');
$button_html .= '</div>';
return $button_html;
else:
return $button_html;
endif;
}
public static function booked_button_book_appointment( $label ) {
if (
empty($_POST['app_id'])
|| empty($_POST['app_action'])
|| $_POST['app_action']!=='edit'
|| empty($_POST['source'])
|| $_POST['source']!=='booked_wc_extension'
) {
return $label;
}
$appointment = Booked_WC_Appointment::get(intval($_POST['app_id']));
$current_time = current_time('timestamp');
// check if the date has been passed
if ( $current_time > $appointment->timestamp ) {
return $label;
}
return '<span class="button-text" >' . __('Choose New Date', 'booked-woocommerce-payments') . '</span></button></span>';
}
public static function booked_before_creating_appointment() {
global $woocommerce;
$customer_type = isset($_POST['customer_type']) ? $_POST['customer_type'] : '';
if ($customer_type == 'guest'):
$first_name = esc_attr($_POST['guest_name']);
$last_name = isset($_POST['guest_surname']) && $_POST['guest_surname'] ? esc_attr($_POST['guest_surname']) : false;
$email = isset($_POST['guest_email']) ? esc_attr($_POST['guest_email']) : '';
elseif ($customer_type == 'new'):
$first_name = esc_attr($_POST['booked_appt_name']);
$last_name = ( isset($_POST['booked_appt_surname']) && $_POST['booked_appt_surname'] ? esc_attr($_POST['booked_appt_surname']) : false );
$email = $_POST['booked_appt_email'];
elseif ($customer_type == 'current' && is_user_logged_in() ):
$_this_user = wp_get_current_user();
$first_name = $_this_user->user_firstname;
$last_name = $_this_user->user_lastname;
$email = $_this_user->user_email;
endif;
if ( isset( $email ) ):
$woocommerce->session->set( 'booked_first_name', $first_name );
$woocommerce->session->set( 'booked_last_name', $last_name );
$woocommerce->session->set( 'booked_email', $email );
endif;
if ( is_admin() && isset($_POST['booked_form_type']) && $_POST['booked_form_type'] == 'admin' ):
return;
endif;
$action = (isset($_POST['action']) &&!empty($_POST['action'])) ? $_POST['action'] : false;
$app_id = (isset($_POST['app_id']) &&!empty($_POST['app_id'])) ? $_POST['app_id'] : false;
$app_action = (isset($_POST['app_action']) &&!empty($_POST['app_action'])) ? $_POST['app_action'] : false;
$source = (isset($_POST['source']) &&!empty($_POST['source'])) ? $_POST['source'] : false;
if (
(!$action || $action !== 'booked_add_appt')
|| (!$app_id || !intval($app_id))
|| (!$app_action || $app_action!=='edit')
|| (!$source || $source!=='booked_wc_extension')
) {
return;
}
$appointment = Booked_WC_Appointment::get(intval($app_id));
$current_time = current_time('timestamp');
// check if the date has been passed
if ( $current_time > $appointment->timestamp ) {
return;
}
// remove cart functionality
remove_action('booked_new_appointment_created', array('Booked_WC_Functions', 'booked_new_appointment_created'), 15, 1);
// turn the wp_insert_post to act as wp_update_post
add_filter('booked_new_appointment_args', array('Booked_WC_Functions', 'booked_new_appointment_args_on_date_change'), 10, 1);
// dont allow to update the metas and the calendar term
add_filter('booked_update_cf_meta_value', array('Booked_WC_Functions', 'return_false'), 10);
add_filter('booked_update_appointment_calendar', array('Booked_WC_Functions', 'return_false'), 10);
}
public static function booked_wc_mailer_actions( $mailer_actions ){
$send_upon_completion = self::booked_disable_confirmation_emails();
if ( $send_upon_completion ):
$mailer_actions[] = 'booked_wc_confirmation_email';
$mailer_actions[] = 'booked_wc_admin_confirmation_email';
return $mailer_actions;
endif;
return $mailer_actions;
}
public static function booked_disable_confirmation_emails(){
if ( Booked_WC_Settings::get_option('email_confirmations') === 'after_complete' || Booked_WC_Settings::get_option('email_confirmations') === false ):
return apply_filters( 'booked_disable_confirmation_emails', true );
else:
return apply_filters( 'booked_disable_confirmation_emails', false );
endif;
}
public static function remove_default_emails() {
$booked_wc_product = false;
if (isset($_POST)):
foreach($_POST as $var => $val):
$var_parts = explode('---',$var);
if (isset($var_parts[0]) && $var_parts[0] == 'paid-service-label'):
$booked_wc_product = true;
break;
endif;
endforeach;
$booked_disable_confirmation_emails = self::booked_disable_confirmation_emails();
if ( $booked_wc_product && $booked_disable_confirmation_emails ):
remove_action( 'booked_confirmation_email', 'booked_mailer', 10 );
remove_action( 'booked_admin_confirmation_email', 'booked_mailer', 10 );
endif;
else:
return;
endif;
return;
}
// see wp_update_post()
public static function booked_new_appointment_args_on_date_change( $post_args ) {
$appointment_id = $_POST['app_id'];
$appointment_obj = get_post($appointment_id, ARRAY_A);
if ( !$appointment_obj ) {
return 0;
}
$default_post_status = get_option('booked_new_appointment_default','draft');
$post_args['ID'] = $_POST['app_id'];
// Escape data pulled from DB.
$appointment_obj = wp_slash($appointment_obj);
// Passed post category list overwrites existing category list if not empty.
$post_cats = $appointment_obj['post_category'];
$post_args = array_merge($appointment_obj, $post_args);
$post_args['post_category'] = $post_cats;
// Drafts shouldn't be assigned a date unless explicitly done so by the user.
$post_args['post_date'] = current_time('mysql');
$post_args['post_date_gmt'] = '';
// keep the awaiting payment status if the appointment is awaiting payment
$app_detailed_obj = Booked_WC_Appointment::get(intval($appointment_id));
$awaiting_payment_status = BOOKED_WC_PLUGIN_PREFIX . 'awaiting';
if ($app_detailed_obj->products && !$app_detailed_obj->is_paid) {
$post_args['post_status'] = $awaiting_payment_status;
} else {
$post_args['post_status'] = $default_post_status;
}
return $post_args;
}
public static function return_false() {
return false;
}
public static function booked_admin_calendar_buttons_before($calendar_id, $appt_id, $status) {
$appt_id = intval($appt_id);
$appointment = Booked_WC_Appointment::get($appt_id);
if ( !$appointment->products ) {
return;
}
add_filter('booked_admin_show_calendar_buttons', array('Booked_WC_Functions', 'return_false'), 10);
$edit_button = Booked_WC_Fragments::get_path('admin-calendar', 'app-buttons');
include($edit_button);
}
public static function booked_admin_calendar_buttons_after($calendar_id, $appt_id, $status) {
remove_filter('booked_admin_show_calendar_buttons', array('Booked_WC_Functions', 'return_false'), 10);
}
}