PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.57
Timetics – Appointment Booking Calendar & Scheduling v1.0.57
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 / timetics.php

timetics.php in Timetics – Appointment Booking Calendar & Scheduling 1.0.57, at timetics.php

406 lines 11.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Plugin Name: Timetics - Appointment Booking Calendar & Scheduling System
5 * Plugin URI: https://arraytics.com/timetics/
6 * Description: Schedule, Appointment and Seat Booking plugin.
7 * Version: 1.0.57
8 * Requires at least: 5.2
9 * Requires PHP: 7.3
10 * Author: Arraytics
11 * Author URI: https://arraytics.com/
12 * License: GPL v2 or later
13 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
14 * Text Domain: timetics
15 * Domain Path: /languages
16
17 * Timetics is free software: you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation, either version 2 of the License, or
20 * any later version.
21
22 * Timetics Essential is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
26
27 * You should have received a copy of the GNU General Public License
28 * along with Timetics. If not, see <http://www.gnu.org/licenses/>.
29 *
30 * @package Timetics
31 * @category Core
32 * @author Arraytics
33 * @version 1.0.10
34 */
35
36 // Exit if accessed directly.
37 defined( 'ABSPATH' ) || exit;
38
39 /**
40 * The Main Plugin Requirements Checker
41 *
42 * @since 1.0.0
43 */
44 final class Timetics {
45
46 /**
47 * Static Property To Hold Singleton Instance
48 *
49 * @var Timetics The Timetics Requirement Checker Instance
50 */
51 private static $instance;
52
53 /**
54 * Plugin Current Production Version
55 *
56 * @return string
57 */
58 public static function get_version() {
59 return '1.0.57';
60 }
61
62 /**
63 * Requirements Array
64 *
65 * @since 1.0.0
66 * @var array
67 */
68 private $requirements = array(
69 'php' => array(
70 'name' => 'PHP',
71 'minimum' => '7.3',
72 'exists' => true,
73 'met' => false,
74 'checked' => false,
75 'current' => false,
76 ),
77 'wp' => array(
78 'name' => 'WordPress',
79 'minimum' => '5.2',
80 'exists' => true,
81 'checked' => false,
82 'met' => false,
83 'current' => false,
84 ),
85 );
86
87 /**
88 * Singleton Instance
89 *
90 * @return Timetics
91 */
92 public static function get_instance() {
93 if ( null === self::$instance ) {
94 self::$instance = new self();
95 }
96
97 return self::$instance;
98 }
99
100 /**
101 * Setup Plugin Requirements
102 *
103 * @since 1.0.0
104 */
105 private function __construct() {
106 // Always load translation.
107 add_action( 'init', array( $this, 'load_text_domain' ) );
108
109 // Initialize plugin functionalities or quit.
110 $this->requirements_met() ? $this->initialize_modules() : $this->quit();
111 }
112
113 /**
114 * Load Localization Files
115 *
116 * @since 1.0
117 * @return void
118 */
119 public function load_text_domain() {
120 $locale = determine_locale();
121 $locale = apply_filters( 'plugin_locale', $locale, 'timetics' );
122 $locale = apply_filters( 'timetics_plugin_locale', $locale, 'timetics' );
123
124 $mofile = 'timetics-' . $locale . '.mo';
125
126 // Loco "Custom" location.
127 if ( file_exists( WP_LANG_DIR . '/loco/plugins/' . $mofile ) ) {
128 load_textdomain( 'timetics', WP_LANG_DIR . '/loco/plugins/' . $mofile );
129 }
130
131 // Loco "System" location.
132 if ( file_exists( WP_LANG_DIR . '/plugins/' . $mofile ) ) {
133 load_textdomain( 'timetics', WP_LANG_DIR . '/plugins/' . $mofile );
134 }
135
136 // Loco "Author" location (plugin's own /languages/).
137 load_plugin_textdomain( 'timetics', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
138 }
139
140 /**
141 * Initialize Plugin Modules
142 *
143 * @since 1.0.0
144 * @return void
145 */
146 private function initialize_modules() {
147 require_once dirname( __FILE__ ) . '/autoloader.php';
148 require_once dirname( __FILE__ ) . '/core/settings/settings.php';
149
150 require_once dirname( __FILE__ ) . '/utils/global-helper.php';
151
152 // block for showing banner.
153 require_once plugin_dir_path( __FILE__ ) . '/utils/notice/notice.php';
154 require_once plugin_dir_path( __FILE__ ) . '/utils/banner/banner.php';
155 require_once plugin_dir_path( __FILE__ ) . '/utils/pro-awareness/pro-awareness.php';
156
157 // Include the bootstrap file if not loaded.
158 if ( ! class_exists( 'Timetics\Bootstrap' ) ) {
159 require_once self::get_plugin_dir() . 'bootstrap.php';
160 }
161
162 // init notice class.
163 \Oxaim\Libs\Notice::init();
164
165 // init pro menu class.
166 \Wpmet\Libs\Pro_Awareness::init();
167
168 // Initialize the bootstraper if exists.
169 if ( class_exists( 'Timetics\Bootstrap' ) ) {
170
171 // Initialize all modules through plugins_loaded.
172 add_action( 'plugins_loaded', array( $this, 'init' ) );
173
174 register_activation_hook( self::get_plugin_file(), array( $this, 'activate' ) );
175 register_deactivation_hook( self::get_plugin_file(), array( $this, 'deactivate' ) );
176 }
177 }
178
179 /**
180 * Check If All Requirements Are Fulfilled
181 *
182 * @return boolean
183 */
184 private function requirements_met() {
185 $this->prepare_requirement_versions();
186
187 $passed = true;
188 $to_meet = wp_list_pluck( $this->requirements, 'met' );
189
190 foreach ( $to_meet as $met ) {
191 if ( empty( $met ) ) {
192 $passed = false;
193 continue;
194 }
195 }
196
197 return $passed;
198 }
199
200 /**
201 * Requirement Version Prepare
202 *
203 * @since 1.0.0
204 *
205 * @return void
206 */
207 private function prepare_requirement_versions() {
208 foreach ( $this->requirements as $dependency => $config ) {
209 switch ( $dependency ) {
210 case 'php':
211 $version = phpversion();
212 break;
213 case 'wp':
214 $version = get_bloginfo( 'version' );
215 break;
216 default:
217 $version = false;
218 }
219
220 if ( ! empty( $version ) ) {
221 $this->requirements[$dependency]['current'] = $version;
222 $this->requirements[$dependency]['checked'] = true;
223 $this->requirements[$dependency]['met'] = version_compare( $version, $config['minimum'], '>=' );
224 }
225 }
226 }
227
228 /**
229 * Initialize everything
230 *
231 * @since 1.0.0
232 *
233 * @return void
234 */
235 public function init() {
236 Timetics\Bootstrap::instantiate( self::get_plugin_file() );
237
238 // Add autoload from composer for integrating uninstallation form
239 if (file_exists(plugin_dir_path( __FILE__ ) . '/vendor/autoload.php')) {
240 require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload.php';
241 }
242
243 if (class_exists('UninstallerForm\UninstallerForm') && is_callable(['\UninstallerForm\UninstallerForm', 'init'])) {
244
245 $reflection = new ReflectionMethod('\UninstallerForm\UninstallerForm', 'init');
246
247 // Maximum number of parameters allowed
248 $totalParams = $reflection->getNumberOfParameters();
249
250 if($totalParams === 6) {
251 add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
252 if ( $request->get_route() === '/timetics/v1/feedback' ) {
253 $params = $request->get_json_params();
254
255 if ( empty( $params['email'] ) ) {
256 $params['email'] = get_option( 'admin_email' );
257 $request->set_body( wp_json_encode( $params ) );
258 }
259 }
260 return $response;
261 }, 10, 3 );
262
263 \UninstallerForm\UninstallerForm::init(
264 'Timetics', // Plugin name
265 'timetics', // Plugin Slug
266 __FILE__,
267 'timetics', // Text Domain Name
268 'timetics-feedback-modal', // plugins-admin-script-handler
269 'https://arraytics.com/?fluentcrm=1&route=contact&hash=13cce8a6-c038-4997-91e7-4a2326cc1124'
270 );
271 } else {
272 add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
273 if ( $request->get_route() === '/timetics/v1/feedback' ) {
274 $params = $request->get_json_params();
275
276 if ( empty( $params['email'] ) ) {
277 $params['email'] = get_option( 'admin_email' );
278 $request->set_body( wp_json_encode( $params ) );
279 }
280 }
281 return $response;
282 }, 10, 3 );
283
284 \UninstallerForm\UninstallerForm::init(
285 'Timetics', // Plugin name
286 'timetics', // Plugin Slug
287 __FILE__,
288 'timetics', // Text Domain Name
289 'timetics-feedback-modal'
290 );
291 }
292 }
293 }
294
295 /**
296 * Called Only Once While Activation
297 *
298 * @return void
299 */
300 public function activate() {
301 // Insert new role.
302 Timetics\Base\Role::instance()->init();
303
304 // Update default settings.
305 timetics_update_default_settings();
306
307 // Register cron
308 timetics_register_cron();
309
310 // Create new woocommerce product category for timetics meeting
311 timetics_add_woocommerce_product_cat();
312
313 // Force rewrite-rule flush on activation; the maybe_flush_rules guard handles subsequent upgrades.
314 delete_option( 'timetics_rewrite_version' );
315
316 // Update option for onboard settings.
317 $timetics_onboard_setup = get_option( 'timetics_onboard_setup' );
318
319 $timetics_demo_data = get_option( 'timetics_demo_data' );
320
321 if ( ! $timetics_demo_data ) {
322 $dummy_data_generator = new Timetics\Core\DummyData\Dummy_Data_Generator();
323 $dummy_data_generator->generate();
324 update_option( 'timetics_demo_data', true );
325 }
326
327 if ( ! $timetics_onboard_setup ) {
328 update_option( 'timetics_onboard_settings', true );
329 }
330 }
331
332 /**
333 * Called Only Once While Deactivation
334 *
335 * @return void
336 */
337 public function deactivate() {
338 }
339
340 /**
341 * Quit Plugin Execution
342 *
343 * @return void
344 */
345 private function quit() {
346 add_action( 'admin_head', array( $this, 'show_plugin_requirements_not_met_notice' ) );
347 }
348
349 /**
350 * Show Error Notice For Missing Requirements
351 *
352 * @return void
353 */
354 public function show_plugin_requirements_not_met_notice() {
355 printf( '<div>Minimum requirements for Timetics are not met. Please update requirements to continue.</div>' );
356 }
357
358 /**
359 * Plugin Main File
360 *
361 * @return string
362 */
363 public static function get_plugin_file() {
364 return __FILE__;
365 }
366
367 /**
368 * Plugin Base Directory Path
369 *
370 * @return string
371 */
372 public static function get_plugin_dir() {
373 return trailingslashit( plugin_dir_path( self::get_plugin_file() ) );
374 }
375 }
376
377 /**
378 * Add a "Go Pro" action link on the Plugins page.
379 * Hidden when the pro plugin already exists.
380 */
381 if ( ! function_exists( 'timetics_add_go_pro_action_link' ) ) {
382 function timetics_add_go_pro_action_link( $links ) {
383 if ( ! function_exists( 'get_plugins' ) ) {
384 require_once ABSPATH . 'wp-admin/includes/plugin.php';
385 }
386
387 foreach ( get_plugins() as $plugin ) {
388 if ( isset( $plugin['TextDomain'] ) && 'timetics-pro' === $plugin['TextDomain'] ) {
389 return $links;
390 }
391 }
392
393 $go_pro = sprintf(
394 '<a href="%1$s" target="_blank" rel="noopener noreferrer" style="color:#e8364c;font-weight:600;">%2$s</a>',
395 esc_url( 'https://arraytics.com/timetics/pricing/' ),
396 esc_html__( 'Go Pro', 'timetics' )
397 );
398
399 $links[] = $go_pro;
400 return $links;
401 }
402 }
403 add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'timetics_add_go_pro_action_link' );
404
405 Timetics::get_instance();
406