PluginProbe
WANotifier for Forms and Actions / 3.1.1
WANotifier for Forms and Actions v3.1.1
3.1.1 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 All 67 releases
← All changes | includes/class-notifier.php +344 -227 0.1.03.1.1 View file →
@@ -1,5 +1,9 @@
1 1 <?php
2 +if ( ! defined( 'ABSPATH' ) ) {
3 + exit;
4 +}
5 +
2 6 /**
3 7 * The core plugin class.
4 8 *
5 9 * @package Notifier
@@ -22,14 +26,16 @@
22 26 /**
23 27 * Define Constants.
24 28 */
25 29 private function define_constants() {
26 - $this->define( 'NOTIFIER_VERSION', '0.1.0' );
30 + $this->define( 'NOTIFIER_VERSION', '3.1.1' );
27 31 $this->define( 'NOTIFIER_NAME', 'notifier' );
28 32 $this->define( 'NOTIFIER_PREFIX', 'notifier_' );
29 33 $this->define( 'NOTIFIER_URL', trailingslashit( plugins_url( '', dirname(__FILE__) ) ) );
30 - $this->define( 'NOTIFIER_WA_API_VERSION', 'v14.0' );
31 - $this->define( 'NOTIFIER_WA_API_URL', 'https://graph.facebook.com/' . NOTIFIER_WA_API_VERSION . '/' );
34 + $this->define( 'NOTIFIER_APP_BASE_URL', 'https://app.wanotifier.com' );
35 + $this->define( 'NOTIFIER_APP_API_PATH', 'api/v1' );
36 + $this->define( 'NOTIFIER_ACTIVITY_TABLE_NAME', 'notifier_activity_log' );
37 + $this->define( 'NOTIFIER_CART_ABANDONMENT_TABLE', 'notifier_cart_abandonment' );
32 38 }
33 39
34 40 /**
35 41 * Define constant if not already set.
@@ -58,23 +64,20 @@
58 64 /**
59 65 * Include required core files used in admin and on the frontend.
60 66 */
61 67 private function includes() {
62 - // Libraries
63 - require_once NOTIFIER_PATH . 'libraries/action-scheduler/action-scheduler.php';
64 -
65 68 // Functions
66 69 require_once NOTIFIER_PATH . 'includes/functions/functions-notifier-helpers.php';
67 - require_once NOTIFIER_PATH . 'includes/functions/functions-notifier-meta-box-fields.php';
70 + require_once NOTIFIER_PATH . 'libraries/action-scheduler/action-scheduler.php';
68 71
69 72 // Classes
70 73 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-admin-notices.php';
71 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-dashboard.php';
72 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-message-templates.php';
73 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-contacts.php';
74 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-notifications.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';
77 + require_once NOTIFIER_PATH . 'includes/classes/class-notifier-notification-merge-tags.php';
75 78 require_once NOTIFIER_PATH . 'includes/classes/class-notifier-notification-triggers.php';
76 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-settings.php';
79 + require_once NOTIFIER_PATH . 'includes/classes/class-notifier-frontend.php';
77 80 }
78 81
79 82 /**
80 83 * Hook into actions and filters.
@@ -79,54 +82,89 @@
79 82 /**
80 83 * Hook into actions and filters.
81 84 */
82 85 private function init_hooks() {
83 - register_activation_hook ( NOTIFIER_FILE, array( $this, 'install') );
86 + register_activation_hook ( NOTIFIER_FILE, array( $this, 'activate') );
87 + register_deactivation_hook ( NOTIFIER_FILE, array( $this, 'deactivate') );
84 88
85 - add_action( 'plugins_loaded', array( 'Notifier_Dashboard', 'init' ) );
86 - add_action( 'plugins_loaded', array( 'Notifier_Message_Templates', 'init' ) );
87 - add_action( 'plugins_loaded', array( 'Notifier_Contacts', 'init' ) );
88 - add_action( 'plugins_loaded', array( 'Notifier_Notifications', 'init' ) );
89 - add_action( 'plugins_loaded', array( 'Notifier_Notification_Triggers', 'init' ) );
90 - add_action( 'plugins_loaded', array( 'Notifier_Settings', 'init' ) );
91 - add_action( 'plugins_loaded', array( $this, 'maybe_include_woocoomerce_class' ) );
92 -
93 - add_filter( 'init', array( $this , 'handle_webhook_requests') );
94 -
89 + 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' ) );
93 + add_action( 'after_setup_theme', array( 'Notifier_Notification_Merge_Tags', 'init' ) );
94 + add_action( 'after_setup_theme', array( 'Notifier_Notification_Triggers', 'init' ) );
95 + add_action( 'after_setup_theme', array( 'Notifier_Frontend', 'init' ) );
95 96 add_action( 'admin_enqueue_scripts', array( $this , 'admin_scripts') );
97 + add_action( 'wp_enqueue_scripts', array( $this , 'frontend_scripts') );
96 98 add_action( 'in_admin_header', array( $this , 'embed_page_header' ) );
97 99
98 - add_action( 'removable_query_args', array( $this , 'remove_admin_query_args') );
100 + add_action( 'after_setup_theme', array( $this, 'maybe_include_integrations' ) );
99 101
100 - add_action( 'admin_footer', array($this, 'add_admin_html_templates') );
102 + add_action( 'init', array( $this, 'load_textdomain' ) );
103 + add_action( 'wp_loaded', array( $this, 'setup_activity_log' ) );
104 + 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' ) );
101 107 }
102 108
103 109 /**
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 + /**
104 117 * Setup during plugin activation
105 118 */
106 - public function install() {
107 - $verify_token = get_option(NOTIFIER_PREFIX . 'verify_token');
108 - if (!$verify_token) {
109 - $bytes = random_bytes(20);
110 - $verify_token = NOTIFIER_NAME . '-' . substr(bin2hex($bytes), 0, 10);
111 - update_option(NOTIFIER_PREFIX . 'verify_token', $verify_token);
119 + public function activate() {
120 + $notifier_plugin_data = get_option('notifier_meta', array());
121 + if (isset($notifier_plugin_data['as_clear_log']) && $notifier_plugin_data['as_clear_log'] === 'yes') {
122 + unset($notifier_plugin_data['as_clear_log']);
123 + update_option('notifier_meta', $notifier_plugin_data);
112 124 }
113 125 }
114 126
115 127 /**
128 + * Setup during plugin deactivation
129 + */
130 + public function deactivate() {
131 + as_unschedule_action('notifier_check_cart_abandonment');
132 + as_unschedule_action('notifier_clean_old_logs');
133 + $notifier_plugin_data = get_option('notifier_meta', array());
134 + $notifier_plugin_data['as_clear_log'] = 'yes';
135 + update_option('notifier_meta', $notifier_plugin_data);
136 + }
137 +
138 + /**
139 + * Check if the plugin was updated and run the upgrade routine if necessary.
140 + */
141 + public function setup_activity_log() {
142 + $notifier_plugin_data = get_option('notifier_meta', array());
143 + if ( ! isset( $notifier_plugin_data['activity_log_table'] ) || $notifier_plugin_data['activity_log_table'] !== 'yes' ) {
144 + self::create_notifier_activity_log_table();
145 + }
146 +
147 + $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') {
150 + if (false === as_next_scheduled_action('notifier_clean_old_logs')) {
151 + as_schedule_recurring_action(time(), DAY_IN_SECONDS, 'notifier_clean_old_logs', $args);
152 + }
153 + }
154 + }
155 +
156 + /**
116 157 * Check if plugin's page
117 158 */
118 159 public static function is_notifier_page() {
119 160 $current_screen = get_current_screen();
120 - if ( strpos($current_screen->id, NOTIFIER_NAME) !== false) {
161 + if ( strpos( $current_screen->id, NOTIFIER_NAME ) !== false
162 + && strpos( $current_screen->id, 'order-notifications-for-woocommerce' ) === false
163 + ) {
121 164 return true;
122 165 }
123 166
124 - $plugin_ctps = array( 'wa_message_template', 'wa_contact', 'wa_notification' );
125 - if ( '' !== $current_screen->post_type && in_array( $current_screen->post_type, $plugin_ctps ) ) {
126 - return true;
127 - }
128 -
129 167 return false;
130 168 }
131 169
132 170 /**
@@ -132,97 +170,111 @@
132 170 /**
133 171 * Add admin scripts and styles
134 172 */
135 173 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 +
136 188 if (!self::is_notifier_page()) {
137 189 return;
138 190 }
139 191
140 - // Select2
141 - wp_enqueue_script(
142 - NOTIFIER_NAME . '-select2-js',
143 - NOTIFIER_URL . 'assets/js/select2.min.js',
144 - array('jquery'),
145 - NOTIFIER_VERSION,
146 - true
147 - );
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 + );
148 199
149 - // Date / time picker
150 - wp_enqueue_script( 'jquery-ui-datepicker' );
151 - wp_enqueue_script(
152 - NOTIFIER_NAME . '-timepicker-addon',
153 - NOTIFIER_URL . 'assets/js/jquery-ui-timepicker-addon.min.js',
154 - array( 'jquery-ui-datepicker' ),
155 - NOTIFIER_VERSION,
156 - true
157 - );
200 + wp_enqueue_style(
201 + NOTIFIER_NAME . '-admin-css',
202 + NOTIFIER_URL . 'assets/css/admin.css',
203 + null,
204 + NOTIFIER_VERSION
205 + );
206 + }
158 207
159 - // Admin JS file
160 - wp_enqueue_script(
161 - NOTIFIER_NAME . '-admin-js',
162 - NOTIFIER_URL . 'assets/js/admin.js',
163 - array('jquery'),
164 - NOTIFIER_VERSION,
165 - true
166 - );
167 - wp_localize_script(
168 - NOTIFIER_NAME . '-admin-js',
169 - 'waNotifier',
170 - apply_filters( 'notifier_js_variables', array('ajaxurl' => admin_url( 'admin-ajax.php' ) ) )
171 - );
208 + /**
209 + * Add frontend scripts and styles
210 + */
211 + public function frontend_scripts () {
212 + if('yes' === get_option('notifier_ctc_enable')){
213 + // Styles
214 + wp_enqueue_style(
215 + NOTIFIER_NAME . '-frontend-css',
216 + NOTIFIER_URL . 'assets/css/frontend.css',
217 + null,
218 + NOTIFIER_VERSION
219 + );
220 + }
172 221
173 - // Media upload library
174 - wp_enqueue_media();
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 + );
175 230
176 - // Styles
177 - wp_enqueue_style(
178 - NOTIFIER_NAME . '-admin-css',
179 - NOTIFIER_URL . 'assets/css/admin.css',
180 - null,
181 - NOTIFIER_VERSION
182 - );
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 + }
183 240 }
184 241
185 242 /**
186 243 * Set up a div for the header embed to render into.
187 - * The initial contents here are meant as a place loader for when the PHP page initialy loads.
244 + * Only renders for legacy (non-SPA) pages like the trigger CPT editor.
245 + * SPA pages render the header via the React app.
188 246 */
189 247 public static function embed_page_header() {
190 248 if (!self::is_notifier_page()) {
191 249 return;
192 250 }
193 - $current_screen = get_current_screen();
194 - $cpt = ( '' !== $current_screen->post_type) ? $current_screen->post_type : '';
195 - $tax = ( '' !== $current_screen->taxonomy) ? $current_screen->taxonomy : '';
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 : '';
196 266 ?>
197 267 <div id="notifier-admin-header" data-post-type="<?php echo esc_attr($cpt); ?>">
198 268 <div class="notifier-admin-header-content">
199 - <div class="header-page-title w-30">
200 - <h2><?php echo esc_attr(get_admin_page_title()); ?></h2>
269 + <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>
201 272 </div>
202 - <div class="header-menu-items w-40 d-flex justify-content-center">
203 - <?php
204 - if ( 'wa_contact' == $cpt ) {
205 - ?>
206 - <ul>
207 - <li>
208 - <a class="<?php echo ('wa_contact_list' !== $tax && 'wa_contact_tag' !== $tax) ? 'active' : ''; ?>" href="<?php echo esc_url( admin_url('edit.php?post_type=wa_contact') ); ?>" class="">Contacts</a>
209 - </li>
210 - <li>
211 - <a class="<?php echo ('wa_contact_list' == $tax) ? 'active' : ''; ?>" href="<?php echo esc_url( admin_url('edit-tags.php?taxonomy=wa_contact_list&post_type=wa_contact') ); ?>">Lists</a>
212 - </li>
213 - <li>
214 - <a class="<?php echo ('wa_contact_tag' == $tax) ? 'active' : ''; ?>" href="<?php echo esc_url( admin_url('edit-tags.php?taxonomy=wa_contact_tag&post_type=wa_contact') ); ?>">Tags</a>
215 - </li>
216 - </ul>
217 - <?php
218 - }
219 - ?>
220 - </div>
221 273 <div class="header-action-links w-30 d-flex justify-content-end">
222 - <span class="header-version">Version: <?php echo esc_html(NOTIFIER_VERSION); ?> (beta)</span>
223 - <a href="mailto:ram@fantastech.co?subject=%5BWA%20Notifier%5D%20Help%20Needed%20on<?php echo esc_url(get_site_url()); ?>">Help</a>
224 - <a href="admin.php?page=notifier&show=disclaimer">Disclaimer</a>
274 + <span class="review-us-link">Review us: <a href="https://wordpress.org/support/plugin/notifier/reviews/#new-post" target="_blank">⭐⭐⭐⭐⭐</a></span>
275 + <span class="header-version">Version: <?php echo esc_html(NOTIFIER_VERSION); ?></span>
276 + <a href="https://wanotifier.com/support/" target="_blank">Help</a>
225 277 </div>
226 278 </div>
227 279 </div>
228 280 <?php
@@ -228,177 +280,242 @@
228 280 <?php
229 281 }
230 282
231 283 /**
232 - * Handle response from Whatsapp
284 + * For sending API requests
233 285 */
234 - public static function handle_webhook_requests () {
235 - if ( ! isset($_GET['notifier']) ) {
236 - return;
286 + public static function send_api_request ( $endpoint, $args, $method = 'POST', $headers = array() ) {
287 + $api_key = get_option('notifier_api_key');
288 + $api_key = trim($api_key);
289 + if('' == $api_key) {
290 + return false;
237 291 }
238 292
239 - if ( ! isset($_POST) ) {
240 - return;
293 + if(empty($headers)){
294 + $headers = array(
295 + 'Content-Type' => 'application/json; charset=utf-8'
296 + );
241 297 }
242 298
243 - $hub_mode = isset($_GET['hub_mode']) ? sanitize_text_field( wp_unslash( $_GET['hub_mode'] ) ) : '';
244 - $hub_verify_token = isset($_GET['hub_verify_token']) ? sanitize_text_field( wp_unslash( $_GET['hub_verify_token'] ) ) : '';
245 - $hub_challenge = isset($_GET['hub_challenge']) ? sanitize_text_field( wp_unslash( $_GET['hub_challenge'] ) ) : '';
299 + $request_url = NOTIFIER_APP_BASE_URL . '/' . NOTIFIER_APP_API_PATH . '/' . $endpoint . '?key=' . esc_attr($api_key);
300 + $request_args = array(
301 + 'method' => $method,
302 + 'headers' => $headers,
303 + 'timeout' => 120,
304 + 'body' => json_encode($args),
305 + 'sslverify' => true
306 + );
246 307
247 - /* Validate WhastApp API webbook */
248 - if ( 'subscribe' === $hub_mode ) {
249 - $verify_token = get_option(NOTIFIER_PREFIX . 'verify_token');
250 - if ($hub_verify_token == $verify_token) {
251 - echo esc_html($hub_challenge);
252 - }
253 - }
308 + $response = wp_remote_request( $request_url, $request_args );
254 309
255 - exit;
256 - }
310 + $response_body = wp_remote_retrieve_body( $response );
257 311
258 - /**
259 - * For sending requests to Cloud API
260 - */
261 - public static function wa_cloud_api_request ( $endpoint, $args = array(), $method = 'POST', $headers = array() ) {
262 - $phone_number_id = get_option('notifier_phone_number_id');
263 - $request_url = NOTIFIER_WA_API_URL . $phone_number_id . '/' . untrailingslashit($endpoint);
264 - return self::send_api_request($request_url, $args, $method, $headers);
312 + if ( is_wp_error( $response ) ) {
313 + error_log( $response->get_error_message() );
314 + return false;
315 + } else {
316 + $response_body = wp_remote_retrieve_body( $response );
317 + return json_decode($response_body);
318 + }
265 319 }
266 320
267 321 /**
268 - * For sending requests to WA Business API
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
269 327 */
270 - public static function wa_business_api_request ( $endpoint, $args = array(), $method = 'POST', $headers = array() ) {
271 - $business_account_id = get_option('notifier_business_account_id');
272 - $request_url = NOTIFIER_WA_API_URL . $business_account_id . '/' . untrailingslashit($endpoint);
273 - return self::send_api_request($request_url, $args, $method, $headers);
274 - }
328 + public static function is_woo_handled_by_standalone_plugin() {
329 + static $result = null;
330 + if ( null !== $result ) {
331 + return $result;
332 + }
275 333
276 - /**
277 - * For sending graph api requests
278 - */
279 - public static function wa_graph_api_request ( $endpoint, $args = array(), $method = 'POST', $headers = array() ) {
280 - $request_url = NOTIFIER_WA_API_URL . untrailingslashit($endpoint);
281 - return self::send_api_request($request_url, $args, $method, $headers);
282 - }
334 + if ( ! function_exists( 'is_plugin_active' ) ) {
335 + require_once ABSPATH . 'wp-admin/includes/plugin.php';
336 + }
283 337
284 - /**
285 - * For sending API requests
286 - */
287 - private static function send_api_request ( $request_url, $args, $method, $headers ) {
288 - $permanent_access_token = get_option('notifier_permanent_access_token');
289 - $headers = wp_parse_args($headers, array(
290 - 'Authorization' => 'Bearer ' . $permanent_access_token
291 - ));
292 - $request_args = array(
293 - 'method' => $method,
294 - 'headers' => $headers,
295 - 'body' => $args
296 - );
297 - $response = wp_remote_request( $request_url, $request_args);
298 - if ( is_wp_error( $response ) ) {
299 - error_log( $response->get_error_message() );
338 + if ( ! is_plugin_active( 'order-notifications-for-woocommerce/order-notifications-for-woocommerce.php' ) ) {
339 + $result = false;
300 340 return false;
301 - } elseif (isset($response->error)) {
302 - error_log($response->error_user_title . ' - ' . $response->eerror_user_msg);
303 - return json_decode($response_body);
304 - } else {
305 - $response_body = wp_remote_retrieve_body( $response );
306 - return json_decode($response_body);
307 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;
308 355 }
309 356
310 357 /**
311 - * For uploading profile pic to app
358 + * Load Woocommerce class if it's present is activated
312 359 */
313 - public static function wa_cloud_api_upload_profile_pic($attachment_id) {
314 - $file_path = get_attached_file($attachment_id);
315 - $file_size = filesize($file_path);
360 + public static function maybe_include_integrations () {
361 + $woo_handled = self::is_woo_handled_by_standalone_plugin();
316 362
317 - if (!$file_path) {
318 - return;
363 + // Woocommerce — skip when the standalone plugin handles it
364 + if ( ! $woo_handled && class_exists( 'WooCommerce' ) ) {
365 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-woocommerce.php';
366 + Notifier_Woocommerce::init();
319 367 }
368 + if ( ! $woo_handled && ! class_exists( 'WC_Session' ) && class_exists( 'WooCommerce' ) ) {
369 + include_once( WP_PLUGIN_DIR . '/woocommerce/includes/abstracts/abstract-wc-session.php' );
370 + }
320 371
321 - $file_args = array (
322 - 'file_length' => $file_size,
323 - 'file_type' => get_post_mime_type($attachment_id)
324 - );
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', '>=')) {
374 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-wcar.php';
375 + Notifier_WCAR::init();
376 + }
325 377
326 - // $phone_number_id = get_option('notifier_phone_number_id');
327 - // $request_url = NOTIFIER_WA_API_URL . $phone_number_id . '/media';
328 - $permanent_access_token = get_option('notifier_permanent_access_token');
378 + // Gravity Forms
379 + if ( class_exists( 'GFCommon' ) ) {
380 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-gravityforms.php';
381 + Notifier_GravityForms::init();
382 + }
329 383
330 - // Create session ID for upload
331 - $upload_session = self::wa_graph_api_request('app/uploads', $file_args);
332 - if (!isset($upload_session->id)) {
333 - error_log('Error creating WhatsApp image upload session: ' . $upload_session);
334 - return false;
384 + // Contact Form 7
385 + if ( class_exists( 'WPCF7' ) ) {
386 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-cf7.php';
387 + Notifier_ContactForm7::init();
335 388 }
336 389
337 - // Upload the file
338 - $file = @fopen( $file_path, 'r' );
339 - $file_data = fread( $file, $file_size );
390 + // WPForms
391 + if ( class_exists( 'WPForms' ) ) {
392 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-wpforms.php';
393 + Notifier_WPForms::init();
394 + }
340 395
341 - $upload_headers = array(
342 - 'Authorization' => 'OAuth ' . $permanent_access_token,
343 - 'file_offset' => 0,
344 - 'Connection' => 'Close',
345 - 'Host' => 'graph.facebook.com',
346 - 'Content-Type' => 'multipart/form-data'
347 - );
396 + // Ninja Forms
397 + if ( class_exists( 'Ninja_Forms' ) ) {
398 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-ninjaforms.php';
399 + Notifier_NinjaForms::init();
400 + }
348 401
349 - $upload_handle = self::wa_graph_api_request( $upload_session->id, $file_data, null, $upload_headers );
402 + //FrmForm
403 + if ( class_exists( 'FrmForm' ) ) {
404 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-formidable.php';
405 + Notifier_Formidable::init();
406 + }
350 407
351 - if (!isset($upload_handle->h)) {
352 - error_log('Error while uploading profile image: ' . $upload_handle);
353 - return false;
408 + //WPFluentForm
409 + if ( function_exists( 'fluentFormApi' ) ) {
410 + require_once NOTIFIER_PATH . 'includes/classes/integrations/class-notifier-fluentforms.php';
411 + Notifier_FluentForms::init();
354 412 }
355 413
356 - return $upload_handle->h;
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 + }
357 431 }
358 432
359 433 /**
360 - * Remove query args from WP backend
434 + * Is connection to WANotifier.com active?
361 435 */
362 - public static function remove_admin_query_args ($args) {
363 - $remove_args = array('wa_import_count', 'wa_import_skipped', 'wa_contacts_import', 'import_contacts_from_users', 'refresh_status');
364 - return array_merge($args, $remove_args);
436 + public static function is_api_active () {
437 + $activated = get_option(NOTIFIER_PREFIX . 'api_activated');
438 + if('yes' == $activated) {
439 + return true;
440 + }
441 + else{
442 + return false;
443 + }
365 444 }
366 445
367 446 /**
368 - * Load Woocommerce class if it's present is activated
369 - */
370 - public static function maybe_include_woocoomerce_class () {
371 - if ( class_exists( 'WooCommerce' ) ) {
372 - require_once NOTIFIER_PATH . 'includes/classes/class-notifier-woocommerce.php';
373 - Notifier_Woocommerce::init();
374 - }
447 + * Create New db table-- wanotifier_activity_log
448 + */
449 + public static function create_notifier_activity_log_table() {
450 + global $wpdb;
451 + $table_name = $wpdb->prefix . NOTIFIER_ACTIVITY_TABLE_NAME;
452 +
453 + $charset_collate = $wpdb->get_charset_collate();
454 +
455 + // Include IF NOT EXISTS clause in the CREATE TABLE query
456 + $sql = "CREATE TABLE IF NOT EXISTS $table_name (
457 + log_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
458 + timestamp timestamp NOT NULL,
459 + message text NOT NULL,
460 + type varchar(16) NOT NULL,
461 + PRIMARY KEY (log_id),
462 + INDEX idx_timestamp (timestamp)
463 + ) $charset_collate;";
464 +
465 + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
466 + dbDelta( $sql );
467 +
468 + $notifier_plugin_data = get_option('notifier_meta', array());
469 + $notifier_plugin_data['activity_log_table'] = 'yes';
470 + update_option('notifier_meta', $notifier_plugin_data);
375 471 }
376 472
377 473 /**
378 - * Add admin html templates to footer
379 - */
380 - public static function add_admin_html_templates () {
381 - if (!self::is_notifier_page()) {
474 + * Delete old log from activity table according to interval
475 + */
476 + public function notifier_delete_old_activity_logs() {
477 + global $wpdb;
478 + $table_name = $wpdb->prefix . NOTIFIER_ACTIVITY_TABLE_NAME;
479 + $retention_time = apply_filters( 'notifier_logs_retention_time', 7 );
480 + $retention_time = intval($retention_time);
481 + $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() ) {
382 489 return;
383 490 }
384 491
385 - $templates = apply_filters('notifier_admin_html_templates', array());
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;";
386 513
387 - if (count($templates) == 0) {
388 - return;
389 - }
514 + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
515 + dbDelta( $sql );
390 516
391 - echo '<div class="notifier-templates">';
392 - foreach ($templates as $template) {
393 - $file_path = NOTIFIER_PATH . '/views/templates/admin-' . $template . '.php';
394 - if ( ! file_exists($file_path) ) {
395 - continue;
396 - }
397 - echo '<template id="notifier-template-' . esc_attr($template) . '">';
398 - require_once $file_path;
399 - echo '</template>';
517 + $notifier_plugin_data['cart_abandonment_table'] = 'yes';
518 + update_option('notifier_meta', $notifier_plugin_data);
400 519 }
401 - echo '</div>';
402 520 }
403 -
404 521 }