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