PluginProbe ʕ •ᴥ•ʔ
Brevo – Email, SMS, Web Push, Chat, and more. / 3.0.1
Brevo – Email, SMS, Web Push, Chat, and more. v3.0.1
2.9.13 2.9.14 2.9.15 2.9.16 2.9.17 2.9.18 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.9 3.1.0 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.2 3.1.20 3.1.21 3.1.22 3.1.23 3.1.24 3.1.25 3.1.26 3.1.27 3.1.28 3.1.29 3.1.3 3.1.30 3.1.31 3.1.32 3.1.33 3.1.34 3.1.35 3.1.36 3.1.37 3.1.38 3.1.39 3.1.4 3.1.40 3.1.41 3.1.42 3.1.43 3.1.44 3.1.45 3.1.46 3.1.47 3.1.48 3.1.49 3.1.5 3.1.50 3.1.51 3.1.52 3.1.53 3.1.54 3.1.55 3.1.56 3.1.57 3.1.58 3.1.59 3.1.6 3.1.60 3.1.61 3.1.62 3.1.63 3.1.64 3.1.65 3.1.66 3.1.67 3.1.68 3.1.69 3.1.7 3.1.70 3.1.71 3.1.72 3.1.73 3.1.74 3.1.75 3.1.76 3.1.77 3.1.78 3.1.79 3.1.8 3.1.80 3.1.81 3.1.82 3.1.83 3.1.84 3.1.85 3.1.86 3.1.87 3.1.88 3.1.89 3.1.9 3.1.90 3.1.91 3.1.92 3.1.93 3.1.94 3.1.95 3.1.96 3.1.97 3.1.98 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.3.0 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 trunk 1.0 1.5 2.0.8 2.9.10 2.9.11 2.9.12
mailin / sendinblue.php
mailin Last commit date
css 5 years ago img 5 years ago inc 5 years ago js 5 years ago lang 5 years ago model 5 years ago page 5 years ago widget 5 years ago index.php 5 years ago readme.txt 5 years ago screenshot-1.png 5 years ago screenshot-2.png 5 years ago screenshot-3.png 5 years ago screenshot-4.png 5 years ago screenshot-5.png 5 years ago screenshot-6.png 5 years ago screenshot-7.png 5 years ago screenshot-8.png 5 years ago screenshot-9.png 5 years ago sendinblue.php 5 years ago
sendinblue.php
1271 lines
1 <?php
2 /**
3 * Plugin Name: Sendinblue Subscribe Form And WP SMTP
4 * Plugin URI: https://www.sendinblue.com/?r=wporg
5 * Description: Easily send emails from your WordPress blog using Sendinblue SMTP and easily add a subscribe form to your site
6 * Version: 3.0.1
7 * Author: Sendinblue
8 * Author URI: https://www.sendinblue.com/?r=wporg
9 * License: GPLv2 or later
10 *
11 * @package SIB
12 */
13
14 /*
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License
17 as published by the Free Software Foundation; either version 2
18 of the License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 */
27
28 /**
29 * Application entry point. Contains plugin startup class that loads on <i> sendinblue_init </i> action.
30 */
31 if ( ! class_exists( 'Mailin' ) ) {
32 require_once( 'inc/mailin.php' );
33 }
34 if ( ! class_exists( 'SendinblueApiClient' ) ) {
35 require_once( 'inc/SendinblueApiClient.php' );
36 }
37 // For marketing automation.
38 if ( ! class_exists( 'Sendinblue' ) ) {
39 require_once( 'inc/sendinblue.php' );
40 }
41
42 if ( ! class_exists( 'SIB_Manager' ) ) {
43 register_deactivation_hook( __FILE__, array( 'SIB_Manager', 'deactivate' ) );
44 register_activation_hook( __FILE__, array( 'SIB_Manager', 'install' ) );
45 register_uninstall_hook( __FILE__, array( 'SIB_Manager', 'uninstall' ) );
46
47 require_once( 'page/page-home.php' );
48 require_once( 'page/page-form.php' );
49 require_once( 'page/page-statistics.php' );
50 require_once( 'page/page-scenarios.php' );
51 require_once( 'widget/widget_form.php' );
52 require_once( 'inc/table-forms.php' );
53 require_once( 'inc/sib-api-manager.php' );
54 require_once( 'inc/sib-sms-code.php' );
55 require_once( 'model/model-forms.php' );
56 require_once( 'model/model-users.php' );
57 require_once( 'model/model-lang.php' );
58
59 /**
60 * Class SIB_Manager
61 */
62 class SIB_Manager {
63
64 /** Main setting option name */
65 const MAIN_OPTION_NAME = 'sib_main_option';
66
67 /** Home setting option name */
68 const HOME_OPTION_NAME = 'sib_home_option';
69
70 /** Access token option name */
71 const ACCESS_TOKEN_OPTION_NAME = 'sib_token_store';
72
73 /** Plugin language notice option name */
74 const LANGUAGE_OPTION_NAME = 'sib_language_notice_option';
75
76 /** Temp list of Dopt option name */
77 const TEMPLIST_OPTION_NAME = 'sib_temp_list';
78
79 /** Form preview option name */
80 const PREVIEW_OPTION_NAME = 'sib_preview_form';
81
82 const API_KEY_V3_OPTION_NAME = 'sib_api_key_v3';
83
84 /** Request url of sendinblue api */
85 const SENDINBLUE_API_URL = 'https://api.sendinblue.com/v2.0';
86 const RECAPTCHA_API_TEMPLATE = 'https://www.google.com/recaptcha/api/siteverify?%s';
87
88 /**
89 * API key
90 *
91 * @var $access_key
92 */
93 public static $access_key;
94
95 /**
96 * Store instance
97 *
98 * @var $instance
99 */
100 public static $instance;
101
102 /**
103 * Plugin directory path value. set in constructor
104 *
105 * @var $plugin_dir
106 */
107 public static $plugin_dir;
108
109 /**
110 * Plugin url. set in constructor
111 *
112 * @var $plugin_url
113 */
114 public static $plugin_url;
115
116 /**
117 * Plugin name. set in constructor
118 *
119 * @var $plugin_name
120 */
121 public static $plugin_name;
122
123 /**
124 * Check if wp_mail is declared
125 *
126 * @var $wp_mail_conflict
127 */
128 static $wp_mail_conflict;
129
130 /**
131 * Class constructor
132 * Sets plugin url and directory and adds hooks to <i>init</i>. <i>admin_menu</i>
133 */
134 function __construct() {
135 // get basic info.
136 self::$plugin_dir = plugin_dir_path( __FILE__ );
137 self::$plugin_url = plugins_url( '', __FILE__ );
138 self::$plugin_name = plugin_basename( __FILE__ );
139
140 self::$wp_mail_conflict = false;
141
142 // api key for sendinblue.
143 $general_settings = get_option( self::MAIN_OPTION_NAME, array() );
144 self::$access_key = isset( $general_settings['access_key'] ) ? $general_settings['access_key'] : '';
145
146 self::$instance = $this;
147
148 add_action( 'admin_init', array( &$this, 'admin_init' ), 9999 );
149 add_action( 'admin_menu', array( &$this, 'admin_menu' ), 9999 );
150
151 add_action( 'wp_print_scripts', array( &$this, 'frontend_register_scripts' ), 9999 );
152 add_action( 'wp_enqueue_scripts', array( &$this, 'wp_head_ac' ), 999 );
153
154 // create custom url for form preview.
155 add_filter( 'query_vars', array( &$this, 'sib_query_vars' ) );
156 add_action( 'parse_request', array( &$this, 'sib_parse_request' ) );
157
158 add_action( 'wp_ajax_sib_validate_process', array( 'SIB_Page_Home', 'ajax_validation_process' ) );
159 add_action( 'wp_ajax_sib_validate_ma', array( 'SIB_Page_Home', 'ajax_validate_ma' ) );
160 add_action( 'wp_ajax_sib_activate_email_change', array( 'SIB_Page_Home', 'ajax_activate_email_change' ) );
161 add_action( 'wp_ajax_sib_sender_change', array( 'SIB_Page_Home', 'ajax_sender_change' ) );
162 add_action( 'wp_ajax_sib_send_email', array( 'SIB_Page_Home', 'ajax_send_email' ) );
163 add_action( 'wp_ajax_sib_remove_cache', array( 'SIB_Page_Home', 'ajax_remove_cache' ) );
164 add_action( 'wp_ajax_sib_sync_users', array( 'SIB_Page_Home', 'ajax_sync_users' ) );
165
166 add_action( 'wp_ajax_sib_change_template', array( 'SIB_Page_Form', 'ajax_change_template' ) );
167 add_action( 'wp_ajax_sib_get_lists', array( 'SIB_Page_Form', 'ajax_get_lists' ) );
168 add_action( 'wp_ajax_sib_get_templates', array( 'SIB_Page_Form', 'ajax_get_templates' ) );
169 add_action( 'wp_ajax_sib_get_attributes', array( 'SIB_Page_Form', 'ajax_get_attributes' ) );
170 add_action( 'wp_ajax_sib_update_form_html', array( 'SIB_Page_Form', 'ajax_update_html' ) );
171 add_action( 'wp_ajax_sib_copy_origin_form', array( 'SIB_Page_Form', 'ajax_copy_origin_form' ) );
172
173 add_action( 'wp_ajax_sib_get_country_prefix', array( $this, 'ajax_get_country_prefix' ) );
174 add_action( 'wp_ajax_nopriv_sib_get_country_prefix', array( $this, 'ajax_get_country_prefix' ) );
175
176 add_action( 'init', array( &$this, 'init' ) );
177
178 add_action( 'wp_login', array( &$this, 'sib_wp_login_identify' ), 10, 2 );
179
180 // change sib tables name on prior(2.6.9) versions.
181 SIB_Model_Users::add_prefix();
182 SIB_Forms::add_prefix();
183 SIB_Forms::modify_datatype();
184
185 if ( self::is_done_validation() === true ) {
186 add_shortcode( 'sibwp_form', array( &$this, 'sibwp_form_shortcode' ) );
187 // register widget.
188 add_action( 'widgets_init', array( &$this, 'sib_create_widget' ) );
189
190 // create forms tables and create default form.
191 SIB_Forms::createTable();
192 // create users table.
193 SIB_Model_Users::createTable();
194 // add columns for old versions
195 SIB_Forms::alterTable();
196 }
197
198 $use_api_version = get_option( 'sib_use_apiv2', '0' );
199 if ( '0' === $use_api_version ) {
200 self::uninstall();
201 update_option( 'sib_use_apiv2', '1' );
202 }
203
204 // Wpml plugin part.
205 if ( ! function_exists( 'is_plugin_active_for_network' ) ) :
206 require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
207 endif;
208 if ( in_array( 'sitepress-multilingual-cms/sitepress.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) || is_plugin_active_for_network( 'sitepress-multilingual-cms/sitepress.php' ) ) {
209 SIB_Forms_Lang::createTable();
210 add_action( 'sib_language_sidebar', array( $this, 'sib_create_language_sidebar' ) );
211 }
212
213 /**
214 * Hook wp_mail to send transactional emails
215 */
216
217 // check if wp_mail function is already declared by others.
218 if ( function_exists( 'wp_mail' ) ) {
219 self::$wp_mail_conflict = true;
220 }
221 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME, array() );
222
223 if( 'yes' === $home_settings['activate_email'] )
224 {
225 if ( false === self::$wp_mail_conflict ) {
226 /**
227 * Declare wp_mail function for Sendinblue SMTP module
228 *
229 * @param string $to - receiption email.
230 * @param string $subject - subject of email.
231 * @param string $message - message content.
232 * @param string $headers - header of email.
233 * @param array $attachments - attachments.
234 * @return bool
235 */
236 function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
237 $message = str_replace( 'NF_SIB', '', $message );
238 $message = str_replace( 'WC_SIB', '', $message );
239 try {
240 $sent = SIB_Manager::sib_email( $to, $subject, $message, $headers, $attachments );
241 if ( is_wp_error( $sent ) || ! isset( $sent['code'] ) || 'success' !== $sent['code'] ) {
242 return SIB_Manager::wp_mail_native( $to, $subject, $message, $headers, $attachments );
243 }
244 return true;
245 } catch ( Exception $e ) {
246 return SIB_Manager::wp_mail_native( $to, $subject, $message, $headers, $attachments );
247 }
248 }
249 } else {
250 add_action( 'admin_notices', array( &$this, 'wpMailNotices' ) );
251 return;
252 }
253 }
254 }
255
256 /**
257 * Add identify tag for login users
258 *
259 * @param string $user_login - user login name.
260 * @param array $user - user.
261 */
262 function sib_wp_login_identify( $user_login, $user ) {
263
264 $userEmail = $user->user_email;
265 $data = array(
266 'email_id' => $userEmail,
267 'name' => $user_login,
268 );
269 SIB_API_Manager::identify_user( $data );
270 }
271
272 /**
273 * Initialize method. called on <i>init</i> action
274 */
275 function init() {
276 // Sign up process.
277 if ( isset( $_POST['sib_form_action'] ) && ( 'subscribe_form_submit' == sanitize_text_field($_POST['sib_form_action']) ) ) {
278 $this->signup_process();
279 }
280 // Subscribe.
281 if ( isset( $_GET['sib_action'] ) && ( 'subscribe' == sanitize_text_field($_GET['sib_action']) ) ) {
282 SIB_API_Manager::subscribe();
283 exit;
284 }
285 // Dismiss language notice.
286 if ( isset( $_GET['dismiss_admin_lang_notice'] ) && '1' == sanitize_text_field($_GET['dismiss_admin_lang_notice']) ) {
287 update_option( SIB_Manager::LANGUAGE_OPTION_NAME, true );
288 wp_safe_redirect( $_SERVER['HTTP_REFERER'] );
289 exit();
290 }
291
292 $api_key_v3 = get_option(SIB_Manager::API_KEY_V3_OPTION_NAME);
293 if (empty($api_key_v3)) {
294 $general_settings = get_option( self::MAIN_OPTION_NAME, array() );
295 if (isset($general_settings['access_key'])) {
296 $client = new Mailin(SIB_Manager::SENDINBLUE_API_URL, $general_settings['access_key']);
297 $response = $client->generateApiV3Key();
298 if (!empty($response['data']['value'])) {
299 update_option(SIB_Manager::API_KEY_V3_OPTION_NAME, $response['data']['value']);
300 }
301 }
302 }
303
304 add_action( 'wp_head', array( &$this, 'install_ma_script' ) );
305 }
306
307 /**
308 * Hook admin_init
309 */
310 function admin_init() {
311 add_action( 'admin_action_sib_setting_subscription', array( 'SIB_Page_Form', 'save_setting_subscription' ) );
312 add_action( 'admin_action_nopriv_sib_setting_subscription', array( 'SIB_Page_Form', 'save_setting_subscription' ) );
313 SIB_Manager::LoadTextDomain();
314 $this->register_scripts();
315 $this->register_styles();
316 }
317
318 /**
319 * Hook admin_menu
320 */
321 function admin_menu() {
322 SIB_Manager::LoadTextDomain();
323 new SIB_Page_Home();
324 new SIB_Page_Form();
325 new SIB_Page_Statistics();
326 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME );
327 if ( isset( $home_settings['activate_ma'] ) && 'yes' == $home_settings['activate_ma'] ) {
328 new SIB_Page_Scenarios();
329 }
330
331 }
332
333 /**
334 * Register script for admin page
335 */
336 function register_scripts() {
337 wp_register_script( 'sib-bootstrap-js', self::$plugin_url . '/js/bootstrap/js/bootstrap.min.js', array( 'jquery' ), null );
338 wp_register_script( 'sib-admin-js', self::$plugin_url . '/js/admin.js', array( 'jquery' ), filemtime( self::$plugin_dir . '/js/admin.js' ) );
339 wp_register_script( 'sib-chosen-js', self::$plugin_url . '/js/chosen.jquery.min.js', array( 'jquery' ), null );
340 wp_enqueue_script('jquery-ui-datepicker');
341 wp_enqueue_script('jquery-ui-spinner');
342 }
343
344 /**
345 * Register stylesheet for admin page
346 */
347 function register_styles() {
348 wp_register_style( 'sib-bootstrap-css', self::$plugin_url . '/js/bootstrap/css/bootstrap.css', array(), null, 'all' );
349 wp_register_style( 'sib-fontawesome-css', self::$plugin_url . '/css/fontawesome/css/font-awesome.css', array(), null, 'all' );
350 wp_register_style( 'sib-chosen-css', self::$plugin_url . '/css/chosen.min.css' );
351 wp_register_style( 'sib-admin-css', self::$plugin_url . '/css/admin.css', array(), filemtime( self::$plugin_dir . '/css/admin.css' ), 'all' );
352 wp_enqueue_style( 'sib-jquery-ui-datepicker', self::$plugin_url . '/css/datepicker.css', false, false, false );
353 }
354
355 /**
356 * Registers scripts for frontend
357 */
358 function frontend_register_scripts() {
359
360 }
361
362 /**
363 * Enqueue script on front page
364 */
365 function wp_head_ac() {
366 wp_enqueue_script( 'sib-front-js', self::$plugin_url . '/js/mailin-front.js', array( 'jquery' ), filemtime( self::$plugin_dir . '/js/mailin-front.js' ), false );
367 wp_enqueue_style( 'sib-front-css', self::$plugin_url.'/css/mailin-front.css', array(), array(), 'all');
368 wp_localize_script(
369 'sib-front-js', 'sibErrMsg', array(
370 'invalidMail' => __( 'Please fill out valid email address', 'sib_lang' ),
371 'requiredField' => __( 'Please fill out required fields', 'sib_lang' ),
372 'invalidDateFormat' => __( 'Please fill out valid date format', 'sib_lang' ),
373 'invalidSMSFormat' => __( 'Please fill out valid phone number', 'sib_lang' ),
374 )
375 );
376 wp_localize_script(
377 'sib-front-js', 'ajax_sib_front_object',
378 array(
379 'ajax_url' => admin_url( 'admin-ajax.php' ),
380 'ajax_nonce' => wp_create_nonce( 'sib_front_ajax_nonce' ),
381 'flag_url' => plugins_url('img/flags/', __FILE__ ),
382 )
383 );
384 }
385
386 /**
387 * Install method is called once install this plugin.
388 * create tables, default option ...
389 */
390 static function install() {
391 $general_settings = get_option( self::MAIN_OPTION_NAME, array() );
392 $access_key = isset( $general_settings['access_key'] ) ? $general_settings['access_key'] : '';
393 if ( '' === $access_key ) {
394 // Default option when activate.
395 $home_settings = array(
396 'activate_email' => 'no',
397 'activate_ma' => 'no',
398 );
399 update_option( self::HOME_OPTION_NAME, $home_settings );
400 }
401 }
402
403 /**
404 * Uninstall method is called once uninstall this plugin
405 * delete tables, options that used in plugin
406 */
407 static function uninstall() {
408 $setting = array();
409 update_option( SIB_Manager::MAIN_OPTION_NAME, $setting );
410
411 $home_settings = array(
412 'activate_email' => 'no',
413 'activate_ma' => 'no',
414 );
415 update_option( SIB_Manager::HOME_OPTION_NAME, $home_settings );
416
417 // Delete access_token.
418 $token_settings = array();
419 update_option( SIB_Manager::ACCESS_TOKEN_OPTION_NAME, $token_settings );
420 delete_option(SIB_Manager::API_KEY_V3_OPTION_NAME);
421 // Empty tables.
422 SIB_Model_Users::removeTable();
423 SIB_Forms::removeTable();
424 SIB_Forms_Lang::removeTable();
425
426 // Remove all transient.
427 SIB_API_Manager::remove_transients();
428 }
429
430 /**
431 * Deactivate method is called once deactivate this plugin
432 */
433 static function deactivate() {
434 update_option( SIB_Manager::LANGUAGE_OPTION_NAME, false );
435 // Remove sync users option.
436 delete_option( 'sib_sync_users' );
437 // Remove all transient.
438 SIB_API_Manager::remove_transients();
439 }
440
441 /**
442 * Check that have done validation process already.
443 */
444 static function is_done_validation() {
445 if (get_option(SIB_Manager::API_KEY_V3_OPTION_NAME)) {
446 $apiClient = new SendinblueApiClient();
447 $apiClient->getAccount();
448 if ( $apiClient->getLastResponseCode() === SendinblueApiClient::RESPONSE_CODE_OK ) {
449 return true;
450 }
451 }
452
453 return false;
454 }
455
456 /**
457 * Install marketing automation script in header
458 */
459 function install_ma_script() {
460 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME, array() );
461 if ( isset( $home_settings['activate_ma'] ) && 'yes' == $home_settings['activate_ma'] ) {
462 $general_settings = get_option( SIB_Manager::MAIN_OPTION_NAME, array() );
463 $ma_email = '';
464 $current_user = wp_get_current_user();
465 if ( $current_user instanceof WP_User ) {
466 $ma_email = $current_user->user_email;
467 }
468 $ma_key = $general_settings['ma_key'];
469 $output = '<script type="text/javascript">
470 (function() {window.sib ={equeue:[],client_key:"'. $ma_key .'"};/* OPTIONAL: email for identify request*/
471 window.sib.email_id = "'. $ma_email .'";
472 window.sendinblue = {}; for (var j = [\'track\', \'identify\', \'trackLink\', \'page\'], i = 0; i < j.length; i++) { (function(k) { window.sendinblue[k] = function() { var arg = Array.prototype.slice.call(arguments); (window.sib[k] || function() { var t = {}; t[k] = arg; window.sib.equeue.push(t);})(arg[0], arg[1], arg[2]);};})(j[i]);}var n = document.createElement("script"),i = document.getElementsByTagName("script")[0]; n.type = "text/javascript", n.id = "sendinblue-js", n.async = !0, n.src = "https://sibautomation.com/sa.js?key=" + window.sib.client_key, i.parentNode.insertBefore(n, i), window.sendinblue.page();})();
473 </script>';
474 echo $output;
475 }
476 }
477
478 /**
479 * Register widget
480 */
481 function sib_create_widget() {
482 register_widget( 'SIB_Widget_Subscribe' );
483 }
484
485 /**
486 * Display form on front page
487 *
488 * @param string $frmID - form ID.
489 * @param string $lang - form language.
490 */
491 function generate_form_box( $frmID = '-1', $lang = '' ) {
492 if ( 'oldForm' == $frmID ) {
493 $frmID = get_option( 'sib_old_form_id' );
494 } elseif ( '' != $lang ) {
495 $trans_id = SIB_Forms_Lang::get_form_ID( $frmID, $lang );
496 if ( null != $trans_id ) {
497 $frmID = $trans_id;
498 }
499 }
500
501 $formData = SIB_Forms::getForm( $frmID );
502
503 if ( empty( $formData ) ) {
504 return;
505 }
506 // Add Google recaptcha
507 if( '0' != $formData['gCaptcha'] ) {
508 if( '1' == $formData['gCaptcha'] ) { // For old forms.
509 $formData['html'] = preg_replace( '/([\s\S]*?)<div class="g-recaptcha"[\s\S]*?data-size="invisible"><\/div>/', '$1', $formData['html'] );
510 }
511 if ( '3' == $formData['gCaptcha'] ) // The case of using google recaptcha.
512 {
513 ?>
514 <script type="text/javascript" charset="utf-8">
515 var gCaptchaSibWidget;
516 var onloadSibCallback = function() {
517 var recaptchas = document.querySelectorAll('div[id=sib_captcha]');
518 for( i = 0; i < recaptchas.length; i++) {
519 gCaptchaSibWidget = grecaptcha.render(recaptchas[i], {
520 'sitekey' : '<?php echo $formData["gCaptcha_site"] ?>'
521 });
522 }
523 }
524 </script>
525 <?php
526 }
527 else { // The case of using google invisible recaptcha.
528 ?>
529 <script type="text/javascript">
530 var gCaptchaSibWidget;
531 var onloadSibCallback = function() {
532 var element = document.getElementsByClassName('sib-default-btn');
533 gCaptchaSibWidget = grecaptcha.render(element[0],{
534 'sitekey' : '<?php echo $formData["gCaptcha_site"] ?>',
535 'callback' : sibVerifyCallback
536 });
537 };
538 </script>
539 <?php
540 }
541 ?>
542 <script src="https://www.google.com/recaptcha/api.js?onload=onloadSibCallback&render=explicit" async defer></script>
543 <?php
544 }
545
546 ?>
547 <form id="sib_signup_form_<?php echo esc_attr( $frmID ); ?>" method="post" class="sib_signup_form">
548 <div class="sib_loader" style="display:none;"><img
549 src="<?php echo esc_url( includes_url() ); ?>/images/spinner.gif" alt="loader"></div>
550 <input type="hidden" name="sib_form_action" value="subscribe_form_submit">
551 <input type="hidden" name="sib_form_id" value="<?php echo esc_attr( $frmID ); ?>">
552 <input type="hidden" name="sib_form_alert_notice" value="<?php echo esc_attr($formData['requiredMsg']); ?>">
553 <input type="hidden" name="sib_security" value="<?php echo esc_attr( wp_create_nonce( 'sib_front_ajax_nonce' ) ); ?>">
554 <div class="sib_signup_box_inside_<?php echo esc_attr( $frmID ); ?>">
555 <div style="/*display:none*/" class="sib_msg_disp">
556 </div>
557 <?php
558 echo stripcslashes($formData['html']);
559 ?>
560 </div>
561 </form>
562 <style>
563 <?php
564
565 if ( ! $formData['dependTheme'] ) {
566 // Custom css.
567 $formData['css'] = str_replace( '[form]', 'form#sib_signup_form_' . $frmID, $formData['css'] );
568 echo $formData['css'];
569 }
570 $msgCss = str_replace( '[form]', 'form#sib_signup_form_' . $frmID, SIB_Forms::getDefaultMessageCss() );
571 echo $msgCss;
572 ?>
573 </style>
574 <?php
575 }
576
577 /**
578 * Shortcode for sign up form
579 *
580 * @param array $atts - shortcode parameter.
581 * @return string
582 */
583 function sibwp_form_shortcode( $atts ) {
584 $pull_atts = shortcode_atts(
585 array(
586 'id' => 'oldForm', // We will return 'oldForm' for shortcode of old form.
587 ), $atts
588 );
589 $frmID = $pull_atts['id'];
590 $lang = defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '';
591
592 ob_start();
593 $this->generate_form_box( $frmID, $lang );
594
595 $output_string = ob_get_contents();
596 ob_end_clean();
597 return $output_string;
598 }
599
600 /**
601 * Sign up process
602 */
603 function signup_process() {
604 if ( empty( $_POST['sib_security'] ) ) {
605 wp_send_json(
606 array(
607 'status' => 'sib_security',
608 'msg' => 'Token not found.',
609 )
610 );
611 }
612 $formID = isset( $_POST['sib_form_id'] ) ? sanitize_text_field( $_POST['sib_form_id'] ) : 1;
613 if ( 'oldForm' == $formID ) {
614 $formID = get_option( 'sib_old_form_id' );
615 }
616 $formData = SIB_Forms::getForm( $formID );
617
618 if ( '0' != $formData['gCaptcha'] ) {
619 if ( ! isset( $_POST['g-recaptcha-response'] ) || empty( $_POST['g-recaptcha-response'] ) ) {
620 wp_send_json(
621 array(
622 'status' => 'gcaptchaEmpty',
623 'msg' => 'Please click on the reCAPTCHA box.',
624 )
625 );
626 }
627 $secret = $formData['gCaptcha_secret'];
628
629 $data = array(
630 'secret' => $secret,
631 'response' => sanitize_text_field( $_POST['g-recaptcha-response'] ),
632 );
633
634 $args = [
635 'method' => 'POST',
636 ];
637
638 try {
639 $data = wp_remote_retrieve_body(wp_remote_request(sprintf(self::RECAPTCHA_API_TEMPLATE, http_build_query($data)), $args));
640 $responseData = json_decode($data);
641 if ( ! $responseData->success ) {
642 wp_send_json(
643 array(
644 'status' => 'gcaptchaFail',
645 'msg' => 'Robot verification failed, please try again.',
646 )
647 );
648 }
649 } catch (Exception $exception) {
650 wp_send_json(
651 array(
652 'status' => 'gcaptchaFail',
653 'msg' => $exception->getMessage(),
654 )
655 );
656 }
657 }
658
659 $listID = $formData['listID'];
660 if (empty($listID)) {
661 $listID = array();
662 }
663 $interestingLists = isset( $_POST['interestingLists']) ? sanitize_text_field($_POST['interestingLists']) : array();
664 $expectedLists = isset( $_POST['listIDs'] ) ? sanitize_text_field($_POST['listIDs']) : array();
665 if ( empty($interestingLists) )
666 {
667 $unlinkedLists = [];
668 }
669 else{
670 $unwantedLists = array_diff( $interestingLists, $expectedLists );
671 $unlinkedLists = array_diff( $unwantedLists, $listID);
672 $listID = array_unique(array_merge( $listID, $expectedLists ));
673 }
674
675 $email = isset( $_POST['email'] ) ? sanitize_email( $_POST['email'] ) : '';
676 if ( ! is_email( $email ) ) {
677 return;
678 }
679
680 $isDoubleOptin = $formData['isDopt'];
681 $isOptin = $formData['isOpt'];
682 $redirectUrlInEmail = $formData['redirectInEmail'];
683 $redirectUrlInForm = $formData['redirectInForm'];
684
685 $info = array();
686 $attributes = explode( ',', $formData['attributes'] ); // String to array.
687 if ( isset( $attributes ) && is_array( $attributes ) ) {
688 foreach ( $attributes as $attribute ) {
689 $info[ $attribute ] = isset( $_POST[ $attribute ] ) ? sanitize_text_field( $_POST[ $attribute ] ) : '' ;
690 }
691 }
692 $templateID = $formData['templateID'];
693
694 if ( $isDoubleOptin ) {
695 /*
696 * Double optin process
697 * 1. add/update user in SIB contacts
698 * 2. add record to db
699 * 3. send confirmation email with activate code
700 */
701 // Create/updated subscriber.
702 $result = SIB_API_Manager::create_subscriber( 'double-optin', $email, $listID, $info, $unlinkedLists );
703 // Send a double optin confirm email.
704 if ( 'success' == $result ) {
705 // Add a recode with activate code in db.
706 $activateCode = $this->create_activate_code( $email, $info, $formID, $listID, $redirectUrlInEmail, $unlinkedLists );
707 SIB_API_Manager::send_comfirm_email( 'double-optin', $email, $templateID, $info, $activateCode );
708 }
709 } elseif ( $isOptin ) {
710 $result = SIB_API_Manager::create_subscriber( 'confirm', $email, $listID, $info, $unlinkedLists );
711 if ( 'success' == $result ) {
712 // Send a confirm email.
713 SIB_API_Manager::send_comfirm_email( 'confirm', $email, $templateID, $info );
714 }
715 } else {
716 $result = SIB_API_Manager::create_subscriber( 'simple', $email, $listID, $info, $unlinkedLists );
717 }
718 $msg = array(
719 'successMsg' => $formData['successMsg'],
720 'errorMsg' => $formData['errorMsg'],
721 'existMsg' => $formData['existMsg'],
722 'invalidMsg' => $formData['invalidMsg'],
723 );
724
725 wp_send_json(
726 array(
727 'status' => $result,
728 'msg' => $msg,
729 'redirect' => $redirectUrlInForm,
730 )
731 );
732 }
733
734 /**
735 * Create activate code for Double optin
736 *
737 * @param string $email - user email.
738 * @param array $info - info.
739 * @param string $formID - form ID.
740 * @param array $listIDs - lists.
741 * @param string $redirectUrl - redirect url.
742 * @return string - activate code.
743 */
744 function create_activate_code( $email, $info, $formID, $listIDs, $redirectUrl, $unlinkedLists = null ) {
745 $data = SIB_Model_Users::get_data_by_email( $email, $formID );
746 if ( $unlinkedLists != null )
747 {
748 $info['unlinkedLists'] = $unlinkedLists;
749 }
750 if ( false == $data ) {
751 $uniqid = uniqid();
752 $data = array(
753 'email' => $email,
754 'code' => $uniqid,
755 'info' => maybe_serialize( $info ),
756 'frmid' => $formID,
757 'listIDs' => maybe_serialize( $listIDs ),
758 'redirectUrl' => $redirectUrl,
759 );
760 SIB_Model_Users::add_record( $data );
761 } else {
762 $uniqid = $data['code'];
763 }
764 return $uniqid;
765 }
766
767 /**
768 * Use Sendinblue SMTP to send all emails
769 *
770 * @param string $to - reception email.
771 * @param string $subject - subject of email.
772 * @param string $message - message of email.
773 * @param string $headers - header of email.
774 * @param array $attachments - attachments.
775 */
776 static function wp_mail_native( $to, $subject, $message, $headers = '', $attachments = array() ) {
777 $result = require self::$plugin_dir . '/inc/function.wp_mail.php';
778 return $result;
779 }
780
781 /**
782 * To send the transactional email via Sendinblue
783 * hook wp_mail
784 *
785 * @param string $to - reception email.
786 * @param string $subject - subject of email.
787 * @param string $message - message of email.
788 * @param string $headers - header of email.
789 * @param array $attachments - attachments
790 * @param array $tags - tag.
791 * @param string $from_name - sender name.
792 * @param string $from_email - sender email.
793 * @return mixed|WP_Error
794 */
795 static function sib_email( $to, $subject, $message, $headers = '', $attachments = array(), $tags = array(), $from_name = '', $from_email = '' ) {
796 $data = [];
797 // Compact the input, apply the filters, and extract them back out.
798 extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );
799
800 if ( ! is_array( $attachments ) ) {
801 $attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
802 }
803
804 // From email and name.
805 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME );
806 if ( isset( $home_settings['sender'] ) ) {
807 $from_name = $home_settings['from_name'];
808 $from_email = $home_settings['from_email'];
809 } else {
810 $from_email = trim( get_bloginfo( 'admin_email' ) );
811 $from_name = trim( get_bloginfo( 'name' ) );
812 }
813 $from_email = apply_filters( 'wp_mail_from', $from_email );
814 $from_name = apply_filters( 'wp_mail_from_name', $from_name );
815
816 if ( !empty( $headers ) ) {
817 $data['headers'] = $headers;
818 if ( ! is_array( $headers ) ) {
819 // Explode the headers out, so this function can take both.
820 // string headers and an array of headers.
821 $tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) );
822 } else {
823 $tempheaders = $headers;
824 }
825 $headers = array();
826 $bcc = array();
827 // If it's actually got contents.
828 if ( ! empty( $tempheaders ) ) {
829 // Iterate through the raw headers.
830 foreach ( (array) $tempheaders as $header ) {
831 if ( strpos( $header, ':' ) === false ) {
832 if ( false !== stripos( $header, 'boundary=' ) ) {
833 $parts = preg_split( '/boundary=/i', trim( $header ) );
834 $boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
835 }
836 continue;
837 }
838 // Explode them out.
839 list($name, $content) = explode( ':', trim( $header ), 2 );
840
841 // Cleanup crew.
842 $name = trim( $name );
843 $content = trim( $content );
844
845 switch ( strtolower( $name ) ) {
846 case 'content-type':
847 $headers[ trim( $name ) ] = trim( $content );
848 break;
849 case 'x-mailin-tag':
850 $headers[ trim( $name ) ] = trim( $content );
851 break;
852 case 'from':
853 if ( strpos( $content, '<' ) !== false ) {
854 // So... making my life hard again?
855 $from_name = substr( $content, 0, strpos( $content, '<' ) - 1 );
856 $from_name = str_replace( '"', '', $from_name );
857 $from_name = trim( $from_name );
858
859 $from_email = substr( $content, strpos( $content, '<' ) + 1 );
860 $from_email = str_replace( '>', '', $from_email );
861 $from_email = trim( $from_email );
862 } else {
863 $from_name = '';
864 $from_email = trim( $content );
865 }
866 break;
867
868 case 'bcc':
869 if ( strpos( $content, '<') !== false )
870 {
871 $bcc_content = substr( $content, strpos( $content, '<' ) + 1 );
872 $bcc_content = str_replace( '>', '', $bcc_content );
873 $bcc[ trim( $bcc_content ) ] = '';
874 } else {
875
876 if (!empty(trim( $content ))) {
877 $data['bcc'] = ['email' => trim( $content )];
878 }
879 }
880 break;
881 case 'cc':
882 if ( strpos( $content, '<') !== false )
883 {
884 $cc_content = substr( $content, strpos( $content, '<' ) + 1 );
885 $cc_content = str_replace( '>', '', $cc_content );
886 if (!empty(trim( $cc_content ))) {
887 $data['cc'] = ['email' => trim( $cc_content )];
888 }
889 }
890 break;
891 case 'reply-to':
892 if ( strpos( $content, '<') !== false )
893 {
894 $reply_content = substr( $content, strpos( $content, '<' ) + 1 );
895 $reply_content = str_replace( '>', '', $reply_content );
896 $reply = trim( $reply_content );
897 } else {
898 $reply = trim( $content );
899 }
900
901 if (!empty($reply)) {
902 $data['replyTo'] = ['email' => trim( $reply )];
903 }
904 break;
905 default:
906 break;
907 }
908 }
909 }
910 }
911
912 // Set destination addresses.
913 if ( ! is_array( $to ) ) {
914 $to = explode( ',', preg_replace( '/\s+/', '', $to ) ); // strip all whitespace.
915 }
916
917 $processed_to = array();
918 foreach ( $to as $email ) {
919 if ( is_array( $email ) ) {
920 $processed_to[] = $email;
921 } else {
922 $processed_to[] = ['email' => $email];
923 }
924 }
925 $data['to'] = $processed_to;
926
927
928 // Attachments.
929 $attachment_content = array();
930 if ( ! empty( $attachments ) ) {
931 foreach ( $attachments as $attachment ) {
932 $content = self::getAttachmentStruct( $attachment );
933 if ( ! is_wp_error( $content ) ) {
934 $attachment_content = array_merge( $attachment_content, $content );
935 }
936 }
937 $data['attachment'] = $attachment_content;
938 }
939
940 // Common transformations for the HTML part.
941 // If it is text/plain, New line break found.
942 if ( strpos( $message, '</table>' ) === false && strpos( $message, '</div>' ) === false ) {
943 if ( strpos( $message, "\n" ) !== false ) {
944 if ( is_array( $message ) ) {
945 foreach ( $message as &$value ) {
946 $value['content'] = preg_replace( '#<(https?://[^*]+)>#', '$1', $value['content'] );
947 $value['content'] = nl2br( $value['content'] );
948 }
949 } else {
950 $message = preg_replace( '#<(https?://[^*]+)>#', '$1', $message );
951 $message = nl2br( $message );
952 }
953 }
954 }
955 // Sending...
956 $data['sender'] = ['email' => $from_email, 'name' => $from_name ];
957 $data['subject'] = $subject;
958 $data['htmlContent'] = $message;
959
960 try {
961 $sent = SIB_API_Manager::send_email( $data );
962 return $sent;
963 } catch ( Exception $e ) {
964 return new WP_Error( $e->getMessage() );
965 }
966 }
967
968 /**
969 * @param string $path - attachment file path
970 * @return array|WP_Error
971 */
972 static function getAttachmentStruct( $path ) {
973
974 $struct = array();
975
976 try {
977
978 if ( ! @is_file( $path ) ) {
979 throw new Exception( $path . ' is not a valid file.' );
980 }
981
982 $filename = basename( $path );
983
984 if ( ! function_exists( 'get_magic_quotes' ) ) {
985 /**
986 * @return bool
987 */
988 function get_magic_quotes() {
989 return false;
990 }
991 }
992 if ( ! function_exists( 'set_magic_quotes' ) ) {
993 /**
994 * @param $value
995 * @return bool
996 */
997 function set_magic_quotes( $value ) {
998 return true;
999 }
1000 }
1001
1002 $isMagicQuotesSupported = version_compare( PHP_VERSION, '5.3.0', '<' )
1003 && function_exists( 'get_magic_quotes_runtime' )
1004 && function_exists( 'set_magic_quotes_runtime' );
1005
1006 if ( $isMagicQuotesSupported ) {
1007 // Escape linters check.
1008 $getMagicQuotesRuntimeFunc = 'get_magic_quotes_runtime';
1009 $setMagicQuotesRuntimeFunc = 'set_magic_quotes_runtime';
1010
1011 // Save magic quotes value.
1012 $magicQuotes = $getMagicQuotesRuntimeFunc();
1013 $setMagicQuotesRuntimeFunc (0);
1014 }
1015
1016 $file_buffer = file_get_contents( $path );
1017 $file_buffer = chunk_split( base64_encode( $file_buffer ), 76, "\n" );
1018
1019 if ( $isMagicQuotesSupported ) {
1020 // Restore magic quotes value.
1021 $setMagicQuotesRuntimeFunc($magicQuotes);
1022 }
1023
1024 $struct[ $filename ] = $file_buffer;
1025
1026 } catch ( Exception $e ) {
1027 return new WP_Error( 'Error creating the attachment structure: ' . $e->getMessage() );
1028 }
1029
1030 return $struct;
1031 }
1032
1033 /**
1034 * Create custom page for form preview
1035 *
1036 * @param array $query_vars - query.
1037 * @return array
1038 */
1039 function sib_query_vars( $query_vars ) {
1040 $query_vars[] = 'sib_form';
1041 return $query_vars;
1042 }
1043
1044 /**
1045 * Parse request
1046 *
1047 * @param mixed $wp - object.
1048 */
1049 function sib_parse_request( &$wp ) {
1050 if ( array_key_exists( 'sib_form', $wp->query_vars ) ) {
1051 include 'inc/sib-form-preview.php';
1052 exit();
1053 }
1054 }
1055
1056 /**
1057 * Load Text domain.
1058 */
1059 static function LoadTextDomain() {
1060 // Load lang file.
1061 $i18n_file_name = 'sib_lang';
1062 $locale = apply_filters( 'plugin_locale', get_locale(), $i18n_file_name );
1063 // $locale = 'fr_FR';
1064 $filename = plugin_dir_path( __FILE__ ) . '/lang/' . $i18n_file_name . '-' . $locale . '.mo';
1065 load_textdomain( 'sib_lang', $filename );
1066 }
1067
1068 /**
1069 * Notice the language is difference than site's language
1070 */
1071 static function language_admin_notice() {
1072 if ( ! get_option( SIB_Manager::LANGUAGE_OPTION_NAME ) ) {
1073 $lang_prefix = substr( get_bloginfo( 'language' ), 0, 2 );
1074 $lang = self::getLanguageName( $lang_prefix );
1075 $class = 'error';
1076 $message = sprintf( 'Please note that your Sendinblue account is in %s, but Sendinblue WordPress plugin is only available in English / French for now. Sorry for inconvenience.', $lang );
1077 if ( 'en' !== $lang_prefix && 'fr' !== $lang_prefix ) {
1078 echo ( "<div class=\"$class\" style='margin-left: 2px;margin-bottom: 4px;'> <p>$message<a class='' href='?dismiss_admin_lang_notice=1'> No problem...</a></p></div>" );
1079 }
1080 }
1081 }
1082
1083 /**
1084 * Notice wp_mail is not possible
1085 */
1086 static function wpMailNotices() {
1087 if ( self::$wp_mail_conflict ) {
1088 echo ( '<div class="error"><p>' . __( 'You cannot use Sendinblue SMTP now because wp_mail has been declared by another process or plugin. ', 'sib_lang' ) . '</p></div>' );
1089 }
1090 }
1091
1092 /**
1093 * Names of languages.
1094 *
1095 * @param string $prefix - language.
1096 * @return mixed
1097 */
1098 public static function getLanguageName( $prefix = 'en' ) {
1099 $lang = array();
1100 $lang['de'] = 'Deutsch';
1101 $lang['en'] = 'English';
1102 $lang['zh'] = '中文';
1103 $lang['ru'] = 'Русский';
1104 $lang['fi'] = 'suomi';
1105 $lang['fr'] = 'Français';
1106 $lang['nl'] = 'Nederlands';
1107 $lang['sv'] = 'Svenska';
1108 $lang['it'] = 'Italiano';
1109 $lang['ro'] = 'Română';
1110 $lang['hu'] = 'Magyar';
1111 $lang['ja'] = '日本語';
1112 $lang['es'] = 'Español';
1113 $lang['vi'] = 'Tiếng Việt';
1114 $lang['ar'] = 'العربية';
1115 $lang['pt'] = 'Português';
1116 $lang['pb'] = 'Português do Brasil';
1117 $lang['pl'] = 'Polski';
1118 $lang['gl'] = 'galego';
1119 $lang['tr'] = 'Turkish';
1120 $lang['et'] = 'Eesti';
1121 $lang['hr'] = 'Hrvatski';
1122 $lang['eu'] = 'Euskera';
1123 $lang['el'] = 'Ελληνικά';
1124 $lang['ua'] = 'Українська';
1125 $lang['ko'] = '한국어';
1126
1127 return $lang[ $prefix ];
1128 }
1129
1130 /**
1131 * Create language sidebar for wpml plugin.
1132 */
1133 public function sib_create_language_sidebar() {
1134 $languages = apply_filters( 'wpml_active_languages', array() );
1135 $page = isset( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
1136 $action = isset( $_GET['action'] ) ? sanitize_text_field( $_GET['action'] ) : '';
1137 $frmID = isset( $_GET['id'] ) ? sanitize_text_field( $_GET['id'] ) : '';
1138 $pID = isset( $_GET['pid'] ) ? sanitize_text_field( $_GET['pid'] ) : '';
1139 $parent = true;
1140 if ( '' !== $frmID && '' !== $pID ) {
1141 $lang = SIB_Forms_Lang::get_lang( $frmID, $pID );
1142 $parent = false;
1143 } else {
1144 $lang = ICL_LANGUAGE_CODE;
1145 if ( '' !== $frmID && '' === $pID ) {
1146 $pID = $frmID;
1147
1148 }
1149 }
1150
1151 if ( 'sib_page_form' === $page && 'edit' === $action ) {
1152 ?>
1153 <div class="panel panel-default text-left box-border-box sib-small-content">
1154 <div class="panel-heading"><strong><?php esc_attr_e( 'About Sendinblue', 'sib_lang' ); ?></strong></div>
1155 <div class="panel-body">
1156 <p>
1157 <label for='sib_form_language'><?php esc_attr_e( 'Language of this form:', 'sib_lang' ); ?> </label>
1158 <select id="sib_form_lang" name="sib_form_lang" data-selected="">
1159 <?php
1160 foreach ( $languages as $language ) {
1161 $selected = ($language['code'] == $lang) ? 'selected' : '';
1162 if ( $language['code'] == $lang && true === $parent ) {
1163 $option_text = '<option value="" ' . $selected . '>' . $language['native_name'] . '</option>';
1164 } else {
1165 $exist = SIB_Forms_Lang::get_form_ID( $pID, $language['language_code'] );
1166
1167 if ( null === $exist ) {
1168 continue;
1169 } else {
1170 $option_text = ( 'selected' === $selected ) ? sprintf( '<option value="" selected>%s</option>', $language['native_name'] ) : sprintf( '<option value="?page=%s&action=%s&pid=%s&lang=%s" %s >%s</option>', esc_attr( $_REQUEST['page'] ), 'edit', absint( $pID ), $language['language_code'], $selected, $language['native_name'] );
1171 }
1172 }
1173 echo $option_text ;
1174 }
1175 ?>
1176 </select>
1177 </p>
1178 <div class="sib_form_translate">
1179 <p>
1180 <label><?php esc_attr_e( 'Translate this form', 'sib_lang' ); ?></label>
1181 </p>
1182 <table width="100%" class="sib_form_trans_table" style="border: 1px solid #8cceea;">
1183 <tr>
1184 <?php
1185 foreach ( $languages as $language ) {
1186 if ( $language['code'] == $lang ) {
1187 continue;
1188 }
1189 ?>
1190 <th style="text-align: center;"><img
1191 src="<?php echo esc_url( $language['country_flag_url'] ); ?>"></th>
1192 <?php
1193 }
1194 ?>
1195 </tr>
1196 <tr style="background-color: #EFF8FC;">
1197 <?php
1198 foreach ( $languages as $language ) {
1199 if ( $language['code'] == $lang ) {
1200 continue;
1201 }
1202 if ( '' === $pID ) {
1203 $img_src = plugins_url( 'img/add_translation_disabled.png', __FILE__ );
1204 $td = '<img src="' . $img_src . '" style="margin:2px;">';
1205 } else {
1206 $exist = SIB_Forms_Lang::get_form_ID( $pID, $language['language_code'] );
1207
1208 if ( null === $exist ) {
1209 $img_src = plugins_url( 'img/add_translation.png', __FILE__ );
1210
1211 $href = sprintf( '<a class="sib-form-redirect" href="?page=%s&action=%s&pid=%s&lang=%s" style="width: 20px; text-align: center;padding: 2px 1px;">', esc_attr( $_REQUEST['page'] ), 'edit', absint( $pID ), $language['language_code'] );
1212 $td = $href . '<img src="' . $img_src . '" style="margin:2px;"></a>';
1213 } else {
1214 $img_src = plugins_url( 'img/edit_translation.png', __FILE__ );
1215 $href = sprintf( '<a class="sib-form-redirect" href="?page=%s&action=%s&id=%s&pid=%s&lang=%s" style="width: 20px; text-align: center;padding: 2px 1px;">', esc_attr( $_REQUEST['page'] ), 'edit', absint( $exist ), absint( $pID ), $language['language_code'] );
1216 $td = $href . '<img src="' . $img_src . '" style="margin:2px;"></a>';
1217 }
1218 }
1219 ?>
1220 <td style="text-align: center;"><?php echo $td; ?></td>
1221 <?php
1222 }
1223 ?>
1224 </tr>
1225 </table>
1226 </div>
1227 <?php if ( isset( $_GET['pid'] ) ) { ?>
1228 <div class="sib-form-duplicate">
1229 <button class="btn btn-default sib-duplicate-btn"><?php esc_attr_e( 'Copy content from origin form', 'sib_lang' ); ?></button>
1230 <span class="sib-spin"><i
1231 class="fa fa-circle-o-notch fa-spin fa-lg"></i>&nbsp;&nbsp;</span>
1232 <i title="<?php echo esc_attr_e( 'Copy content from origin form', 'sib_lang' ); ?>"
1233 data-container="body" data-toggle="popover" data-placement="left"
1234 data-content="<?php echo esc_attr_e( 'You can copy contents from origin form. You need to translate the contents by this language.', 'sib_lang' ); ?>"
1235 data-html="true" class="fa fa-question-circle popover-help-form"></i>
1236 </div>
1237 <?php } ?>
1238 </div>
1239 </div>
1240 <?php
1241 }
1242 }
1243
1244 public function ajax_get_country_prefix() {
1245 check_ajax_referer( 'sib_front_ajax_nonce', 'security' );
1246 $sms_manager = new SIB_SMS_Code();
1247 $country_list = $sms_manager->get_sms_code_list();
1248 $country_list_html = '';
1249 foreach ( $country_list as $item => $value ) {
1250 $flg_url = plugins_url( 'img/flags/', __FILE__ ).strtolower($item).'.png';
1251 $item_html = '<li class="sib-country-prefix" data-country-code="'.$item.'" data-dial-code="'.$value["code"].'"><div class="sib-flag-box"><div class="sib-flag '.$item.'" style="background-image: url('.$flg_url.')"></div><span>'.$value['name'].'</span><span class="sib-dial-code">+'.$value['code'].'</span></div></li>';
1252 $country_list_html .= $item_html;
1253 }
1254 wp_send_json($country_list_html);
1255 }
1256 }
1257
1258 add_action( 'sendinblue_init', 'sendinblue_init' );
1259 add_filter( 'widget_text', 'do_shortcode' );
1260
1261 /**
1262 * Plugin entry point Process.
1263 */
1264 function sendinblue_init() {
1265 SIB_Manager::LoadTextDomain();
1266 new SIB_Manager();
1267 }
1268
1269 do_action( 'sendinblue_init' );
1270 }
1271