PluginProbe
WANotifier for Forms and Actions / 2.5.3
WANotifier for Forms and Actions v2.5.3
3.1.0 3.0.4 2.7.10 2.7.11 2.7.12 2.7.13 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 3.0.0 3.0.1 3.0.2 3.0.3 trunk 0.1.0 0.1.1 1.0.0 1.0.1 1.0.2 1.0.3 All 66 releases
← All changes | includes/class-notifier.php +54 -197 trunk2.5.3 View file →
@@ -1,9 +1,5 @@
1 1 <?php
2 -if ( ! defined( 'ABSPATH' ) ) {
3 - exit;
4 -}
5 -
6 2 /**
7 3 * The core plugin class.
8 4 *
9 5 * @package Notifier
@@ -26,16 +22,14 @@
26 22 /**
27 23 * Define Constants.
28 24 */
29 25 private function define_constants() {
30 - $this->define( 'NOTIFIER_VERSION', '3.1.0' );
26 + $this->define( 'NOTIFIER_VERSION', '2.5.3' );
31 27 $this->define( 'NOTIFIER_NAME', 'notifier' );
32 28 $this->define( 'NOTIFIER_PREFIX', 'notifier_' );
33 29 $this->define( 'NOTIFIER_URL', trailingslashit( plugins_url( '', dirname(__FILE__) ) ) );
34 - $this->define( 'NOTIFIER_APP_BASE_URL', 'https://app.wanotifier.com' );
35 - $this->define( 'NOTIFIER_APP_API_PATH', 'api/v1' );
30 + $this->define( 'NOTIFIER_APP_API_URL', 'https://app.wanotifier.com/api/v1/' );
36 31 $this->define( 'NOTIFIER_ACTIVITY_TABLE_NAME', 'notifier_activity_log' );
37 - $this->define( 'NOTIFIER_CART_ABANDONMENT_TABLE', 'notifier_cart_abandonment' );
38 32 }
39 33
40 34 /**
41 35 * Define constant if not already set.
@@ -66,18 +60,19 @@
66 60 */
67 61 private function includes() {
68 62 // Functions
69 63 require_once NOTIFIER_PATH . 'includes/functions/functions-notifier-helpers.php';
64 + require_once NOTIFIER_PATH . 'includes/functions/functions-notifier-meta-box-fields.php';
70 65 require_once NOTIFIER_PATH . 'libraries/action-scheduler/action-scheduler.php';
71 66
72 67 // Classes
73 68 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-admin-notices.php';
74 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-connection.php';
75 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-migration.php';
76 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-backend.php';
69 + require_once NOTIFIER_PATH . 'includes/classes/class-notifier-dashboard.php';
77 70 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-notification-merge-tags.php';
78 71 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-notification-triggers.php';
72 + require_once NOTIFIER_PATH . 'includes/classes/class-notifier-settings.php';
79 73 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-frontend.php';
74 + require_once NOTIFIER_PATH . 'includes/classes/class-notifier-tools.php';
80 75 }
81 76
82 77 /**
83 78 * Hook into actions and filters.
@@ -86,13 +81,12 @@
86 81 register_activation_hook ( NOTIFIER_FILE, array( $this, 'activate') );
87 82 register_deactivation_hook ( NOTIFIER_FILE, array( $this, 'deactivate') );
88 83
89 84 add_action( 'after_setup_theme', array( 'Notifier_Admin_Notices', 'init' ) );
90 - add_action( 'after_setup_theme', array( 'Notifier_Connection', 'init' ) );
91 - add_action( 'after_setup_theme', array( 'Notifier_Migration', 'init' ) );
92 - add_action( 'after_setup_theme', array( 'Notifier_Backend', 'init' ) );
85 + add_action( 'after_setup_theme', array( 'Notifier_Dashboard', 'init' ) );
93 86 add_action( 'after_setup_theme', array( 'Notifier_Notification_Merge_Tags', 'init' ) );
94 87 add_action( 'after_setup_theme', array( 'Notifier_Notification_Triggers', 'init' ) );
88 + add_action( 'after_setup_theme', array( 'Notifier_Settings', 'init' ) );
95 89 add_action( 'after_setup_theme', array( 'Notifier_Frontend', 'init' ) );
96 90 add_action( 'admin_enqueue_scripts', array( $this , 'admin_scripts') );
97 91 add_action( 'wp_enqueue_scripts', array( $this , 'frontend_scripts') );
98 92 add_action( 'in_admin_header', array( $this , 'embed_page_header' ) );
@@ -97,24 +91,15 @@
97 91 add_action( 'wp_enqueue_scripts', array( $this , 'frontend_scripts') );
98 92 add_action( 'in_admin_header', array( $this , 'embed_page_header' ) );
99 93
100 94 add_action( 'after_setup_theme', array( $this, 'maybe_include_integrations' ) );
95 + add_action( 'after_setup_theme', array( 'Notifier_Tools', 'init' ) );
101 96
102 - add_action( 'init', array( $this, 'load_textdomain' ) );
103 97 add_action( 'wp_loaded', array( $this, 'setup_activity_log' ) );
104 98 add_action( 'notifier_clean_old_logs', array( $this, 'notifier_delete_old_activity_logs' ) );
105 -
106 - add_action( 'wp_loaded', array( $this, 'create_cart_abandonment_table' ) );
107 99 }
108 100
109 101 /**
110 - * Load plugin text domain for translations.
111 - */
112 - public function load_textdomain() {
113 - load_plugin_textdomain( 'notifier', false, dirname( plugin_basename( NOTIFIER_FILE ) ) . '/languages' );
114 - }
115 -
116 - /**
117 102 * Setup during plugin activation
118 103 */
119 104 public function activate() {
120 105 $notifier_plugin_data = get_option('notifier_meta', array());
@@ -127,9 +112,8 @@
127 112 /**
128 113 * Setup during plugin deactivation
129 114 */
130 115 public function deactivate() {
131 - as_unschedule_action('notifier_check_cart_abandonment');
132 116 as_unschedule_action('notifier_clean_old_logs');
133 117 $notifier_plugin_data = get_option('notifier_meta', array());
134 118 $notifier_plugin_data['as_clear_log'] = 'yes';
135 119 update_option('notifier_meta', $notifier_plugin_data);
@@ -139,15 +123,14 @@
139 123 * Check if the plugin was updated and run the upgrade routine if necessary.
140 124 */
141 125 public function setup_activity_log() {
142 126 $notifier_plugin_data = get_option('notifier_meta', array());
143 - if ( ! isset( $notifier_plugin_data['activity_log_table'] ) || $notifier_plugin_data['activity_log_table'] !== 'yes' ) {
127 + if (!isset($notifier_plugin_data['activity_log_table']) && $notifier_plugin_data['activity_log_table'] !== 'yes') {
144 128 self::create_notifier_activity_log_table();
145 129 }
146 130
147 131 $args = array();
148 - $as_clear_log = isset($notifier_plugin_data['as_clear_log']) ? $notifier_plugin_data['as_clear_log'] : 'no';
149 - if ($as_clear_log !== 'yes') {
132 + if (!isset($notifier_plugin_data['as_clear_log']) || $notifier_plugin_data['as_clear_log'] !== 'yes') {
150 133 if (false === as_next_scheduled_action('notifier_clean_old_logs')) {
151 134 as_schedule_recurring_action(time(), DAY_IN_SECONDS, 'notifier_clean_old_logs', $args);
152 135 }
153 136 }
@@ -157,11 +140,9 @@
157 140 * Check if plugin's page
158 141 */
159 142 public static function is_notifier_page() {
160 143 $current_screen = get_current_screen();
161 - if ( strpos( $current_screen->id, NOTIFIER_NAME ) !== false
162 - && strpos( $current_screen->id, 'order-notifications-for-woocommerce' ) === false
163 - ) {
144 + if ( strpos($current_screen->id, NOTIFIER_NAME) !== false) {
164 145 return true;
165 146 }
166 147
167 148 return false;
@@ -170,40 +151,42 @@
170 151 /**
171 152 * Add admin scripts and styles
172 153 */
173 154 public function admin_scripts () {
174 - if ( ! Notifier_Migration::is_migration_complete() && 'dismissed' !== get_option( 'notifier_migration_notice_dismissed' ) ) {
175 - wp_enqueue_script(
176 - 'notifier-admin',
177 - NOTIFIER_URL . 'assets/js/admin.js',
178 - array( 'jquery' ),
179 - NOTIFIER_VERSION,
180 - true
181 - );
182 - wp_localize_script( 'notifier-admin', 'notifier_migration', array(
183 - 'ajax_url' => admin_url( 'admin-ajax.php' ),
184 - 'nonce' => wp_create_nonce( 'notifier_dismiss_migration' ),
185 - ) );
186 - }
187 -
188 155 if (!self::is_notifier_page()) {
189 156 return;
190 157 }
191 158
192 - wp_enqueue_script(
193 - NOTIFIER_NAME . '-admin-react',
194 - NOTIFIER_URL . 'assets/js/admin-react.js',
195 - array(),
196 - NOTIFIER_VERSION,
197 - true
198 - );
159 + // Select2
160 + wp_enqueue_script(
161 + NOTIFIER_NAME . '-select2-js',
162 + NOTIFIER_URL . 'assets/js/select2.min.js',
163 + array('jquery'),
164 + NOTIFIER_VERSION,
165 + true
166 + );
199 167
200 - wp_enqueue_style(
201 - NOTIFIER_NAME . '-admin-css',
202 - NOTIFIER_URL . 'assets/css/admin.css',
203 - null,
204 - NOTIFIER_VERSION
205 - );
168 + // Admin JS file
169 + wp_enqueue_script(
170 + NOTIFIER_NAME . '-admin-js',
171 + NOTIFIER_URL . 'assets/js/admin.js',
172 + array('jquery'),
173 + NOTIFIER_VERSION,
174 + true
175 + );
176 + wp_localize_script(
177 + NOTIFIER_NAME . '-admin-js',
178 + 'notifierObj',
179 + apply_filters( 'notifier_js_variables', array('ajaxurl' => admin_url( 'admin-ajax.php' ) ) )
180 + );
181 +
182 + // Styles
183 + wp_enqueue_style(
184 + NOTIFIER_NAME . '-admin-css',
185 + NOTIFIER_URL . 'assets/css/admin.css',
186 + null,
187 + NOTIFIER_VERSION
188 + );
206 189 }
207 190
208 191 /**
209 192 * Add frontend scripts and styles
@@ -217,59 +200,27 @@
217 200 null,
218 201 NOTIFIER_VERSION
219 202 );
220 203 }
221 -
222 - if ( ! self::is_woo_handled_by_standalone_plugin() && 'yes' === get_option('notifier_enable_abandonment_cart_tracking', 'no') && class_exists('WooCommerce') && is_checkout() ) {
223 - wp_enqueue_script(
224 - NOTIFIER_NAME . '-js',
225 - NOTIFIER_URL . 'assets/js/script.js',
226 - array('jquery'),
227 - NOTIFIER_VERSION,
228 - true
229 - );
230 -
231 - wp_localize_script(
232 - NOTIFIER_NAME . '-js',
233 - 'notifierFrontObj',
234 - array(
235 - 'ajaxurl' => admin_url( 'admin-ajax.php' ),
236 - 'security' => wp_create_nonce('notifier_save_cart_abandonment_data'),
237 - )
238 - );
239 - }
240 204 }
241 205
242 206 /**
243 207 * Set up a div for the header embed to render into.
244 - * Only renders for legacy (non-SPA) pages like the trigger CPT editor.
245 - * SPA pages render the header via the React app.
208 + * The initial contents here are meant as a place loader for when the PHP page initialy loads.
246 209 */
247 210 public static function embed_page_header() {
248 211 if (!self::is_notifier_page()) {
249 212 return;
250 213 }
251 -
252 - $screen = get_current_screen();
253 - $spa_pages = array(
254 - 'toplevel_page_notifier',
255 - 'wanotifier_page_notifier-chat-button',
256 - 'wanotifier_page_notifier-settings',
257 - 'wanotifier_page_notifier-logs',
258 - 'wanotifier_page_notifier-migration',
259 - );
260 -
261 - if ( in_array( $screen->id, $spa_pages, true ) ) {
262 - return;
263 - }
264 -
265 - $cpt = ( '' !== $screen->post_type ) ? $screen->post_type : '';
214 + $current_screen = get_current_screen();
215 + $cpt = ( '' !== $current_screen->post_type) ? $current_screen->post_type : '';
216 + $tax = ( '' !== $current_screen->taxonomy) ? $current_screen->taxonomy : '';
266 217 ?>
267 218 <div id="notifier-admin-header" data-post-type="<?php echo esc_attr($cpt); ?>">
268 219 <div class="notifier-admin-header-content">
269 220 <div class="header-page-title w-30 d-flex align-content-center">
270 - <a class="header-logo" href="admin.php?page=notifier"><img src="<?php echo esc_url( NOTIFIER_URL . 'assets/images/favicon.svg' ); ?>"></a>
271 - <h2>WANotifier</h2>
221 + <a class="header-logo" href="admin.php?page=notifier"><img src="<?php echo NOTIFIER_URL; ?>assets/images/favicon.svg"></a>
222 + <h2><?php echo esc_attr(get_admin_page_title()); ?></h2>
272 223 </div>
273 224 <div class="header-action-links w-30 d-flex justify-content-end">
274 225 <span class="review-us-link">Review us: <a href="https://wordpress.org/support/plugin/notifier/reviews/#new-post" target="_blank">⭐⭐⭐⭐⭐</a></span>
275 226 <span class="header-version">Version: <?php echo esc_html(NOTIFIER_VERSION); ?></span>
@@ -295,15 +246,15 @@
295 246 'Content-Type' => 'application/json; charset=utf-8'
296 247 );
297 248 }
298 249
299 - $request_url = NOTIFIER_APP_BASE_URL . '/' . NOTIFIER_APP_API_PATH . '/' . $endpoint . '?key=' . esc_attr($api_key);
250 + $request_url = NOTIFIER_APP_API_URL . $endpoint . '?key=' . $api_key;
300 251 $request_args = array(
301 252 'method' => $method,
302 253 'headers' => $headers,
303 254 'timeout' => 120,
304 255 'body' => json_encode($args),
305 - 'sslverify' => true
256 + 'sslverify' => false
306 257 );
307 258
308 259 $response = wp_remote_request( $request_url, $request_args );
309 260
@@ -318,60 +269,22 @@
318 269 }
319 270 }
320 271
321 272 /**
322 - * Whether the standalone WANotifier for WooCommerce plugin is active and
323 - * has completed its connection/migration, meaning this plugin should defer
324 - * all Woo/WCAR functionality to it.
325 - *
326 - * @return bool
327 - */
328 - public static function is_woo_handled_by_standalone_plugin() {
329 - static $result = null;
330 - if ( null !== $result ) {
331 - return $result;
332 - }
333 -
334 - if ( ! function_exists( 'is_plugin_active' ) ) {
335 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
336 - }
337 -
338 - if ( ! is_plugin_active( 'order-notifications-for-woocommerce/order-notifications-for-woocommerce.php' ) ) {
339 - $result = false;
340 - return false;
341 - }
342 -
343 - if ( 'complete' === get_option( 'wanowc_migration_status' ) ) {
344 - $result = true;
345 - return true;
346 - }
347 -
348 - if ( get_option( 'wanowc_conn_woocommerce_auth_key' ) || get_option( 'wanowc_conn_wcar_auth_key' ) ) {
349 - $result = true;
350 - return true;
351 - }
352 -
353 - $result = false;
354 - return false;
355 - }
356 -
357 - /**
358 273 * Load Woocommerce class if it's present is activated
359 274 */
360 275 public static function maybe_include_integrations () {
361 - $woo_handled = self::is_woo_handled_by_standalone_plugin();
362 -
363 - // Woocommerce — skip when the standalone plugin handles it
364 - if ( ! $woo_handled && class_exists( 'WooCommerce' ) ) {
276 + // Woocommerce
277 + if ( class_exists( 'WooCommerce' ) ) {
365 278 require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-woocommerce.php';
366 279 Notifier_Woocommerce::init();
367 280 }
368 - if ( ! $woo_handled && ! class_exists( 'WC_Session' ) && class_exists( 'WooCommerce' ) ) {
281 + if ( ! class_exists( 'WC_Session' ) ) {
369 282 include_once( WP_PLUGIN_DIR . '/woocommerce/includes/abstracts/abstract-wc-session.php' );
370 283 }
371 284
372 - // WooCommerce Cart Abandonment Recovery — skip when the standalone plugin handles it
373 - if ( ! $woo_handled && class_exists( 'CARTFLOWS_CA_Loader' ) && defined('CARTFLOWS_CA_VER') && version_compare(CARTFLOWS_CA_VER, '1.2.25', '>=')) {
285 + // WooCommerce Cart Abandonment Recovery by CartFlows
286 + if ( class_exists( 'CARTFLOWS_CA_Loader' ) && defined('CARTFLOWS_CA_VER') && version_compare(CARTFLOWS_CA_VER, '1.2.25', '>=')) {
374 287 require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-wcar.php';
375 288 Notifier_WCAR::init();
376 289 }
377 290
@@ -409,26 +322,8 @@
409 322 if ( function_exists( 'fluentFormApi' ) ) {
410 323 require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-fluentforms.php';
411 324 Notifier_FluentForms::init();
412 325 }
413 -
414 - //Forminator
415 - if ( class_exists( 'Forminator' ) ) {
416 - require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-forminator.php';
417 - Notifier_Forminator::init();
418 - }
419 -
420 - //SureForms
421 - if ( class_exists( 'SRFM\Plugin_Loader' ) ) {
422 - require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-sureforms.php';
423 - Notifier_SureForms::init();
424 - }
425 -
426 - //WS Form
427 - if ( class_exists( 'WS_Form' ) ) {
428 - require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-wsform.php';
429 - Notifier_WSForm::init();
430 - }
431 326 }
432 327
433 328 /**
434 329 * Is connection to WANotifier.com active?
@@ -478,44 +373,6 @@
478 373 $table_name = $wpdb->prefix . NOTIFIER_ACTIVITY_TABLE_NAME;
479 374 $retention_time = apply_filters( 'notifier_logs_retention_time', 7 );
480 375 $retention_time = intval($retention_time);
481 376 $wpdb->query( $wpdb->prepare( "DELETE FROM `$table_name` WHERE timestamp <= DATE_SUB(NOW(), INTERVAL %d DAY)", $retention_time ) );
482 - }
483 -
484 - /**
485 - * Create New db table-- notifier_cart_abandonment
486 - */
487 - public static function create_cart_abandonment_table() {
488 - if ( self::is_woo_handled_by_standalone_plugin() ) {
489 - return;
490 - }
491 -
492 - $notifier_plugin_data = get_option('notifier_meta', array());
493 - if ( ! isset( $notifier_plugin_data['cart_abandonment_table'] ) || $notifier_plugin_data['cart_abandonment_table'] !== 'yes' ) {
494 - global $wpdb;
495 - $table_name = $wpdb->prefix . NOTIFIER_CART_ABANDONMENT_TABLE;
496 - $charset_collate = $wpdb->get_charset_collate();
497 -
498 - // Updated CREATE TABLE query for notifier_cart_abandonment table
499 - $sql = "CREATE TABLE IF NOT EXISTS $table_name (
500 - session_id BIGINT(20) AUTO_INCREMENT PRIMARY KEY,
501 - session_key VARCHAR(16) NULL,
502 - phone_number VARCHAR(15) NULL,
503 - cart_data LONGTEXT NULL,
504 - cart_total DECIMAL(10,2) NULL,
505 - coupon_data LONGTEXT NULL,
506 - customer_data LONGTEXT NULL,
507 - order_id BIGINT(11) DEFAULT 0,
508 - triggered TINYINT(1) DEFAULT 0,
509 - created_time DATETIME NULL,
510 - updated_time DATETIME NULL,
511 - KEY session_key (session_key) -- Index for session_key
512 - ) $charset_collate;";
513 -
514 - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
515 - dbDelta( $sql );
516 -
517 - $notifier_plugin_data['cart_abandonment_table'] = 'yes';
518 - update_option('notifier_meta', $notifier_plugin_data);
519 - }
520 377 }
521 378 }