PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.28
Timetics – Appointment Booking Calendar & Scheduling v1.0.28
1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 All 62 releases
timetics / bootstrap.php

bootstrap.php in Timetics – Appointment Booking Calendar & Scheduling 1.0.28, at bootstrap.php

445 lines 13.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Bootstrap Class
4 *
5 * @package Timetics
6 */
7 namespace Timetics;
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * Bootstrap class.
13 *
14 * @since 1.0.0
15 */
16 final class Bootstrap {
17 /**
18 * @var Bootstrap The Actual Timetics instance
19 * @since 1.0.0
20 */
21 private static $instance;
22
23
24 private $file;
25 public $version;
26 private $has_pro;
27
28 /**
29 * Throw Error While Trying To Clone Object
30 *
31 * @since 1.0.0
32 * @return void
33 */
34 public function __clone() {
35 _doing_it_wrong( __FUNCTION__, esc_html__( 'Cloning is forbidden.', 'timetics' ), '1.0.0' );
36 }
37
38 /**
39 * Disabling Un-serialization Of This Class
40 */
41 public function __wakeup() {
42 _doing_it_wrong( __FUNCTION__, esc_html__( 'Unserializing instances of this class is forbidden.', 'timetics' ), '1.0.0' );
43 }
44
45 /**
46 * The actual TimeTics instance
47 *
48 * @since 1.0.0
49 * @param string $file
50 * @return void
51 */
52 public static function instantiate( $file = '' ) {
53
54 // Return if already instantiated
55 if ( self::instantiated() ) {
56 return self::$instance;
57 }
58
59 self::prepare_instance( $file );
60
61 self::$instance->initialize_constants();
62 self::$instance->define_tables();
63 self::$instance->include_files();
64 self::$instance->initialize_components();
65
66 return self::$instance;
67 }
68
69 /**
70 * Return If The Main Class has Already Been Instantiated Or Not
71 *
72 * @since 1.0.0
73 * @return boolean
74 */
75 private static function instantiated() {
76 if ( ( null !== self::$instance ) && ( self::$instance instanceof Bootstrap ) ) {
77 return true;
78 }
79
80 return false;
81 }
82
83 /**
84 * Prepare Singleton Instance
85 *
86 * @since 1.0.0
87 * @param string $file
88 * @return void
89 */
90 private static function prepare_instance( $file = '' ) {
91 self::$instance = new self();
92 self::$instance->file = $file;
93 self::$instance->version = \Timetics::get_version();
94 }
95
96 /**
97 * Assets Directory URL
98 *
99 * @since 1.0.0
100 * @return void
101 */
102 public function get_assets_url() {
103 return trailingslashit( TIMETICS_PLUGIN_URL . 'assets' );
104 }
105
106 /**
107 * Assets Directory Path
108 *
109 * @since 1.0.0
110 * @return void
111 */
112 public function get_assets_dir() {
113 return trailingslashit( TIMETICS_PLUGIN_DIR . 'assets' );
114 }
115
116 /**
117 * Plugin Directory URL
118 *
119 * @return void
120 */
121 public function get_plugin_url() {
122 return trailingslashit( plugin_dir_url( TIMETICS_PLUGIN_FILE ) );
123 }
124
125 /**
126 * Plugin Directory Path
127 *
128 * @return void
129 */
130 public function get_plugin_dir() {
131 return \Timetics::get_plugin_dir();
132 }
133
134 /**
135 * Plugin Basename
136 *
137 * @return void
138 */
139 public function get_plugin_basename() {
140 return plugin_basename( TIMETICS_PLUGIN_FILE );
141 }
142
143 /**
144 * Setup Plugin Constants
145 *
146 * @since 1.0.0
147 * @return void
148 */
149 private function initialize_constants() {
150 // Plugin Version
151 self::$instance->define( 'TIMETICS_VERSION', \Timetics::get_version() );
152
153 // Plugin Main File
154 self::$instance->define( 'TIMETICS_PLUGIN_FILE', $this->file );
155
156 // Plugin File Basename
157 self::$instance->define( 'TIMETICS_PLUGIN_BASE', $this->get_plugin_basename() );
158
159 // Plugin Main Directory Path
160 self::$instance->define( 'TIMETICS_PLUGIN_DIR', $this->get_plugin_dir() );
161
162 // Plugin Main Directory URL
163 self::$instance->define( 'TIMETICS_PLUGIN_URL', $this->get_plugin_url() );
164
165 // Plugin Assets Directory URL
166 self::$instance->define( 'TIMETICS_ASSETS_URL', $this->get_assets_url() );
167
168 // Plugin Assets Directory Path
169 self::$instance->define( 'TIMETICS_ASSETS_DIR', $this->get_assets_dir() );
170
171
172 }
173
174 /**
175 * Define constant if not already set.
176 *
177 * @since 1.0.0
178 * @param string $name Constant name.
179 * @param string|bool $value Constant value.
180 */
181 private function define( $name, $value ) {
182 if ( ! defined( $name ) ) {
183 define( $name, $value );
184 }
185 }
186
187 /**
188 * Define DB Tables Required For This Plugin
189 *
190 * @since 1.0.0
191 * @return void
192 */
193 private function define_tables() {
194 // To Be Implemented
195 }
196
197 /**
198 * Include All Required Files
199 *
200 * @since 1.0.0
201 * @return void
202 */
203 private function include_files() {
204 // require_once TIMETICS_PLUGIN_DIR . 'includes/post-types.php';
205 // require_once TIMETICS_PLUGIN_DIR . 'includes/widgets/manifest.php';
206 // require_once TIMETICS_PLUGIN_DIR . 'includes/template-functions.php';
207 // require_once TIMETICS_PLUGIN_DIR . 'includes/shortcodes.php';
208 // require_once TIMETICS_PLUGIN_DIR . 'includes/install.php';
209
210 /**
211 * Core helpers.
212 */
213 require_once TIMETICS_PLUGIN_DIR . 'utils/global-helper.php';
214 }
215
216 /**
217 * Initialize All Components
218 *
219 * @since 1.0.0
220 * @return void
221 */
222 private function initialize_components() {
223
224 // Register scripts and styles first
225 if ( $this->is_request( 'admin' ) ) {
226 add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );
227 }
228
229 if ( $this->is_request( 'frontend' ) ) {
230 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
231 }
232
233 // Register admin menu
234 Core\Admin\Menu::instance()->init();
235 Core\Base::instance()->init();
236 Core\Services\Hooks::instance()->init();
237 Base\Custom_Endpoint::instance()->init();
238
239 global $current_screen;
240 $this->has_pro = class_exists('TimeticsPro');
241
242 $this->handle_buy_pro_module();
243
244 if ( function_exists('WC') ) {
245 Core\Integrations\Woocommerce\Hooks::instance()->init();
246 }
247 }
248
249 /**
250 * demo url for set pro button
251 *
252 * @return void
253 */
254 public function demo_url(){
255 return "https://arraytics.com/timetics/";
256 }
257
258 /**
259 * Register scripts and styles for admin
260 *
261 * @return void
262 */
263 public function admin_scripts( $handle ) {
264 if ( 'toplevel_page_timetics' !== $handle ) {
265 return;
266 }
267 global $wp_locale;
268
269 wp_enqueue_media();
270 wp_enqueue_style( 'wp-color-picker' );
271 wp_enqueue_style( 'timetics-admin-style', TIMETICS_ASSETS_URL . 'css/admin.css', [], TIMETICS_VERSION, 'all' );
272 wp_enqueue_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
273 wp_enqueue_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
274 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
275
276 $calendar_locale = timetics_get_option('calendar_locale');
277 if (!empty($calendar_locale)) {
278 wp_enqueue_script( 'calendar-locale', TIMETICS_ASSETS_URL . "js/local/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
279 }
280
281 wp_enqueue_script( 'timetics-dashboard-scripts', TIMETICS_ASSETS_URL . 'js/dashboard.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data', 'wp-color-picker' ], TIMETICS_VERSION, true );
282
283
284 $localize_obj = array(
285 'site_url' => site_url(),
286 'admin_url' => admin_url(),
287 'nonce' => wp_create_nonce( 'wp_rest' ),
288 'timezone' => timetics_get_timezone_list(),
289 'stripe_pub_key' => timetics_get_option( 'stripe_pub_key' ),
290 'date_format' => get_option( 'date_format' ),
291 'date_format_string' => date_i18n( get_option( 'date_format' ) ),
292 'time_format' => get_option( 'time_format' ),
293 'time_format_string' => date_i18n( get_option( 'time_format' ) ),
294 'start_of_week' => get_option( 'start_of_week', 0 ),
295
296 'default_timezone' => timetics_get_default_timezone(),
297 'currency_list' => timetics_get_currencies(),
298 'current_user_id' => get_current_user_id(),
299 'timeticsPro' => class_exists('TimeticsPro') ? true : false,
300 'demo_url' => $this->demo_url(),
301 'current_user' => timetics_get_current_user(),
302 );
303
304 $localize_obj = apply_filters( 'timetics_admin_localize_data', $localize_obj );
305
306 wp_localize_script( 'timetics-dashboard-scripts', 'timetics', $localize_obj );
307 }
308
309 /**
310 * Register scripts and styles for frontend
311 *
312 * @return void
313 */
314 public function frontend_scripts() {
315 wp_register_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
316 wp_register_style( 'timetics-frontend', TIMETICS_ASSETS_URL . 'css/frontend.css', [], TIMETICS_VERSION, 'all' );
317
318 wp_register_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
319 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
320
321 wp_register_script( 'timetics-frontend-scripts', TIMETICS_ASSETS_URL . 'js/frontend.js', [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
322
323 $calendar_locale = timetics_get_option('calendar_locale');
324 if (!empty($calendar_locale)) {
325 wp_register_script( 'calendar-locale', "https://npmcdn.com/flatpickr/dist/l10n/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
326 }
327
328 // load text domain
329 wp_set_script_translations( 'timetics-frontend-scripts', 'timetics', TIMETICS_PLUGIN_DIR . 'languages/' );
330
331 global $wp_locale;
332
333 $stripe_pub_key = timetics_get_option( 'stripe_pub_key' );
334 $stripe_secret_key = timetics_get_option( 'stripe_secret_key' );
335 $stripe_configure = $stripe_pub_key && $stripe_secret_key;
336
337 $localize_obj = array(
338 'site_url' => site_url(),
339 'nonce' => wp_create_nonce( 'wp_rest' ),
340 'date_format' => get_option( 'date_format' ),
341 'time_format' => get_option( 'time_format' ),
342 'stripe_pub_key' => $stripe_pub_key,
343 'currency' => apply_filters( 'timetics_currency', timetics_get_option( 'currency', 'USD' ) ),
344 'stripe_configure' => $stripe_configure,
345 'current_user_id' => get_current_user_id(),
346 'start_of_week' => get_option( 'start_of_week', 0 ),
347 'currency_list' => timetics_get_currencies(),
348 'locale_name' => strtolower( str_replace( '_', '-', get_locale() ) )
349
350 );
351
352 $localize_obj = apply_filters( 'timetics_frontned_localize_data', $localize_obj );
353
354 wp_localize_script( 'timetics-frontend-scripts', 'timetics', $localize_obj );
355 }
356
357 /**
358 * What type of request
359 *
360 * @param string $type admin,frontend, ajax, cron
361 * @return boolean
362 */
363 private function is_request( $type ) {
364 switch ( $type ) {
365 case 'admin':
366 return is_admin();
367 case 'ajax':
368 return defined( 'DOING_AJAX' );
369 case 'cron':
370 return defined( 'DOING_CRON' );
371 case 'frontend':
372 return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! $this->is_rest_api_request();
373 }
374 }
375
376 /**
377 * Returns if the request is non-legacy REST API request.
378 *
379 * @return boolean
380 */
381 private function is_rest_api_request() {
382 $server_request = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : false;
383
384 if ( ! $server_request ) {
385 return false;
386 }
387
388 $rest_prefix = trailingslashit( rest_get_url_prefix() );
389 $is_rest_request = ( false !== strpos( $server_request, $rest_prefix ) );
390
391 return apply_filters( 'timetics_is_rest_api_request', $is_rest_request );
392 }
393
394
395 /**
396 * Show buy-pro menu if pro plugin not active
397 *
398 * @return void
399 */
400 public function handle_buy_pro_module() {
401 $page = isset( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
402
403
404 if ( 'timetics' !== $page ) {
405 return;
406 }
407
408
409 /**
410 * Show banner (codename: jhanda)
411 */
412 $filter_string = 'timetics,timetics-free-only';
413
414 if( $this->has_pro ) {
415
416 $filter_string .= ',timetics-pro';
417 $filter_string = str_replace(',timetics-free-only', '', $filter_string);
418
419 }
420
421
422 \Wpmet\Libs\Banner::instance('timetics')
423 ->is_test(true)
424 ->set_filter(ltrim($filter_string, ','))
425 ->set_api_url('https://demo.themewinter.com/public/jhanda')
426 ->set_plugin_screens('timetics')
427 ->set_plugin_screens('toplevel_page_timetics')
428 ->call();
429 // show get-help and upgrade-to-premium menu.
430 // $this->handle_get_help_and_upgrade_menu();
431 }
432
433 }
434
435 /**
436 * Returns The Instance Of Timetics.
437 * The main function that is responsible for returning Timetics instance.
438 *
439 * @since 1.0.0
440 * @return Timetics
441 */
442 function timetics() {
443 return Bootstrap::instantiate();
444 }
445