File "class-location.php"
Full Path: /home/romayxjt/public_html/wp-content/plugins/orderable/inc/modules/location/class-location.php
File size: 11.13 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Module: Location.
*
* @package Orderable/Classes
*/
defined( 'ABSPATH' ) || exit;
/**
* Addons module class.
*/
class Orderable_Location {
/**
* Init.
*/
public static function run() {
self::load_classes();
add_filter( 'orderable_settings', array( __CLASS__, 'add_location_settings_data' ), 20, 2 );
}
/**
* Load classes.
*
* @return void
*/
public static function load_classes() {
$classes = array(
'admin' => array(
'location-admin' => 'Orderable_Location_Admin',
),
'frontend' => array(
'location-single' => 'Orderable_Location_Single',
),
'zones' => array(
'location-zones' => 'Orderable_Location_Zones',
'location-zones-admin' => 'Orderable_Location_Zones_Admin',
'location-zones-crud-handler' => 'Orderable_Location_Zones_CRUD_Handler',
),
);
Orderable_Helpers::load_classes( $classes['admin'], 'location/admin', ORDERABLE_MODULES_PATH );
Orderable_Helpers::load_classes( $classes['zones'], 'location/zones', ORDERABLE_MODULES_PATH );
Orderable_Helpers::load_classes( $classes['frontend'], 'location', ORDERABLE_MODULES_PATH );
}
/**
* Append location data to Orderable settings.
*
* This function is used to intercept Orderable_Settings::get_setting
* and add the location settings retrieved from the Orderable custom
* tables. That way, we keep the compatibility with
* `Orderable_Settings::get_setting()` function.
*
* @param false|array $settings The orderable settings.
* @param string $setting_name The setting name to be retrieved.
*
* @return false|array
*/
public static function add_location_settings_data( $settings, $setting_name ) {
$location_setting_keys = array(
'store_general_service_hours_delivery',
'store_general_service_hours_pickup',
'store_general_services',
'store_general_service_hours_pickup_same',
'store_general_asap',
'store_general_lead_time',
'store_general_preorder',
'store_general_calculation_method',
'orderable_override_open_hours',
);
if ( ! in_array( $setting_name, $location_setting_keys, true ) ) {
return $settings;
}
$location = self::get_main_location();
$settings['store_general_service_hours_delivery'] = $location->get_service_hours( 'delivery' );
$settings['store_general_service_hours_pickup'] = $location->get_service_hours( 'pickup' );
$settings['store_general_services'] = $location->get_services();
$settings['store_general_service_hours_pickup_same'] = $location->get_pickup_hours_same_as_delivery();
$settings['store_general_asap'] = $location->get_asap_settings();
$settings['store_general_lead_time'] = $location->get_lead_time();
$settings['store_general_preorder'] = $location->get_preorder_days();
$settings['store_general_calculation_method'] = $location->get_delivery_calculation_method();
$settings['orderable_override_open_hours'] = $location->get_override_default_open_hours();
return $settings;
}
/**
* Check if should return the location setting default value.
*
* @return boolean
*/
protected static function should_return_default_value() {
global $post;
/**
* Since we intercept the `Orderable_Settings::get_setting()` function to keep
* compatible with Location feature, we need to check it to avoid hitting the database
* early.
*/
if ( is_admin() && ! wp_doing_ajax() && ! function_exists( 'get_current_screen' ) ) {
return true;
}
// If it's creating a new Location, return the default value.
if ( ! empty( $post->post_status ) && 'auto-draft' === $post->post_status ) {
return true;
}
return false;
}
/**
* Check if the store has multi locations.
*
* @return bool
*/
public static function store_has_multi_locations() {
return class_exists( 'Orderable_Multi_Location_Pro' );
}
/**
* Get the post ID associated with the location.
*
* @return null|int.
*/
protected static function get_post_id() {
global $post;
$id = null;
if ( ! self::store_has_multi_locations() ) {
return $id;
}
if ( is_checkout() || Orderable_Multi_Location_Pro_Search::is_searching() ) {
$location = Orderable_Multi_Location_Pro::get_selected_location_data_from_session();
return ! empty( $location['id'] ) ? self::get_location_post_id( $location['id'] ) : $id;
}
// We use the post ID when we are editing a location that is not the main one.
if (
! empty( $post ) &&
'orderable_locations' === $post->post_type
) {
$id = $post->ID;
}
return $id;
}
/**
* Get the WHERE condition to `location_id` field.
*
* @param int $location_id The location ID.
*
* @return string
*/
protected static function location_id_where( $location_id ) {
return empty( $location_id ) ? ' AND locations.is_main_location = 1' : ' AND locations.location_id = %d';
}
/**
* Get a default open hours.
*
* This function is useful when the plugin couldn't
* retrieve the location open hours from the
* database.
*
* @return array
*/
public static function get_default_open_hours() {
$default_day = array(
'enabled' => false,
'from' => array(
'hour' => 9,
'minute' => '00',
'period' => 'AM',
),
'to' => array(
'hour' => 5,
'minute' => '00',
'period' => 'PM',
),
'max_orders' => '',
);
$open_hours = array(
$default_day,
$default_day,
$default_day,
$default_day,
$default_day,
$default_day,
$default_day,
);
return apply_filters( 'orderable_location_get_default_open_hours', $open_hours );
}
/**
* Get the location ID.
*
* @param int|false $post_id The post ID associated with a Location.
*
* @return bool|int
*/
public static function get_location_id( $post_id = false ) {
global $wpdb;
static $location_post_ids = array();
if ( empty( $post_id ) ) {
$post_id = self::get_post_id();
}
// If it's empty, we should try to find it again.
if ( ! empty( $location_post_ids[ $post_id ] ) ) {
return $location_post_ids[ $post_id ];
}
if ( empty( $post_id ) ) {
$location_id = $wpdb->get_var(
"SELECT
location_id
FROM
{$wpdb->orderable_locations}
WHERE
is_main_location = 1
LIMIT 1
"
);
} else {
$location_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT
location_id
FROM
{$wpdb->orderable_locations}
WHERE
post_id = %d
LIMIT 1
",
$post_id
)
);
}
$location_post_ids[ $post_id ] = empty( $location_id ) ? false : absint( $location_id );
return $location_post_ids[ $post_id ];
}
/**
* Get the post ID associated with a location.
*
* @return int|false
*/
public static function get_main_location_post_id() {
_deprecated_function( __METHOD__, '1.16.0' );
global $wpdb;
$post_id = $wpdb->get_var(
"SELECT
post_id
FROM
{$wpdb->orderable_locations}
WHERE
is_main_location = 1
AND
post_id IS NOT NULL
LIMIT
1
"
);
return empty( $post_id ) ? false : (int) $post_id;
}
/**
* Check if it's the main location.
*
* @param int $location_id The location ID.
*
* @return boolean
*/
public static function is_main_location( $location_id ) {
global $wpdb;
if ( empty( $location_id ) ) {
return false;
}
$result = $wpdb->get_var(
$wpdb->prepare(
"SELECT
location_id
FROM
{$wpdb->orderable_locations}
WHERE
is_main_location = 1
AND
location_id = %d
LIMIT
1
",
$location_id
)
);
return ! empty( $result );
}
/**
* Get the post ID associated with a location.
*
* @param string $location_id The location ID.
*
* @return int|false
*/
public static function get_location_post_id( $location_id = '' ) {
global $wpdb;
static $location_post_ids = array();
if ( empty( $location_id ) ) {
$location_id = self::get_location_id();
}
if ( empty( $location_id ) ) {
return false;
}
if ( isset( $location_post_ids[ $location_id ] ) ) {
return $location_post_ids[ $location_id ];
}
$post_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT
post_id
FROM
{$wpdb->orderable_locations}
WHERE
location_id = %d
LIMIT
1
",
$location_id
)
);
$location_post_ids[ $location_id ] = empty( $post_id ) ? false : (int) $post_id;
return $location_post_ids[ $location_id ];
}
/**
* Get the main location ID.
*
* @return int|false
*/
public static function get_main_location_id() {
$cache_key = 'orderable_main_location_id';
$main_location_id = wp_cache_get( $cache_key );
if ( false !== $main_location_id ) {
return $main_location_id;
}
global $wpdb;
$main_location_id = $wpdb->get_var(
"SELECT
location_id
FROM
{$wpdb->prefix}orderable_locations
WHERE
is_main_location = 1
LIMIT
1
"
);
$main_location_id = empty( $main_location_id ) ? false : absint( $main_location_id );
wp_cache_set( $cache_key, $main_location_id );
return $main_location_id;
}
/**
* Get the main location.
*
* @return Orderable_Location_Single|false
*/
public static function get_main_location() {
$cache_key = 'orderable_main_location';
$main_location = wp_cache_get( $cache_key );
if ( false !== $main_location ) {
return new Orderable_Location_Single( $main_location );
}
global $wpdb;
$main_location = $wpdb->get_row(
"SELECT
*
FROM
{$wpdb->prefix}orderable_locations
WHERE
is_main_location = 1
LIMIT
1
",
ARRAY_A
);
$main_location = empty( $main_location ) ? false : $main_location;
wp_cache_set( $cache_key, $main_location );
return new Orderable_Location_Single( $main_location );
}
/**
* Get location data.
*
* @param int $location_id The location ID.
*
* @return array|false
*/
public static function get_location_data( $location_id ) {
$cache_key = 'orderable_get_location_data_' . $location_id;
$location = wp_cache_get( $cache_key );
if ( false !== $location ) {
return $location;
}
global $wpdb;
$location = $wpdb->get_row(
$wpdb->prepare(
"SELECT
*
FROM
{$wpdb->prefix}orderable_locations
WHERE
location_id = %d
LIMIT
1
",
$location_id
),
ARRAY_A
);
$location = empty( $location ) ? false : $location;
wp_cache_set( $cache_key, $location );
return $location;
}
/**
* Get the selected location.
*
* @return Orderable_Location_Single|false
*/
public static function get_selected_location() {
/**
* Filter the selected location.
*
* @since 1.8.0
* @hook orderable_location_get_selected_location
* @param Orderable_Location|false $location The location object.
*/
return apply_filters( 'orderable_location_get_selected_location', self::get_main_location() );
}
/**
* Get the selected location ID.
*
* @return Orderable_Location_Single|false
*/
public static function get_selected_location_id() {
/**
* Filter the selected location ID.
*
* @since 1.8.0
* @hook orderable_location_get_selected_location_id
* @param int|false $location_id The location ID.
*/
return apply_filters( 'orderable_location_get_selected_location_id', self::get_main_location_id() );
}
}