39341-vm/wp-content/plugins/simply-schedule-appointments/simply-schedule-appointments.php
2026-03-26 12:07:55 +00:00

938 lines
28 KiB
PHP

<?php
/**
* Plugin Name: Simply Schedule Appointments
* Plugin URI: https://simplyscheduleappointments.com
* Description: Easy appointment scheduling
* Version: 1.6.10.2
* Requires PHP: 7.4
* Author: NSquared
* Author URI: https://nsquared.io/
* Donate link: https://simplyscheduleappointments.com
* License: GPLv2
* Text Domain: simply-schedule-appointments
* Domain Path: /languages
*
* @link https://simplyscheduleappointments.com
*
* @package Simply_Schedule_Appointments
* @version 1.6.10.2
*
* Built using generator-plugin-wp (https://github.com/WebDevStudios/generator-plugin-wp)
*/
/**
* Copyright (c) 2017 N Squared (email : support@simplyscheduleappointments.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2 or, at
* your discretion, any later version, as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* Autoloads files with classes when needed.
*
* @since 0.0.0
* @param string $class_name Name of the class being requested.
*/
if ( ! function_exists( 'ssa_autoload_classes' ) ) {
function ssa_autoload_classes( $class_name ) {
// If our class doesn't have our prefix, don't load it.
if ( 0 !== strpos( $class_name, 'SSA_' ) ) {
return;
}
// Set up our filename.
$filename = strtolower( str_replace( '_', '-', substr( $class_name, strlen( 'SSA_' ) ) ) );
// Include our file.
Simply_Schedule_Appointments::include_file( 'includes/class-' . $filename );
}
}
spl_autoload_register( 'ssa_autoload_classes' );
if ( file_exists( __DIR__ . '/vendor/autoload.php' ) ) {
if ( version_compare( phpversion(), '7.0', '>=' ) ) {
include_once __DIR__ . '/vendor/autoload.php';
}
};
define( 'SSA_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
/**
* Main initiation class.
*
* @since 0.0.0
*/
final class Simply_Schedule_Appointments {
// declare class properties, avoid dynamic properties and their warnings
public $action_scheduler;
public $advanced_scheduling_availability;
public $advanced_scheduling_settings;
public $appointment_meta_model;
public $appointment_model;
public $appointment_type_label_model;
public $appointment_type_model;
public $async_action_model;
public $availability_cache_invalidation;
public $availability_cache;
public $availability_default;
public $availability_external_model;
public $availability_functions;
public $availability_model;
public $beaver_builder;
public $blackout_dates_settings;
public $blackout_dates;
public $block_booking;
public $block_upcoming_appointments;
public $bootstrap;
public $cache;
public $calendar_events_settings;
public $capabilities;
public $capacity_settings;
public $capacity;
public $csv_exporter;
public $customer_information;
public $customers;
public $dashboard_upcoming_appointments_widget;
public $developer_settings;
public $divi;
public $elementor;
public $error_notices;
public $filesystem;
public $formidable;
public $forms;
public $gcal_exporter;
public $google_calendar_admin;
public $google_calendar_api;
public $embed_booking_app_api;
public $google_calendar_client;
public $google_calendar_settings;
public $google_calendar;
public $gravityforms;
public $health_check;
public $hooks;
public $license_api;
public $license_settings;
public $license;
public $mailchimp_api;
public $mailchimp_settings;
public $mailchimp;
public $missing;
public $notices_api;
public $notices;
public $notification_model;
public $notifications_api;
public $notifications_settings;
public $notifications;
public $offline_payments_settings;
public $offline_payments;
public $payment_model;
public $payments_settings;
public $payments;
public $paypal_settings;
public $paypal;
public $reminders;
public $resource_appointment_model;
public $resource_group_appointment_type_model;
public $resource_group_model;
public $resource_group_resource_model;
public $resource_model;
public $resources_settings;
public $resources;
public $revision_meta_model;
public $revision_model;
public $scheduling_max_per_day;
public $settings_api;
public $settings_global;
public $settings_installed;
public $settings;
public $shortcodes;
public $sms_api;
public $sms_settings;
public $sms;
public $staff_appointment_model;
public $staff_appointment_type_model;
public $staff_availability;
public $staff_model;
public $staff_settings;
public $staff;
public $stripe_settings;
public $stripe;
public $styles_settings;
public $styles;
public $support_status_api;
public $support_status;
public $support;
public $templates_api;
public $templates;
public $tracking_settings;
public $tracking;
public $translation_settings;
public $translation;
public $upgrade;
public $users;
public $utils;
public $validation;
public $web_meetings;
public $webex_settings;
public $webex;
public $webhooks_settings;
public $webhooks;
public $woocommerce_settings;
public $woocommerce;
public $wp_admin;
public $zoom_settings;
public $zoom;
public $memberpress;
public $memberpress_api;
/**
* Current version.
*
* @var string
* @since 0.0.0
*/
const VERSION = '1.6.10.2';
/**
* URL of plugin directory.
*
* @var string
* @since 0.0.0
*/
protected $url = '';
/**
* Path of plugin directory.
*
* @var string
* @since 0.0.0
*/
protected $path = '';
/**
* Plugin basename.
*
* @var string
* @since 0.0.0
*/
protected $basename = '';
/**
* Detailed activation error messages.
*
* @var array
* @since 0.0.0
*/
protected $activation_errors = array();
/**
* Singleton instance of plugin.
*
* @var Simply_Schedule_Appointments
* @since 0.0.0
*/
protected static $single_instance = null;
/**
* Instance of SSA_Debug
*
* @since4.0.1
* @var SSA_Debug
*/
protected $debug;
/**
* Creates or returns an instance of this class.
*
* @since 0.0.0
* @return Simply_Schedule_Appointments A single instance of this class.
*/
public static function get_instance() {
if ( null === self::$single_instance ) {
self::$single_instance = new self();
}
return self::$single_instance;
}
/**
* Sets up our plugin.
*
* @since 0.0.0
*/
protected function __construct() {
$this->basename = plugin_basename( __FILE__ );
$this->url = plugin_dir_url( __FILE__ );
$this->path = plugin_dir_path( __FILE__ );
require $this->dir( 'includes/lib/td-health-check/health-check.php' );
$this->health_check = new TD_Health_Check();
require_once __DIR__ . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
if ( ! defined( 'WP_SENTRY_VERSION' ) ) {
define( 'WP_SENTRY_VERSION', 'v' . self::VERSION );
}
}
/**
* Attach other plugin classes to the base plugin class.
*
* @since 0.0.0
*/
public function plugin_classes() {
$classes = array(
'settings' => 'SSA_Settings',
'bootstrap' => 'SSA_Bootstrap',
'missing' => 'SSA_Missing',
'upgrade' => 'SSA_Upgrade',
'utils' => 'SSA_Utils',
'validation' => 'SSA_Validation',
'capabilities' => 'SSA_Capabilities',
'hooks' => 'SSA_Hooks',
'resources' => 'SSA_Resources',
'resources_settings' => 'SSA_Resources_Settings',
'resource_model' => 'SSA_Resource_Model',
'resource_group_model' => 'SSA_Resource_Group_Model',
'resource_appointment_model' => 'SSA_Resource_Appointment_Model',
'resource_group_appointment_type_model' => 'SSA_Resource_Group_Appointment_Type_Model',
'resource_group_resource_model' => 'SSA_Resource_Group_Resource_Model',
'revision_model' => 'SSA_Revision_Model',
'revision_meta_model' => 'SSA_Revision_Meta_Model',
'appointment_model' => 'SSA_Appointment_Model',
'appointment_meta_model' => 'SSA_Appointment_Meta_Model',
'appointment_type_model' => 'SSA_Appointment_Type_Model',
'availability_model' => 'SSA_Availability_Model',
'appointment_type_label_model' => 'SSA_Appointment_Type_Label_Model',
'availability_external_model' => 'SSA_Availability_External_Model',
'availability_functions' => 'SSA_Availability_Functions',
'availability_default' => 'SSA_Availability_Default',
'availability_cache' => 'SSA_Availability_Cache',
'availability_cache_invalidation' => 'SSA_Availability_Cache_Invalidation',
'capacity_settings' => 'SSA_Capacity_Settings',
'capacity' => 'SSA_Capacity',
'cache' => 'SSA_Cache',
'debug' => 'SSA_Debug',
'customers' => 'SSA_Customers',
'customer_information' => 'SSA_Customer_Information',
'scheduling_max_per_day' => 'SSA_Scheduling_Max_Per_Day',
'settings_installed' => 'SSA_Settings_Installed',
'settings_global' => 'SSA_Settings_Global',
'gcal_exporter' => 'SSA_Gcal_Exporter',
'notifications' => 'SSA_Notifications',
'notifications_settings' => 'SSA_Notifications_Settings',
'notification_model' => 'SSA_Notification_Model',
'notices' => 'SSA_Notices',
'error_notices' => 'SSA_Error_Notices',
'csv_exporter' => 'SSA_CSV_Exporter',
'calendar_events_settings' => 'SSA_Calendar_Events_Settings',
'async_action_model' => 'SSA_Async_Action_Model',
/* Features */
'developer_settings' => 'SSA_Developer_Settings',
'license_settings' => 'SSA_License_Settings',
'license' => 'SSA_License',
'advanced_scheduling_settings' => 'SSA_Advanced_Scheduling_Settings',
'advanced_scheduling_availability' => 'SSA_Advanced_Scheduling_Availability',
'blackout_dates_settings' => 'SSA_Blackout_Dates_Settings',
'blackout_dates' => 'SSA_Blackout_Dates',
'elementor' => 'SSA_Elementor',
'beaver_builder' => 'SSA_Beaver_Builder',
'divi' => 'SSA_Divi',
'forms' => 'SSA_Forms',
'formidable' => 'SSA_Formidable',
'staff_settings' => 'SSA_Staff_Settings',
'staff' => 'SSA_Staff',
'staff_model' => 'SSA_Staff_Model',
'staff_appointment_model' => 'SSA_Staff_Appointment_Model',
'staff_appointment_type_model' => 'SSA_Staff_Appointment_Type_Model',
'staff_availability' => 'SSA_Staff_Availability',
'google_calendar_settings' => 'SSA_Google_Calendar_Settings',
'google_calendar' => 'SSA_Google_Calendar',
'google_calendar_client' => 'SSA_Google_Calendar_Client',
'google_calendar_admin' => 'SSA_Google_Calendar_Admin',
'gravityforms' => 'SSA_Gravityforms',
'payment_model' => 'SSA_Payment_Model',
'mailchimp_settings' => 'SSA_Mailchimp_Settings',
'mailchimp' => 'SSA_Mailchimp',
'offline_payments_settings' => 'SSA_Offline_Payments_Settings',
'offline_payments' => 'SSA_Offline_Payments',
'payments_settings' => 'SSA_Payments_Settings',
'payments' => 'SSA_Payments',
'paypal_settings' => 'SSA_Paypal_Settings',
'paypal' => 'SSA_Paypal',
'reminders' => 'SSA_Reminders',
'sms' => 'SSA_Sms',
'sms_settings' => 'SSA_Sms_Settings',
'stripe_settings' => 'SSA_Stripe_Settings',
'stripe' => 'SSA_Stripe',
'styles_settings' => 'SSA_Styles_Settings',
'styles' => 'SSA_Styles',
'support' => 'SSA_Support',
'support_status' => 'SSA_Support_Status',
'templates' => 'SSA_Templates',
'tracking_settings' => 'SSA_Tracking_Settings',
'tracking' => 'SSA_Tracking',
'translation' => 'SSA_Translation',
'translation_settings' => 'SSA_Translation_Settings',
'users' => 'SSA_Users',
'webhooks_settings' => 'SSA_Webhooks_Settings',
'webhooks' => 'SSA_Webhooks',
'web_meetings' => 'SSA_Web_Meetings',
'woocommerce_settings' => 'SSA_Woocommerce_Settings',
'woocommerce' => 'SSA_Woocommerce',
'webex' => 'SSA_Webex',
'webex_settings' => 'SSA_Webex_Settings',
'zoom_settings' => 'SSA_Zoom_Settings',
'zoom' => 'SSA_Zoom',
'memberpress' => 'SSA_Memberpress',
'shortcodes' => 'SSA_Shortcodes',
'block_booking' => 'SSA_Block_Booking',
'block_upcoming_appointments' => 'SSA_Block_Upcoming_Appointments',
'filesystem' => 'SSA_Filesystem',
'wp_admin' => 'SSA_Wp_Admin',
'action_scheduler' => 'SSA_Action_Scheduler',
'dashboard_upcoming_appointments_widget' => 'SSA_Dashboard_Upcoming_Appointments_Widget',
// NO API CLASSES SHOULD BE HERE (should be defined in rest_api_init hook)
);
include __DIR__ . '/includes/class-exception.php';
foreach ( $classes as $variable_name => $class_name ) {
if ( class_exists( $class_name ) ) {
$this->$variable_name = new $class_name( $this );
} else {
$this->$variable_name = $this->missing;
}
}
} // END OF PLUGIN CLASSES FUNCTION
/**
* Attach other plugin classes to the base plugin class.
*
* @since 0.0.2
*/
public function rest_api_init() {
$classes = array(
'settings_api' => 'SSA_Settings_Api',
'notices_api' => 'SSA_Notices_Api',
'license_api' => 'SSA_License_Api',
'templates_api' => 'SSA_Templates_Api',
'google_calendar_api' => 'SSA_Google_Calendar_Api',
'notifications_api' => 'SSA_Notifications_Api',
'mailchimp_api' => 'SSA_Mailchimp_Api',
'sms_api' => 'SSA_Sms_Api',
'support_status_api' => 'SSA_Support_Status_Api',
'memberpress_api' => 'SSA_Memberpress_Api',
'embed_booking_app_api'=> 'SSA_Embed_Booking_App_Api',
);
foreach ( $classes as $variable_name => $class_name ) {
if ( class_exists( $class_name ) ) {
$this->$variable_name = new $class_name( $this );
} else {
$this->$variable_name = $this->missing;
}
}
}
/**
* data-cfasync is an HTML attribute used to indicate to Cloudflare's Rocket Loader
* whether or not to load a particular script asynchronously
*/
public function rocket_loader_filter( $tag, $handle, $src ) {
if( 'ssa-iframe-outer' === $handle || 'ssa-form-embed' === $handle ){
return str_replace( '<script', '<script data-cfasync="false"', $tag );
}
// keep other scripts untouched
return $tag;
}
/**
* Add hooks and filters.
* Priority needs to be
* < 10 for CPT_Core,
* < 5 for Taxonomy_Core,
* and 0 for Widgets because widgets_init runs at init priority 1.
*
* @since 0.0.0
*/
public function hooks() {
if ( ! function_exists( 'ray' ) ) {
function ray() {
// we need this empty function in case a ray() call mistakenly makes it into a production release
}
}
$this->plugins_loaded();
add_action( 'init', array( $this, 'init' ), 0 );
// Avoid Cloudflare's Rocket Loader lazy load the editor iframe
add_filter( 'script_loader_tag', array( $this, 'rocket_loader_filter' ), 10, 3 );
add_action( 'rest_api_init', array( $this, 'rest_api_init' ), 0 );
}
/**
* Activate the plugin.
*
* @since 0.0.0
*/
public function _activate() {
// Bail early if requirements aren't met.
if ( ! $this->check_requirements() ) {
return;
}
// Make sure any rewrite functionality has been loaded.
flush_rewrite_rules();
}
/**
* Deactivate the plugin.
* Uninstall routines should be in uninstall.php.
*
* @since 0.0.0
*/
public function _deactivate() {
// Add deactivation cleanup functionality here.
}
public static function _uninstall(){
global $wpdb;
$table_prefix = $wpdb->prefix;
// Get Developer Settings
$wpdb->query("SELECT option_value FROM $wpdb->options WHERE option_name = 'ssa_settings_json'");
$settings = json_decode($wpdb->last_result[0]->option_value);
if ( ! empty( $settings->developer->remove_data_on_uninstall) ) {
// Finds and delete all rows from the wp_options table that contains "ssa_" in the option_name column.
$wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'ssa\_%' OR option_name LIKE 'wp_ssa\_%' OR option_name LIKE '{$table_prefix}ssa\_%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
// Truncate all ssa database tables.
$wpdb->query("DROP TABLE {$table_prefix}ssa_appointments");
$wpdb->query("DROP TABLE {$table_prefix}ssa_appointment_meta");
$wpdb->query("DROP TABLE {$table_prefix}ssa_appointment_types");
$wpdb->query("DROP TABLE {$table_prefix}ssa_availability");
$wpdb->query("DROP TABLE {$table_prefix}ssa_availability_external");
$wpdb->query("DROP TABLE {$table_prefix}ssa_async_actions");
$wpdb->query("DROP TABLE {$table_prefix}ssa_payments");
$wpdb->query("DROP TABLE {$table_prefix}ssa_staff");
$wpdb->query("DROP TABLE {$table_prefix}ssa_staff_appointments");
$wpdb->query("DROP TABLE {$table_prefix}ssa_staff_appointment_types");
$wpdb->query("DROP TABLE {$table_prefix}ssa_appointment_type_labels");
$wpdb->query("DROP TABLE {$table_prefix}ssa_revisions");
$wpdb->query("DROP TABLE {$table_prefix}ssa_revision_meta");
}
}
public function plugins_loaded() {
// Bail early if requirements aren't met.
if ( ! $this->check_requirements() ) {
return;
}
require $this->dir( 'includes/lib/td-util/td-util-init.php' );
// Initialize plugin classes.
$this->plugin_classes();
do_action( 'ssa_loaded' );
}
/**
* Init hooks
*
* @since 0.0.0
*/
public function init() {
// Load translated strings for plugin.
load_plugin_textdomain( 'simply-schedule-appointments', false, dirname( $this->basename ) . '/languages/' );
}
/**
* Check if the plugin meets requirements and
* disable it if they are not present.
*
* @since 0.0.0
*
* @return boolean True if requirements met, false if not.
*/
public function check_requirements() {
// Bail early if plugin meets requirements.
if ( $this->meets_requirements() ) {
return true;
}
// Add a dashboard notice.
add_action( 'all_admin_notices', array( $this, 'requirements_not_met_notice' ) );
// Deactivate our plugin.
add_action( 'admin_init', array( $this, 'deactivate_me' ) );
// Didn't meet the requirements.
return false;
}
/**
* Deactivates this plugin, hook this function on admin_init.
*
* @since 0.0.0
*/
public function deactivate_me() {
// We do a check for deactivate_plugins before calling it, to protect
// any developers from accidentally calling it too early and breaking things.
if ( function_exists( 'deactivate_plugins' ) ) {
deactivate_plugins( $this->basename );
}
}
/**
* Check that all plugin requirements are met.
*
* @since 0.0.0
*
* @return boolean True if requirements are met.
*/
public function meets_requirements() {
if ( version_compare( phpversion(), '7.4', '<' ) ) {
$this->activation_errors[] = 'Simply Schedule Appointments requires <strong>PHP version 7.4 or higher</strong>. Most WordPress hosts are supporting PHP 7, so your web host should easily be able to update you to PHP 7.4 or higher if you contact them. <br />A higher PHP version is safer, faster, and best of all lets you use Simply Schedule Appointments :) <br /><a href="https://simplyscheduleappointments.com/">Learn More</a>';
return false;
}
if ( ! class_exists( '\League\Period\Period' ) ) {
$this->activation_errors[] = 'Core library <code>Period</code> missing, please <a href="mailto:support@simplyscheduleappointments.com">contact support</a>';
}
if ( ! empty( $this->activation_errors ) ) {
return false;
}
// Handle edge case - with no permalinks set, all WP REST API calls will fail
global $wp_rewrite;
if ( ! empty( $wp_rewrite ) && empty( $wp_rewrite->permalink_structure ) ) {
$wp_rewrite->set_permalink_structure( '/%postname%/' );
update_option( 'rewrite_rules', false );
$wp_rewrite->flush_rules( true );
}
// Do checks for required classes / functions or similar.
// Add detailed messages to $this->activation_errors array.
return true;
}
/**
* Adds a notice to the dashboard if the plugin requirements are not met.
*
* @since 0.0.0
*/
public function requirements_not_met_notice() {
// Compile default message.
$default_message = sprintf( __( 'Simply Schedule Appointments detected that your system does not meet the minimum requirements. We\'ve <a href="%s">deactivated</a> Simply Schedule Appointments to make sure nothing breaks.', 'simply-schedule-appointments' ), admin_url( 'plugins.php' ) );
// Default details to null.
$details = null;
// Add details if any exist.
if ( $this->activation_errors && is_array( $this->activation_errors ) ) {
$details = '<h4>' . implode( '</h4><br /><h4>', $this->activation_errors ) . '</h4>';
}
// Output errors.
?>
<div id="message" class="error">
<h3><?php echo wp_kses_post( $default_message ); ?></h3>
<?php echo wp_kses_post( $details ); ?>
</div>
<?php
}
/**
* Magic getter for our object.
*
* @since 0.0.0
*
* @param string $field Field to get.
* @throws Exception Throws an exception if the field is invalid.
* @return mixed Value of the field.
*/
public function __get( $field ) {
switch ( $field ) {
case 'version':
return self::VERSION;
case 'basename':
case 'url':
case 'path':
case 'mailchimp':
case 'mailchimp_settings':
case 'memberpress':
case 'memberpress_api':
case 'mailchimp_api':
case 'appointments':
case 'appointments_api':
case 'appointments_db':
case 'db':
case 'appointment_types_db':
case 'settings':
case 'settings_api':
case 'settings_global':
case 'settings_installed':
case 'validation':
case 'bootstrap':
case 'capabilities':
case 'utils':
case 'db_model':
case 'revision_model':
case 'revision_meta_model':
case 'appointment_model':
case 'appointment_meta_model':
case 'appointment_type_model':
case 'appointment_type_label_model':
case 'wp_admin':
case 'availability_model':
case 'availability_external_model':
case 'availability_functions':
case 'availability_default':
case 'availability_cache':
case 'scheduling_max_per_day':
case 'ics_exporter':
case 'csv_exporter':
case 'block_booking':
case 'shortcodes':
case 'appointment_object':
case 'filesystem':
case 'upgrade':
case 'gcal_exporter':
case 'block_upcoming_appointments':
case 'dashboard_upcoming_appointments_widget':
case 'notifications':
case 'notifications_api':
case 'notifications_settings':
case 'license':
case 'license_api':
case 'async_action_model':
case 'advanced_scheduling_settings':
case 'advanced_scheduling_availability':
case 'blackout_dates':
case 'blackout_dates_settings':
case 'capacity_settings':
case 'capacity':
case 'cache':
case 'customer_information':
case 'customers':
case 'debug':
case 'missing':
if ( property_exists( $this, $field ) && ! is_null( $this->$field ) ) {
return $this->$field;
} else {
return $this->missing;
}
default:
return $this->missing;
}
}
/**
* Include a file from the includes directory.
*
* @since 0.0.0
*
* @param string $filename Name of the file to be included.
* @return boolean Result of include call.
*/
public static function include_file( $filename ) {
$file = self::dir( $filename . '.php' );
if ( file_exists( $file ) ) {
return include_once $file;
}
return false;
}
/**
* This plugin's directory.
*
* @since 0.0.0
*
* @param string $path (optional) appended path.
* @return string Directory and path.
*/
public static function dir( $path = '' ) {
static $dir;
$dir = $dir ? $dir : trailingslashit( dirname( __FILE__ ) );
return $dir . $path;
}
/**
* This plugin's template subdirectory.
*
* @since 0.0.0
*
* @param string $path (optional) appended path.
* @return string Directory and path.
*/
public static function template_subdirectory() {
return apply_filters( 'ssa_template_subdirectory', 'ssa/' );
}
/**
* This plugin's url.
*
* @since 0.0.0
*
* @param string $path (optional) appended path.
* @return string URL and path.
*/
public static function url( $path = '' ) {
static $url;
$url = $url ? $url : trailingslashit( plugin_dir_url( __FILE__ ) );
return $url . $path;
}
/**
* This plugin's version.
*
* @since 4.4.9
*
* @return string
*/
public function get_current_version() {
return $this->__get( 'version' );
}
/**
* The current user's edition.
*
* @since 6.0.4
*
* @return integer
*/
public function get_current_edition() {
$current_edition = substr( $this->get_current_version(), 0, 1 );
// Handle case when there is no prefix added yet, assume it's development environment
$editions = array_keys( $this->ssa_editions() );
if ( ! in_array( $current_edition, $editions ) ) {
$current_edition = max( $editions );
}
return (int) $current_edition;
}
private function ssa_editions () {
return array(
'1' => 'Basic',
'2' => 'Plus',
'3' => 'Pro',
'4' => 'Business',
);
}
/**
* The current ssa edition; Business, Pro, Plus, Basic
*
* @return string
*/
public function get_current_edition_str() {
$editions = $this->ssa_editions();
$curr_edition = $this->get_current_edition();
return $editions[ strval( $curr_edition ) ];
}
/**
* Update current plugin's version on the database.
*
* @since 4.4.9
*
* @return void
*/
public function store_current_version() {
$version = $this->get_current_version();
update_option( 'ssa_plugin_version', $version );
}
}
/**
* Grab the Simply_Schedule_Appointments object and return it.
* Wrapper for Simply_Schedule_Appointments::get_instance().
*
* @since 0.0.0
* @return Simply_Schedule_Appointments Singleton instance of plugin class.
*/
function ssa() {
return Simply_Schedule_Appointments::get_instance();
}
// Kick it off.
add_action( 'plugins_loaded', array( ssa(), 'hooks' ) );
// Activation and deactivation.
register_activation_hook( __FILE__, array( ssa(), '_activate' ) );
register_deactivation_hook( __FILE__, array( ssa(), '_deactivate' ) );
// Uninstall
register_uninstall_hook( __FILE__, array( 'Simply_Schedule_Appointments', '_uninstall' ) );
function ssa_is_debug() {
if ( defined( 'SSA_DEBUG' ) && SSA_DEBUG ) {
return true;
}
return false;
}
if ( defined( 'WP_CLI' ) && WP_CLI && method_exists( 'WP_CLI', 'add_command' ) ) {
require_once ssa()->dir( 'includes/class-cli.php' );
}