PluginProbe ʕ •ᴥ•ʔ
Brevo – Email, SMS, Web Push, Chat, and more. / 3.0.4
Brevo – Email, SMS, Web Push, Chat, and more. v3.0.4
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
1288 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.4
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_api_key_set() ) {
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 }
353
354 /**
355 * Registers scripts for frontend
356 */
357 function frontend_register_scripts() {
358
359 }
360
361 /**
362 * Enqueue script on front page
363 */
364 function wp_head_ac() {
365 wp_enqueue_script( 'sib-front-js', self::$plugin_url . '/js/mailin-front.js', array( 'jquery' ), filemtime( self::$plugin_dir . '/js/mailin-front.js' ), false );
366 wp_enqueue_style( 'sib-front-css', self::$plugin_url.'/css/mailin-front.css', array(), array(), 'all');
367 wp_localize_script(
368 'sib-front-js', 'sibErrMsg', array(
369 'invalidMail' => __( 'Please fill out valid email address', 'sib_lang' ),
370 'requiredField' => __( 'Please fill out required fields', 'sib_lang' ),
371 'invalidDateFormat' => __( 'Please fill out valid date format', 'sib_lang' ),
372 'invalidSMSFormat' => __( 'Please fill out valid phone number', 'sib_lang' ),
373 )
374 );
375 wp_localize_script(
376 'sib-front-js', 'ajax_sib_front_object',
377 array(
378 'ajax_url' => admin_url( 'admin-ajax.php' ),
379 'ajax_nonce' => wp_create_nonce( 'sib_front_ajax_nonce' ),
380 'flag_url' => plugins_url('img/flags/', __FILE__ ),
381 )
382 );
383 }
384
385 /**
386 * Install method is called once install this plugin.
387 * create tables, default option ...
388 */
389 static function install() {
390 $general_settings = get_option( self::MAIN_OPTION_NAME, array() );
391 $access_key = isset( $general_settings['access_key'] ) ? $general_settings['access_key'] : '';
392 if ( '' === $access_key ) {
393 // Default option when activate.
394 $home_settings = array(
395 'activate_email' => 'no',
396 'activate_ma' => 'no',
397 );
398 update_option( self::HOME_OPTION_NAME, $home_settings );
399 }
400 }
401
402 /**
403 * Uninstall method is called once uninstall this plugin
404 * delete tables, options that used in plugin
405 */
406 static function uninstall() {
407 $setting = array();
408 update_option( SIB_Manager::MAIN_OPTION_NAME, $setting );
409
410 $home_settings = array(
411 'activate_email' => 'no',
412 'activate_ma' => 'no',
413 );
414 update_option( SIB_Manager::HOME_OPTION_NAME, $home_settings );
415
416 // Delete access_token.
417 $token_settings = array();
418 update_option( SIB_Manager::ACCESS_TOKEN_OPTION_NAME, $token_settings );
419 delete_option(SIB_Manager::API_KEY_V3_OPTION_NAME);
420 // Empty tables.
421 SIB_Model_Users::removeTable();
422 SIB_Forms::removeTable();
423 SIB_Forms_Lang::removeTable();
424
425 // Remove all transient.
426 SIB_API_Manager::remove_transients();
427 }
428
429 /**
430 * Deactivate method is called once deactivate this plugin
431 */
432 static function deactivate() {
433 update_option( SIB_Manager::LANGUAGE_OPTION_NAME, false );
434 // Remove sync users option.
435 delete_option( 'sib_sync_users' );
436 // Remove all transient.
437 SIB_API_Manager::remove_transients();
438 }
439
440 /**
441 * Check that have done validation process already.
442 */
443 static function is_done_validation($redirect = true) {
444 if (self::is_api_key_set()) {
445 $apiClient = new SendinblueApiClient();
446 $response = $apiClient->getAccount();
447 if ( $apiClient->getLastResponseCode() === SendinblueApiClient::RESPONSE_CODE_OK ) {
448 return true;
449 }
450
451 if ($redirect) {
452 delete_option(SIB_Manager::API_KEY_V3_OPTION_NAME);
453 wp_safe_redirect(add_query_arg('page', SIB_Page_Home::PAGE_ID, admin_url('admin.php')));
454 }
455 }
456
457 return false;
458 }
459
460 static function is_api_key_set() {
461 return !empty(get_option(SIB_Manager::API_KEY_V3_OPTION_NAME));
462 }
463
464 /**
465 * Install marketing automation script in header
466 */
467 function install_ma_script() {
468 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME, array() );
469 if ( isset( $home_settings['activate_ma'] ) && 'yes' == $home_settings['activate_ma'] ) {
470 $general_settings = get_option( SIB_Manager::MAIN_OPTION_NAME, array() );
471 $ma_email = '';
472 $current_user = wp_get_current_user();
473 if ( $current_user instanceof WP_User ) {
474 $ma_email = $current_user->user_email;
475 }
476 $ma_key = $general_settings['ma_key'];
477 $output = '<script type="text/javascript">
478 (function() {window.sib ={equeue:[],client_key:"'. $ma_key .'"};/* OPTIONAL: email for identify request*/
479 window.sib.email_id = "'. $ma_email .'";
480 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();})();
481 </script>';
482 echo $output;
483 }
484 }
485
486 /**
487 * Register widget
488 */
489 function sib_create_widget() {
490 register_widget( 'SIB_Widget_Subscribe' );
491 }
492
493 /**
494 * Display form on front page
495 *
496 * @param string $frmID - form ID.
497 * @param string $lang - form language.
498 */
499 function generate_form_box( $frmID = '-1', $lang = '' ) {
500 if ( 'oldForm' == $frmID ) {
501 $frmID = get_option( 'sib_old_form_id' );
502 } elseif ( '' != $lang ) {
503 $trans_id = SIB_Forms_Lang::get_form_ID( $frmID, $lang );
504 if ( null != $trans_id ) {
505 $frmID = $trans_id;
506 }
507 }
508
509 $formData = SIB_Forms::getForm( $frmID );
510
511 if ( empty( $formData ) ) {
512 return;
513 }
514 // Add Google recaptcha
515 if( '0' != $formData['gCaptcha'] ) {
516 if( '1' == $formData['gCaptcha'] ) { // For old forms.
517 $formData['html'] = preg_replace( '/([\s\S]*?)<div class="g-recaptcha"[\s\S]*?data-size="invisible"><\/div>/', '$1', $formData['html'] );
518 }
519 if ( '3' == $formData['gCaptcha'] ) // The case of using google recaptcha.
520 {
521 ?>
522 <script type="text/javascript" charset="utf-8">
523 var gCaptchaSibWidget;
524 var onloadSibCallback = function() {
525 var recaptchas = document.querySelectorAll('div[id=sib_captcha]');
526 for( i = 0; i < recaptchas.length; i++) {
527 gCaptchaSibWidget = grecaptcha.render(recaptchas[i], {
528 'sitekey' : '<?php echo $formData["gCaptcha_site"] ?>'
529 });
530 }
531 }
532 </script>
533 <?php
534 }
535 else { // The case of using google invisible recaptcha.
536 ?>
537 <script type="text/javascript">
538 var gCaptchaSibWidget;
539 var onloadSibCallback = function() {
540 var element = document.getElementsByClassName('sib-default-btn');
541 gCaptchaSibWidget = grecaptcha.render(element[0],{
542 'sitekey' : '<?php echo $formData["gCaptcha_site"] ?>',
543 'callback' : sibVerifyCallback
544 });
545 };
546 </script>
547 <?php
548 }
549 ?>
550 <script src="https://www.google.com/recaptcha/api.js?onload=onloadSibCallback&render=explicit" async defer></script>
551 <?php
552 }
553
554 ?>
555 <form id="sib_signup_form_<?php echo esc_attr( $frmID ); ?>" method="post" class="sib_signup_form">
556 <div class="sib_loader" style="display:none;"><img
557 src="<?php echo esc_url( includes_url() ); ?>/images/spinner.gif" alt="loader"></div>
558 <input type="hidden" name="sib_form_action" value="subscribe_form_submit">
559 <input type="hidden" name="sib_form_id" value="<?php echo esc_attr( $frmID ); ?>">
560 <input type="hidden" name="sib_form_alert_notice" value="<?php echo esc_attr($formData['requiredMsg']); ?>">
561 <input type="hidden" name="sib_security" value="<?php echo esc_attr( wp_create_nonce( 'sib_front_ajax_nonce' ) ); ?>">
562 <div class="sib_signup_box_inside_<?php echo esc_attr( $frmID ); ?>">
563 <div style="/*display:none*/" class="sib_msg_disp">
564 </div>
565 <?php
566 echo stripcslashes($formData['html']);
567 ?>
568 </div>
569 </form>
570 <style>
571 <?php
572
573 if ( ! $formData['dependTheme'] ) {
574 // Custom css.
575 $formData['css'] = str_replace( '[form]', 'form#sib_signup_form_' . $frmID, $formData['css'] );
576 echo $formData['css'];
577 }
578 $msgCss = str_replace( '[form]', 'form#sib_signup_form_' . $frmID, SIB_Forms::getDefaultMessageCss() );
579 echo $msgCss;
580 ?>
581 </style>
582 <?php
583 }
584
585 /**
586 * Shortcode for sign up form
587 *
588 * @param array $atts - shortcode parameter.
589 * @return string
590 */
591 function sibwp_form_shortcode( $atts ) {
592 $pull_atts = shortcode_atts(
593 array(
594 'id' => 'oldForm', // We will return 'oldForm' for shortcode of old form.
595 ), $atts
596 );
597 $frmID = $pull_atts['id'];
598 $lang = defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '';
599
600 ob_start();
601 $this->generate_form_box( $frmID, $lang );
602
603 $output_string = ob_get_contents();
604 ob_end_clean();
605 return $output_string;
606 }
607
608 /**
609 * Sign up process
610 */
611 function signup_process() {
612 if ( empty( $_POST['sib_security'] ) ) {
613 wp_send_json(
614 array(
615 'status' => 'sib_security',
616 'msg' => 'Token not found.',
617 )
618 );
619 }
620 $formID = isset( $_POST['sib_form_id'] ) ? sanitize_text_field( $_POST['sib_form_id'] ) : 1;
621 if ( 'oldForm' == $formID ) {
622 $formID = get_option( 'sib_old_form_id' );
623 }
624 $formData = SIB_Forms::getForm( $formID );
625
626 if (!SIB_Manager::is_done_validation(false) || 0 == count($formData)) {
627 wp_send_json(
628 array(
629 'status' => 'failure',
630 'msg' => array("errorMsg" => "Something wrong occurred"),
631 )
632 );
633 }
634
635 if ( '0' != $formData['gCaptcha'] ) {
636 if ( ! isset( $_POST['g-recaptcha-response'] ) || empty( $_POST['g-recaptcha-response'] ) ) {
637 wp_send_json(
638 array(
639 'status' => 'gcaptchaEmpty',
640 'msg' => 'Please click on the reCAPTCHA box.',
641 )
642 );
643 }
644 $secret = $formData['gCaptcha_secret'];
645
646 $data = array(
647 'secret' => $secret,
648 'response' => sanitize_text_field( $_POST['g-recaptcha-response'] ),
649 );
650
651 $args = [
652 'method' => 'POST',
653 ];
654
655 try {
656 $data = wp_remote_retrieve_body(wp_remote_request(sprintf(self::RECAPTCHA_API_TEMPLATE, http_build_query($data)), $args));
657 $responseData = json_decode($data);
658 if ( ! $responseData->success ) {
659 wp_send_json(
660 array(
661 'status' => 'gcaptchaFail',
662 'msg' => 'Robot verification failed, please try again.',
663 )
664 );
665 }
666 } catch (Exception $exception) {
667 wp_send_json(
668 array(
669 'status' => 'gcaptchaFail',
670 'msg' => $exception->getMessage(),
671 )
672 );
673 }
674 }
675
676 $listID = $formData['listID'];
677 if (empty($listID)) {
678 $listID = array();
679 }
680 $interestingLists = isset( $_POST['interestingLists']) ? sanitize_text_field($_POST['interestingLists']) : array();
681 $expectedLists = isset( $_POST['listIDs'] ) ? sanitize_text_field($_POST['listIDs']) : array();
682 if ( empty($interestingLists) )
683 {
684 $unlinkedLists = [];
685 }
686 else{
687 $unwantedLists = array_diff( $interestingLists, $expectedLists );
688 $unlinkedLists = array_diff( $unwantedLists, $listID);
689 $listID = array_unique(array_merge( $listID, $expectedLists ));
690 }
691
692 $email = isset( $_POST['email'] ) ? sanitize_email( $_POST['email'] ) : '';
693 if ( ! is_email( $email ) ) {
694 return;
695 }
696
697 $isDoubleOptin = $formData['isDopt'];
698 $isOptin = $formData['isOpt'];
699 $redirectUrlInEmail = $formData['redirectInEmail'];
700 $redirectUrlInForm = $formData['redirectInForm'];
701
702 $info = array();
703 $attributes = explode( ',', $formData['attributes'] ); // String to array.
704 if ( isset( $attributes ) && is_array( $attributes ) ) {
705 foreach ( $attributes as $attribute ) {
706 $info[ $attribute ] = isset( $_POST[ $attribute ] ) ? sanitize_text_field( $_POST[ $attribute ] ) : '' ;
707 }
708 }
709 $templateID = $formData['templateID'];
710
711 if ( $isDoubleOptin ) {
712 /*
713 * Double optin process
714 * 1. add/update user in SIB contacts
715 * 2. add record to db
716 * 3. send confirmation email with activate code
717 */
718 // Create/updated subscriber.
719 $result = SIB_API_Manager::create_subscriber( 'double-optin', $email, $listID, $info, $unlinkedLists );
720 // Send a double optin confirm email.
721 if ( 'success' == $result ) {
722 // Add a recode with activate code in db.
723 $activateCode = $this->create_activate_code( $email, $info, $formID, $listID, $redirectUrlInEmail, $unlinkedLists );
724 SIB_API_Manager::send_comfirm_email( 'double-optin', $email, $templateID, $info, $activateCode );
725 }
726 } elseif ( $isOptin ) {
727 $result = SIB_API_Manager::create_subscriber( 'confirm', $email, $listID, $info, $unlinkedLists );
728 if ( 'success' == $result ) {
729 // Send a confirm email.
730 SIB_API_Manager::send_comfirm_email( 'confirm', $email, $templateID, $info );
731 }
732 } else {
733 $result = SIB_API_Manager::create_subscriber( 'simple', $email, $listID, $info, $unlinkedLists );
734 }
735 $msg = array(
736 'successMsg' => $formData['successMsg'],
737 'errorMsg' => $formData['errorMsg'],
738 'existMsg' => $formData['existMsg'],
739 'invalidMsg' => $formData['invalidMsg'],
740 );
741
742 wp_send_json(
743 array(
744 'status' => $result,
745 'msg' => $msg,
746 'redirect' => $redirectUrlInForm,
747 )
748 );
749 }
750
751 /**
752 * Create activate code for Double optin
753 *
754 * @param string $email - user email.
755 * @param array $info - info.
756 * @param string $formID - form ID.
757 * @param array $listIDs - lists.
758 * @param string $redirectUrl - redirect url.
759 * @return string - activate code.
760 */
761 function create_activate_code( $email, $info, $formID, $listIDs, $redirectUrl, $unlinkedLists = null ) {
762 $data = SIB_Model_Users::get_data_by_email( $email, $formID );
763 if ( $unlinkedLists != null )
764 {
765 $info['unlinkedLists'] = $unlinkedLists;
766 }
767 if ( false == $data ) {
768 $uniqid = uniqid();
769 $data = array(
770 'email' => $email,
771 'code' => $uniqid,
772 'info' => maybe_serialize( $info ),
773 'frmid' => $formID,
774 'listIDs' => maybe_serialize( $listIDs ),
775 'redirectUrl' => $redirectUrl,
776 );
777 SIB_Model_Users::add_record( $data );
778 } else {
779 $uniqid = $data['code'];
780 }
781 return $uniqid;
782 }
783
784 /**
785 * Use Sendinblue SMTP to send all emails
786 *
787 * @param string $to - reception email.
788 * @param string $subject - subject of email.
789 * @param string $message - message of email.
790 * @param string $headers - header of email.
791 * @param array $attachments - attachments.
792 */
793 static function wp_mail_native( $to, $subject, $message, $headers = '', $attachments = array() ) {
794 $result = require self::$plugin_dir . '/inc/function.wp_mail.php';
795 return $result;
796 }
797
798 /**
799 * To send the transactional email via Sendinblue
800 * hook wp_mail
801 *
802 * @param string $to - reception email.
803 * @param string $subject - subject of email.
804 * @param string $message - message of email.
805 * @param string $headers - header of email.
806 * @param array $attachments - attachments
807 * @param array $tags - tag.
808 * @param string $from_name - sender name.
809 * @param string $from_email - sender email.
810 * @return mixed|WP_Error
811 */
812 static function sib_email( $to, $subject, $message, $headers = '', $attachments = array(), $tags = array(), $from_name = '', $from_email = '' ) {
813 $data = [];
814 // Compact the input, apply the filters, and extract them back out.
815 extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );
816
817 if ( ! is_array( $attachments ) ) {
818 $attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
819 }
820
821 // From email and name.
822 $home_settings = get_option( SIB_Manager::HOME_OPTION_NAME );
823 if ( isset( $home_settings['sender'] ) ) {
824 $from_name = $home_settings['from_name'];
825 $from_email = $home_settings['from_email'];
826 } else {
827 $from_email = trim( get_bloginfo( 'admin_email' ) );
828 $from_name = trim( get_bloginfo( 'name' ) );
829 }
830 $from_email = apply_filters( 'wp_mail_from', $from_email );
831 $from_name = apply_filters( 'wp_mail_from_name', $from_name );
832
833 if ( !empty( $headers ) ) {
834 $data['headers'] = $headers;
835 if ( ! is_array( $headers ) ) {
836 // Explode the headers out, so this function can take both.
837 // string headers and an array of headers.
838 $tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) );
839 } else {
840 $tempheaders = $headers;
841 }
842 $headers = array();
843 $bcc = array();
844 // If it's actually got contents.
845 if ( ! empty( $tempheaders ) ) {
846 // Iterate through the raw headers.
847 foreach ( (array) $tempheaders as $header ) {
848 if ( strpos( $header, ':' ) === false ) {
849 if ( false !== stripos( $header, 'boundary=' ) ) {
850 $parts = preg_split( '/boundary=/i', trim( $header ) );
851 $boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
852 }
853 continue;
854 }
855 // Explode them out.
856 list($name, $content) = explode( ':', trim( $header ), 2 );
857
858 // Cleanup crew.
859 $name = trim( $name );
860 $content = trim( $content );
861
862 switch ( strtolower( $name ) ) {
863 case 'content-type':
864 $headers[ trim( $name ) ] = trim( $content );
865 break;
866 case 'x-mailin-tag':
867 $headers[ trim( $name ) ] = trim( $content );
868 break;
869 case 'from':
870 if ( strpos( $content, '<' ) !== false ) {
871 // So... making my life hard again?
872 $from_name = substr( $content, 0, strpos( $content, '<' ) - 1 );
873 $from_name = str_replace( '"', '', $from_name );
874 $from_name = trim( $from_name );
875
876 $from_email = substr( $content, strpos( $content, '<' ) + 1 );
877 $from_email = str_replace( '>', '', $from_email );
878 $from_email = trim( $from_email );
879 } else {
880 $from_name = '';
881 $from_email = trim( $content );
882 }
883 break;
884
885 case 'bcc':
886 if ( strpos( $content, '<') !== false )
887 {
888 $bcc_content = substr( $content, strpos( $content, '<' ) + 1 );
889 $bcc_content = str_replace( '>', '', $bcc_content );
890 $bcc[ trim( $bcc_content ) ] = '';
891 } else {
892
893 if (!empty(trim( $content ))) {
894 $data['bcc'] = ['email' => trim( $content )];
895 }
896 }
897 break;
898 case 'cc':
899 if ( strpos( $content, '<') !== false )
900 {
901 $cc_content = substr( $content, strpos( $content, '<' ) + 1 );
902 $cc_content = str_replace( '>', '', $cc_content );
903 if (!empty(trim( $cc_content ))) {
904 $data['cc'] = ['email' => trim( $cc_content )];
905 }
906 }
907 break;
908 case 'reply-to':
909 if ( strpos( $content, '<') !== false )
910 {
911 $reply_content = substr( $content, strpos( $content, '<' ) + 1 );
912 $reply_content = str_replace( '>', '', $reply_content );
913 $reply = trim( $reply_content );
914 } else {
915 $reply = trim( $content );
916 }
917
918 if (!empty($reply)) {
919 $data['replyTo'] = ['email' => trim( $reply )];
920 }
921 break;
922 default:
923 break;
924 }
925 }
926 }
927 }
928
929 // Set destination addresses.
930 if ( ! is_array( $to ) ) {
931 $to = explode( ',', preg_replace( '/\s+/', '', $to ) ); // strip all whitespace.
932 }
933
934 $processed_to = array();
935 foreach ( $to as $email ) {
936 if ( is_array( $email ) ) {
937 $processed_to[] = $email;
938 } else {
939 $processed_to[] = ['email' => $email];
940 }
941 }
942 $data['to'] = $processed_to;
943
944
945 // Attachments.
946 $attachment_content = array();
947 if ( ! empty( $attachments ) ) {
948 foreach ( $attachments as $attachment ) {
949 $content = self::getAttachmentStruct( $attachment );
950 if ( ! is_wp_error( $content ) ) {
951 $attachment_content = array_merge( $attachment_content, $content );
952 }
953 }
954 $data['attachment'] = $attachment_content;
955 }
956
957 // Common transformations for the HTML part.
958 // If it is text/plain, New line break found.
959 if ( strpos( $message, '</table>' ) === false && strpos( $message, '</div>' ) === false ) {
960 if ( strpos( $message, "\n" ) !== false ) {
961 if ( is_array( $message ) ) {
962 foreach ( $message as &$value ) {
963 $value['content'] = preg_replace( '#<(https?://[^*]+)>#', '$1', $value['content'] );
964 $value['content'] = nl2br( $value['content'] );
965 }
966 } else {
967 $message = preg_replace( '#<(https?://[^*]+)>#', '$1', $message );
968 $message = nl2br( $message );
969 }
970 }
971 }
972 // Sending...
973 $data['sender'] = ['email' => $from_email, 'name' => $from_name ];
974 $data['subject'] = $subject;
975 $data['htmlContent'] = $message;
976
977 try {
978 $sent = SIB_API_Manager::send_email( $data );
979 return $sent;
980 } catch ( Exception $e ) {
981 return new WP_Error( $e->getMessage() );
982 }
983 }
984
985 /**
986 * @param string $path - attachment file path
987 * @return array|WP_Error
988 */
989 static function getAttachmentStruct( $path ) {
990
991 $struct = array();
992
993 try {
994
995 if ( ! @is_file( $path ) ) {
996 throw new Exception( $path . ' is not a valid file.' );
997 }
998
999 $filename = basename( $path );
1000
1001 if ( ! function_exists( 'get_magic_quotes' ) ) {
1002 /**
1003 * @return bool
1004 */
1005 function get_magic_quotes() {
1006 return false;
1007 }
1008 }
1009 if ( ! function_exists( 'set_magic_quotes' ) ) {
1010 /**
1011 * @param $value
1012 * @return bool
1013 */
1014 function set_magic_quotes( $value ) {
1015 return true;
1016 }
1017 }
1018
1019 $isMagicQuotesSupported = version_compare( PHP_VERSION, '5.3.0', '<' )
1020 && function_exists( 'get_magic_quotes_runtime' )
1021 && function_exists( 'set_magic_quotes_runtime' );
1022
1023 if ( $isMagicQuotesSupported ) {
1024 // Escape linters check.
1025 $getMagicQuotesRuntimeFunc = 'get_magic_quotes_runtime';
1026 $setMagicQuotesRuntimeFunc = 'set_magic_quotes_runtime';
1027
1028 // Save magic quotes value.
1029 $magicQuotes = $getMagicQuotesRuntimeFunc();
1030 $setMagicQuotesRuntimeFunc (0);
1031 }
1032
1033 $file_buffer = file_get_contents( $path );
1034 $file_buffer = chunk_split( base64_encode( $file_buffer ), 76, "\n" );
1035
1036 if ( $isMagicQuotesSupported ) {
1037 // Restore magic quotes value.
1038 $setMagicQuotesRuntimeFunc($magicQuotes);
1039 }
1040
1041 $struct[ $filename ] = $file_buffer;
1042
1043 } catch ( Exception $e ) {
1044 return new WP_Error( 'Error creating the attachment structure: ' . $e->getMessage() );
1045 }
1046
1047 return $struct;
1048 }
1049
1050 /**
1051 * Create custom page for form preview
1052 *
1053 * @param array $query_vars - query.
1054 * @return array
1055 */
1056 function sib_query_vars( $query_vars ) {
1057 $query_vars[] = 'sib_form';
1058 return $query_vars;
1059 }
1060
1061 /**
1062 * Parse request
1063 *
1064 * @param mixed $wp - object.
1065 */
1066 function sib_parse_request( &$wp ) {
1067 if ( array_key_exists( 'sib_form', $wp->query_vars ) ) {
1068 include 'inc/sib-form-preview.php';
1069 exit();
1070 }
1071 }
1072
1073 /**
1074 * Load Text domain.
1075 */
1076 static function LoadTextDomain() {
1077 // Load lang file.
1078 $i18n_file_name = 'sib_lang';
1079 $locale = apply_filters( 'plugin_locale', get_locale(), $i18n_file_name );
1080 // $locale = 'fr_FR';
1081 $filename = plugin_dir_path( __FILE__ ) . '/lang/' . $i18n_file_name . '-' . $locale . '.mo';
1082 load_textdomain( 'sib_lang', $filename );
1083 }
1084
1085 /**
1086 * Notice the language is difference than site's language
1087 */
1088 static function language_admin_notice() {
1089 if ( ! get_option( SIB_Manager::LANGUAGE_OPTION_NAME ) ) {
1090 $lang_prefix = substr( get_bloginfo( 'language' ), 0, 2 );
1091 $lang = self::getLanguageName( $lang_prefix );
1092 $class = 'error';
1093 $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 );
1094 if ( 'en' !== $lang_prefix && 'fr' !== $lang_prefix ) {
1095 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>" );
1096 }
1097 }
1098 }
1099
1100 /**
1101 * Notice wp_mail is not possible
1102 */
1103 static function wpMailNotices() {
1104 if ( self::$wp_mail_conflict ) {
1105 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>' );
1106 }
1107 }
1108
1109 /**
1110 * Names of languages.
1111 *
1112 * @param string $prefix - language.
1113 * @return mixed
1114 */
1115 public static function getLanguageName( $prefix = 'en' ) {
1116 $lang = array();
1117 $lang['de'] = 'Deutsch';
1118 $lang['en'] = 'English';
1119 $lang['zh'] = '中文';
1120 $lang['ru'] = 'Русский';
1121 $lang['fi'] = 'suomi';
1122 $lang['fr'] = 'Français';
1123 $lang['nl'] = 'Nederlands';
1124 $lang['sv'] = 'Svenska';
1125 $lang['it'] = 'Italiano';
1126 $lang['ro'] = 'Română';
1127 $lang['hu'] = 'Magyar';
1128 $lang['ja'] = '日本語';
1129 $lang['es'] = 'Español';
1130 $lang['vi'] = 'Tiếng Việt';
1131 $lang['ar'] = 'العربية';
1132 $lang['pt'] = 'Português';
1133 $lang['pb'] = 'Português do Brasil';
1134 $lang['pl'] = 'Polski';
1135 $lang['gl'] = 'galego';
1136 $lang['tr'] = 'Turkish';
1137 $lang['et'] = 'Eesti';
1138 $lang['hr'] = 'Hrvatski';
1139 $lang['eu'] = 'Euskera';
1140 $lang['el'] = 'Ελληνικά';
1141 $lang['ua'] = 'Українська';
1142 $lang['ko'] = '한국어';
1143
1144 return $lang[ $prefix ];
1145 }
1146
1147 /**
1148 * Create language sidebar for wpml plugin.
1149 */
1150 public function sib_create_language_sidebar() {
1151 $languages = apply_filters( 'wpml_active_languages', array() );
1152 $page = isset( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
1153 $action = isset( $_GET['action'] ) ? sanitize_text_field( $_GET['action'] ) : '';
1154 $frmID = isset( $_GET['id'] ) ? sanitize_text_field( $_GET['id'] ) : '';
1155 $pID = isset( $_GET['pid'] ) ? sanitize_text_field( $_GET['pid'] ) : '';
1156 $parent = true;
1157 if ( '' !== $frmID && '' !== $pID ) {
1158 $lang = SIB_Forms_Lang::get_lang( $frmID, $pID );
1159 $parent = false;
1160 } else {
1161 $lang = ICL_LANGUAGE_CODE;
1162 if ( '' !== $frmID && '' === $pID ) {
1163 $pID = $frmID;
1164
1165 }
1166 }
1167
1168 if ( 'sib_page_form' === $page && 'edit' === $action ) {
1169 ?>
1170 <div class="panel panel-default text-left box-border-box sib-small-content">
1171 <div class="panel-heading"><strong><?php esc_attr_e( 'About Sendinblue', 'sib_lang' ); ?></strong></div>
1172 <div class="panel-body">
1173 <p>
1174 <label for='sib_form_language'><?php esc_attr_e( 'Language of this form:', 'sib_lang' ); ?> </label>
1175 <select id="sib_form_lang" name="sib_form_lang" data-selected="">
1176 <?php
1177 foreach ( $languages as $language ) {
1178 $selected = ($language['code'] == $lang) ? 'selected' : '';
1179 if ( $language['code'] == $lang && true === $parent ) {
1180 $option_text = '<option value="" ' . $selected . '>' . $language['native_name'] . '</option>';
1181 } else {
1182 $exist = SIB_Forms_Lang::get_form_ID( $pID, $language['language_code'] );
1183
1184 if ( null === $exist ) {
1185 continue;
1186 } else {
1187 $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'] );
1188 }
1189 }
1190 echo $option_text ;
1191 }
1192 ?>
1193 </select>
1194 </p>
1195 <div class="sib_form_translate">
1196 <p>
1197 <label><?php esc_attr_e( 'Translate this form', 'sib_lang' ); ?></label>
1198 </p>
1199 <table width="100%" class="sib_form_trans_table" style="border: 1px solid #8cceea;">
1200 <tr>
1201 <?php
1202 foreach ( $languages as $language ) {
1203 if ( $language['code'] == $lang ) {
1204 continue;
1205 }
1206 ?>
1207 <th style="text-align: center;"><img
1208 src="<?php echo esc_url( $language['country_flag_url'] ); ?>"></th>
1209 <?php
1210 }
1211 ?>
1212 </tr>
1213 <tr style="background-color: #EFF8FC;">
1214 <?php
1215 foreach ( $languages as $language ) {
1216 if ( $language['code'] == $lang ) {
1217 continue;
1218 }
1219 if ( '' === $pID ) {
1220 $img_src = plugins_url( 'img/add_translation_disabled.png', __FILE__ );
1221 $td = '<img src="' . $img_src . '" style="margin:2px;">';
1222 } else {
1223 $exist = SIB_Forms_Lang::get_form_ID( $pID, $language['language_code'] );
1224
1225 if ( null === $exist ) {
1226 $img_src = plugins_url( 'img/add_translation.png', __FILE__ );
1227
1228 $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'] );
1229 $td = $href . '<img src="' . $img_src . '" style="margin:2px;"></a>';
1230 } else {
1231 $img_src = plugins_url( 'img/edit_translation.png', __FILE__ );
1232 $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'] );
1233 $td = $href . '<img src="' . $img_src . '" style="margin:2px;"></a>';
1234 }
1235 }
1236 ?>
1237 <td style="text-align: center;"><?php echo $td; ?></td>
1238 <?php
1239 }
1240 ?>
1241 </tr>
1242 </table>
1243 </div>
1244 <?php if ( isset( $_GET['pid'] ) ) { ?>
1245 <div class="sib-form-duplicate">
1246 <button class="btn btn-default sib-duplicate-btn"><?php esc_attr_e( 'Copy content from origin form', 'sib_lang' ); ?></button>
1247 <span class="sib-spin"><i
1248 class="fa fa-circle-o-notch fa-spin fa-lg"></i>&nbsp;&nbsp;</span>
1249 <i title="<?php echo esc_attr_e( 'Copy content from origin form', 'sib_lang' ); ?>"
1250 data-container="body" data-toggle="popover" data-placement="left"
1251 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' ); ?>"
1252 data-html="true" class="fa fa-question-circle popover-help-form"></i>
1253 </div>
1254 <?php } ?>
1255 </div>
1256 </div>
1257 <?php
1258 }
1259 }
1260
1261 public function ajax_get_country_prefix() {
1262 check_ajax_referer( 'sib_front_ajax_nonce', 'security' );
1263 $sms_manager = new SIB_SMS_Code();
1264 $country_list = $sms_manager->get_sms_code_list();
1265 $country_list_html = '';
1266 foreach ( $country_list as $item => $value ) {
1267 $flg_url = plugins_url( 'img/flags/', __FILE__ ).strtolower($item).'.png';
1268 $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>';
1269 $country_list_html .= $item_html;
1270 }
1271 wp_send_json($country_list_html);
1272 }
1273 }
1274
1275 add_action( 'sendinblue_init', 'sendinblue_init' );
1276 add_filter( 'widget_text', 'do_shortcode' );
1277
1278 /**
1279 * Plugin entry point Process.
1280 */
1281 function sendinblue_init() {
1282 SIB_Manager::LoadTextDomain();
1283 new SIB_Manager();
1284 }
1285
1286 do_action( 'sendinblue_init' );
1287 }
1288