Files
torebki-fabiola.pl/wp-content/plugins/email-subscribers/lite/includes/classes/class-es-admin-settings.php
2026-03-05 13:07:40 +01:00

1319 lines
56 KiB
PHP

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* The admin-specific functionality of the plugin.
*
* Admin Settings
*
* @package Email_Subscribers
* @subpackage Email_Subscribers/admin
*/
class ES_Admin_Settings {
public static $instance;
public $subscribers_obj;
public function __construct() {
add_filter( 'ig_es_registered_email_sending_settings', array( $this, 'show_cron_info' ) );
// Start-IG-Code.
// Add setting for plugin usage tracking
add_filter( 'ig_es_registered_settings', array( $this, 'show_usage_tracking_optin_setting' ), 30 );
// End-IG-Code.
}
public function es_settings_callback() {
$submitted = ig_es_get_request_data( 'submitted' );
$submit_action = ig_es_get_request_data( 'submit_action' );
if ( 'submitted' === $submitted && 'ig-es-save-admin-settings' === $submit_action ) {
$nonce = ig_es_get_request_data( 'update-settings' );
if ( ! wp_verify_nonce( $nonce, 'update-settings' ) ) {
$message = __( 'You do not have permission to update settings', 'email-subscribers' );
ES_Common::show_message( $message, 'error' );
} else {
$options = ig_es_get_data( $_POST );
$options = apply_filters( 'ig_es_before_save_settings', $options );
$options['ig_es_disable_wp_cron'] = isset( $options['ig_es_disable_wp_cron'] ) ? $options['ig_es_disable_wp_cron'] : 'no';
$options['ig_es_ess_opted_for_sending_service'] = isset( $options['ig_es_ess_opted_for_sending_service'] ) ? $options['ig_es_ess_opted_for_sending_service'] : 'no';
$options['ig_es_ess_branding_enabled'] = isset( $options['ig_es_ess_branding_enabled'] ) ? $options['ig_es_ess_branding_enabled'] : 'no';
$options['ig_es_track_email_opens'] = isset( $options['ig_es_track_email_opens'] ) ? $options['ig_es_track_email_opens'] : 'no';
$options['ig_es_enable_ajax_form_submission'] = isset( $options['ig_es_enable_ajax_form_submission'] ) ? $options['ig_es_enable_ajax_form_submission'] : 'no';
$options['ig_es_enable_welcome_email'] = isset( $options['ig_es_enable_welcome_email'] ) ? $options['ig_es_enable_welcome_email'] : 'no';
$options['ig_es_notify_admin'] = isset( $options['ig_es_notify_admin'] ) ? $options['ig_es_notify_admin'] : 'no';
$options['ig_es_enable_cron_admin_email'] = isset( $options['ig_es_enable_cron_admin_email'] ) ? $options['ig_es_enable_cron_admin_email'] : 'no';
$options['ig_es_delete_plugin_data'] = isset( $options['ig_es_delete_plugin_data'] ) ? $options['ig_es_delete_plugin_data'] : 'no';
$options['ig_es_run_cron_on'] = isset( $options['ig_es_run_cron_on'] ) ? $options['ig_es_run_cron_on'] : 'monday';
$options['ig_es_run_cron_time'] = isset( $options['ig_es_run_cron_time'] ) ? $options['ig_es_run_cron_time'] : '4pm';
$options['ig_es_allow_api'] = isset( $options['ig_es_allow_api'] ) ? $options['ig_es_allow_api'] : 'no';
// Start-IG-Code.
// Show option to enable/disable tracking if user isn't a premium user and trial is not valid i.e. has expired.
if ( ! ES()->is_premium() && ! ES()->trial->is_trial_valid() ) {
$options['ig_es_allow_tracking'] = isset( $options['ig_es_allow_tracking'] ) ? $options['ig_es_allow_tracking'] : 'no';
}
$options['ig_es_powered_by'] = isset( $options['ig_es_powered_by'] ) ? $options['ig_es_powered_by'] : 'no';
// End-IG-Code.
$text_fields_to_sanitize = array(
'ig_es_from_name',
'ig_es_admin_emails',
'ig_es_email_type',
'ig_es_optin_type',
'ig_es_post_image_size',
'ig_es_track_email_opens',
'ig_es_enable_ajax_form_submission',
'ig_es_enable_welcome_email',
'ig_es_welcome_email_subject',
'ig_es_confirmation_mail_subject',
'ig_es_notify_admin',
'ig_es_admin_new_contact_email_subject',
'ig_es_enable_cron_admin_email',
'ig_es_cron_admin_email_subject',
'ig_es_cronurl',
'ig_es_hourly_email_send_limit',
'ig_es_disable_wp_cron',
'ig_es_allow_api',
);
$textarea_fields_to_sanitize = array(
'ig_es_unsubscribe_link_content',
'ig_es_subscription_success_message',
'ig_es_subscription_error_messsage',
'ig_es_unsubscribe_success_message',
'ig_es_unsubscribe_error_message',
'ig_es_welcome_email_content',
'ig_es_confirmation_mail_content',
'ig_es_admin_new_contact_email_content',
'ig_es_cron_admin_email',
'ig_es_blocked_domains',
'ig_es_form_submission_success_message',
);
$email_fields_to_sanitize = array(
'ig_es_from_email',
);
foreach ( $options as $key => $value ) {
if ( substr( $key, 0, 6 ) === 'ig_es_' ) {
$value = stripslashes_deep( $value );
if ( in_array( $key, $text_fields_to_sanitize, true ) ) {
$value = sanitize_text_field( $value );
} elseif ( in_array( $key, $textarea_fields_to_sanitize, true ) ) {
$value = wp_kses_post( $value );
} elseif ( in_array( $key, $email_fields_to_sanitize, true ) ) {
$value = sanitize_email( $value );
}
update_option( $key, wp_unslash( $value ), false );
}
}
do_action( 'ig_es_after_settings_save', $options );
$message = __( 'Settings saved successfully!' );
$status = 'success';
ES_Common::show_message( $message, $status );
}
}
$allowedtags = ig_es_allowed_html_tags_in_esc();
?>
<div class="wrap pt-4 font-sans">
<span>
<h2 class="wp-heading-inline text-3xl font-bold leading-9 text-gray-700 sm:truncate pb-1"><?php esc_html_e( 'Settings', 'email-subscribers' ); ?></h2>
</span>
</header>
</span>
<div><hr class="wp-header-end"></div>
<form action="" method="post" id="email_tabs_form" class="sticky bg-white rounded-lg shadow">
<div class="flex flex-wrap mt-7">
<?php
settings_fields( 'email_subscribers_settings' );
$es_settings_tabs = array(
'general' => array(
'icon' => '<svg class="w-6 h-6 inline -mt-1" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>',
'name' => __( 'General', 'email-subscribers' ),
),
'email_sending' => array(
'icon' => '<svg class="w-6 h-6 inline -mt-1" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path></svg>',
'name' => __( 'Email Sending', 'email-subscribers' ),
),
'security_settings' => array(
'icon' => '<svg class="w-6 h-6 inline -mt-1.5" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>',
'name' => __( 'Security', 'email-subscribers' ),
),
);
if ( ES_Common::is_rest_api_supported() ) {
$es_settings_tabs['rest_api_settings'] = array(
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6 inline -mt-1.5" style="stroke-width:2">
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 16.875h3.375m0 0h3.375m-3.375 0V13.5m0 3.375v3.375M6 10.5h2.25a2.25 2.25 0 002.25-2.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v2.25A2.25 2.25 0 006 10.5zm0 9.75h2.25A2.25 2.25 0 0010.5 18v-2.25a2.25 2.25 0 00-2.25-2.25H6a2.25 2.25 0 00-2.25 2.25V18A2.25 2.25 0 006 20.25zm9.75-9.75H18a2.25 2.25 0 002.25-2.25V6A2.25 2.25 0 0018 3.75h-2.25A2.25 2.25 0 0013.5 6v2.25a2.25 2.25 0 002.25 2.25z" />
</svg>',
'name' => __( 'API', 'email-subscribers' ),
);
}
$es_settings_tabs = apply_filters( 'ig_es_settings_tabs', $es_settings_tabs );
?>
<div id="es-settings-menu" class="w-1/5 pt-4 leading-normal text-gray-800 border-r border-gray-100">
<div class="z-20 my-2 mt-0 bg-white shadow es-menu-list lg:block lg:my-0 lg:border-transparent lg:shadow-none lg:bg-transparent" style="top:6em;" id="menu-content">
<ul id="menu-nav" class="py-2 list-reset md:py-0">
<?php
foreach ( $es_settings_tabs as $key => $value ) {
?>
<li id="menu-content" class="h-10 py-1 mx-2 border border-transparent rounded settings-menu-change md:my-2 hover:rounded-lg hover:border-gray-200">
<a href="#tabs-<?php echo esc_attr( $key ); ?>" id="menu-content-change" class="block px-4 pt-1 text-base font-medium text-gray-600 no-underline align-middle hover:text-gray-800"><?php echo wp_kses( $value['icon'], $allowedtags ); ?>&nbsp;<span class="pl-0.5"><?php echo esc_html( $value['name'] ); ?></span></a></li>
<?php
}
?>
</ul>
</div>
</div>
<div class="w-4/5" id="es-menu-tab-content">
<?php
$settings = self::get_registered_settings();
foreach ( $settings as $key => $value ) {
?>
<div id="tabs-<?php echo esc_attr( $key ); ?>" class="setting-content"><?php $this->render_settings_fields( $value ); ?></div>
<?php
}
?>
</div>
</div>
</form>
</div>
<?php
}
public static function get_from_email_notice( $from_email ) {
$from_email_notice = '';
$from_email = get_option( 'ig_es_from_email' );
$is_popular_domain = ES_Common::is_popular_domain( $from_email );
$from_email_notice_class = $is_popular_domain ? '' : 'hidden';
$from_email_notice .= '<span id="ig-es-from-email-notice" class="text-red-600 ' . $from_email_notice_class . '">' . __( 'Your emails might land in spam if you use above email address..', 'email-subscribers' );
$site_url = site_url();
$site_domain = ES_Common::get_domain_from_url( $site_url );
/* translators: %s: Site domain */
$from_email_notice .= '<br/>' . sprintf( __( 'Consider using email address matching your site domain like %s', 'email-subscribers' ), 'info@' . $site_domain ) . '</span>';
return $from_email_notice;
}
public static function get_registered_settings() {
$from_email_description = __( 'The "from" email address for all emails.', 'email-subscribers' );
$from_email = get_option( 'ig_es_from_email' );
$from_email_description .= '<br/>' . self::get_from_email_notice( $from_email );
$general_settings = array(
'sender_information' => array(
'id' => 'sender_information',
'name' => __( 'Sender', 'email-subscribers' ),
'sub_fields' => array(
'from_name' => array(
'id' => 'ig_es_from_name',
'name' => __( 'Name', 'email-subscribers' ),
'desc' => __( 'The "from" name people will see when they receive emails.', 'email-subscribers' ),
'type' => 'text',
'placeholder' => __( 'Name', 'email-subscribers' ),
'default' => '',
),
'from_email' => array(
'id' => 'ig_es_from_email',
'name' => __( 'Email', 'email-subscribers' ),
'desc' => $from_email_description,
'type' => 'text',
'placeholder' => __( 'Email Address', 'email-subscribers' ),
'default' => '',
),
),
),
'admin_email' => array(
'id' => 'ig_es_admin_emails',
'name' => __( 'Admin emails', 'email-subscribers' ),
'info' => __( 'Who should be notified about system events like "someone subscribed", "campaign sent" etc?', 'email-subscribers' ),
'type' => 'text',
'desc' => __( 'You can enter multiple email addresses - separate them with comma', 'email-subscribers' ),
'default' => '',
),
'ig_es_optin_type' => array(
'id' => 'ig_es_optin_type',
'name' => __( 'Opt-in type', 'email-subscribers' ),
'info' => '',
'desc' => __( 'Single = confirm subscribers as they subscribe.<br> Double = send a confirmation email and require clicking on a link to confirm subscription.', 'email-subscribers' ),
'type' => 'select',
'options' => ES_Common::get_optin_types(),
'default' => '',
),
// Start-IG-Code.
'ig_es_post_image_size' => array(
'id' => 'ig_es_post_image_size',
'name' => __( 'Image size', 'email-subscribers' ),
'info' => __( 'Image to use in Post Notification emails' ),
'type' => 'select',
'options' => ES_Common::get_image_sizes(),
/* translators: %s: Keyword */
'desc' => sprintf( __( '%s keyword will use this image size. Use full size only if your template design needs it. Thumbnail should work well otherwise.', 'email-subscribers' ), '{{POSTIMAGE}}' ),
'default' => 'full',
),
// End-IG-Code.
'ig_es_enable_ajax_form_submission' => array(
'id' => 'ig_es_enable_ajax_form_submission',
'name' => __( 'Enable AJAX subscription form submission', 'email-subscribers' ),
'info' => __( 'Enabling this will let users to submit their subscription form without page reload using AJAX call.', 'email-subscribers' ),
'type' => 'checkbox',
'default' => 'yes',
),
'ig_es_track_email_opens' => array(
'id' => 'ig_es_track_email_opens',
'name' => __( 'Track opens', 'email-subscribers' ),
'info' => __( 'Do you want to track when people view your emails? (We recommend keeping it enabled)', 'email-subscribers' ),
'type' => 'checkbox',
'default' => 'yes',
),
'ig_es_form_submission_success_message' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => '',
'id' => 'ig_es_form_submission_success_message',
'name' => __( 'Subscription success message', 'email-subscribers' ),
'info' => __( 'This message will show when a visitor successfully subscribes using the form.', 'email-subscribers' ),
'desc' => '',
),
'ig_es_unsubscribe_link_content' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => '',
'id' => 'ig_es_unsubscribe_link_content',
'name' => __( 'Unsubscribe text in email footer:', 'email-subscribers' ),
'info' => __( 'All emails will include this text in the footer so people can unsubscribe if they want.', 'email-subscribers' ),
/* translators: %s: List of Keywords */
'desc' => sprintf( __( 'Use %s keyword to add unsubscribe link.', 'email-subscribers' ), '{{UNSUBSCRIBE-LINK}}' ),
),
'subscription_messages' => array(
'id' => 'subscription_messages',
'name' => __( 'Double opt-in subscription messages:', 'email-subscribers' ),
'info' => __( 'Page and messages to show when people click on the link in a subscription confirmation email.', 'email-subscribers' ),
'sub_fields' => array(
'ig_es_subscription_success_message' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => __( 'You have been subscribed successfully!', 'email-subscribers' ),
'id' => 'ig_es_subscription_success_message',
'name' => __( 'Message on successful subscription', 'email-subscribers' ),
'desc' => __( 'Show this message if contact is successfully subscribed from double opt-in (confirmation) email', 'email-subscribers' ),
),
'ig_es_subscription_error_messsage' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => __( 'Oops.. Your request couldn\'t be completed. This email address seems to be already subscribed / blocked.', 'email-subscribers' ),
'id' => 'ig_es_subscription_error_messsage',
'name' => __( 'Message when subscription fails', 'email-subscribers' ),
'desc' => __( 'Show this message if any error occured after clicking confirmation link from double opt-in (confirmation) email.', 'email-subscribers' ),
),
),
),
'unsubscription_messages' => array(
'id' => 'unsubscription_messages',
'name' => __( 'Unsubscribe messages', 'email-subscribers' ),
'info' => __( 'Page and messages to show when people click on the unsubscribe link in an email\'s footer.', 'email-subscribers' ),
'sub_fields' => array(
'ig_es_unsubscribe_success_message' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => __( 'Thank You, You have been successfully unsubscribed. You will no longer hear from us.', 'email-subscribers' ),
'id' => 'ig_es_unsubscribe_success_message',
'name' => __( 'Message on unsubscribe success', 'email-subscribers' ),
'desc' => __( 'Once contact clicks on unsubscribe link, he/she will be redirected to a page where this message will be shown.', 'email-subscribers' ),
),
'ig_es_unsubscribe_error_message' => array(
'type' => 'textarea',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => __( 'Oops.. There was some technical error. Please try again later or contact us.', 'email-subscribers' ),
'id' => 'ig_es_unsubscribe_error_message',
'name' => __( 'Message when unsubscribe fails', 'email-subscribers' ),
'desc' => __( 'Show this message if any error occured after clicking on unsubscribe link.', 'email-subscribers' ),
),
),
),
// Start-IG-Code.
'ig_es_powered_by' => array(
'id' => 'ig_es_powered_by',
'name' => __( 'Share Icegram', 'email-subscribers' ),
'info' => __( 'Show "Powered By" link in the unsubscription form' ),
'type' => 'checkbox',
'default' => 'no',
),
// End-IG-Code.
'ig_es_delete_plugin_data' => array(
'id' => 'ig_es_delete_plugin_data',
'name' => __( 'Delete plugin data on uninstall', 'email-subscribers' ),
'info' => __( 'Be careful with this! When enabled, it will remove all lists, campaigns and other data if you uninstall the plugin.', 'email-subscribers' ),
'type' => 'checkbox',
'default' => 'no',
),
);
$general_settings = apply_filters( 'ig_es_registered_general_settings', $general_settings );
$signup_confirmation_settings = array(
'worflow_migration_notice' => array(
'id' => 'worflow_migration_notice',
'type' => 'html',
'html' => self::get_workflow_migration_notice_html(),
),
);
$signup_confirmation_settings = apply_filters( 'ig_es_registered_signup_confirmation_settings', $signup_confirmation_settings );
if ( ES()->trial->is_trial_valid() || ES()->is_premium() ) {
$gmt_offset = ig_es_get_gmt_offset( true );
$icegram_cron_last_hit_timestamp = get_option( 'ig_es_cron_last_hit' );
$icegram_cron_last_hit_message = '';
if ( !empty( $icegram_cron_last_hit_timestamp['icegram_timestamp'] ) ) {
$icegram_timestamp_with_gmt_offset = $icegram_cron_last_hit_timestamp['icegram_timestamp'] + $gmt_offset;
$icegram_cron_last_hit_date_and_time = ES_Common::convert_timestamp_to_date( $icegram_timestamp_with_gmt_offset );
$icegram_cron_last_hit_message = __( '<br><span class="ml-6">Cron last hit time : <b>' . $icegram_cron_last_hit_date_and_time . '</b></span>', 'email-subscribers' );
}
}
$cron_url_setting_desc = '';
if ( ES()->trial->is_trial_valid() || ES()->is_premium() ) {
$cron_url_setting_desc = __( '<span class="es-send-success es-icon"></span> We will take care of it. You don\'t need to visit this URL manually.' . $icegram_cron_last_hit_message, 'email-subscribers' );
} else {
/* translators: %s: Link to Icegram documentation */
$cron_url_setting_desc = sprintf( __( "You need to visit this URL to send email notifications. Know <a href='%s' target='_blank'>how to run this in background</a>", 'email-subscribers' ), 'https://www.icegram.com/documentation/es-how-to-schedule-cron-emails-in-cpanel/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page' );
}
$cron_url_setting_desc .= '<div class="mt-2.5 ml-1"><a class="hover:underline text-sm font-medium" href=" ' . esc_url( 'https://www.icegram.com/documentation/how-to-configure-email-sending-in-email-subscribers?utm_source=in_app&utm_medium=setup_email_sending&utm_campaign=es_doc' ) . '" target="_blank">' . esc_html__( 'How to configure Email Sending', 'email-subscribers' ) . '→</a></div>';
$pepipost_api_key_defined = ES()->is_const_defined( 'pepipost', 'api_key' );
$test_email = ES_Common::get_admin_email();
$total_emails_sent = ES_Common::count_sent_emails();
$account_url = ES()->mailer->get_current_mailer_account_url();
$email_sending_settings = array(
'ig_es_cronurl' => array(
'type' => 'text',
'placeholder' => '',
'supplemental' => '',
'default' => '',
'readonly' => 'readonly',
'id' => 'ig_es_cronurl',
'name' => __( 'Cron URL', 'email-subscribers' ),
'desc' => $cron_url_setting_desc,
),
'ig_es_disable_wp_cron' => array(
'type' => 'checkbox',
'placeholder' => '',
'supplemental' => '',
'default' => 'no',
'id' => 'ig_es_disable_wp_cron',
'name' => __( 'Disable Wordpress Cron', 'email-subscribers' ),
'info' => __( 'Enable this option if you do not want Icegram Express to use WP Cron to send emails.', 'email-subscribers' ),
),
'ig_es_cron_interval' => array(
'id' => 'ig_es_cron_interval',
'name' => __( 'Send emails at most every', 'email-subscribers' ),
'type' => 'select',
'options' => ES()->cron->cron_intervals(),
'desc' => __( 'Optional if a real cron service is used', 'email-subscribers' ),
'default' => IG_ES_CRON_INTERVAL,
),
'ig_es_hourly_email_send_limit' => array(
'type' => 'number',
'placeholder' => '',
'supplemental' => '',
'default' => 50,
'id' => 'ig_es_hourly_email_send_limit',
'name' => __( 'Maximum emails to send in an hour', 'email-subscribers' ),
/* translators: 1. Break tag 2. ESP Account url with anchor tag 3. ESP name 4. Closing anchor tag */
'desc' => __( 'Total emails sent in current hour: <b>' . $total_emails_sent . '</b>' , 'email-subscribers' ) . ( $account_url ? sprintf( __( '%1$sCheck sending limit from your %2$s%3$s\'s account%4$s.', 'email-subscribers' ), '<br/>', '<a href="' . esc_url( $account_url ) . '" target="_blank">', ES()->mailer->get_current_mailer_name(), '</a>' ) : '' ),
),
'ig_es_max_email_send_at_once' => array(
'type' => 'number',
'placeholder' => '',
'supplemental' => '',
'default' => IG_ES_MAX_EMAIL_SEND_AT_ONCE,
'id' => 'ig_es_max_email_send_at_once',
'name' => __( 'Maximum emails to send at once', 'email-subscribers' ),
'desc' => __( 'Maximum emails you want to send on every cron request.', 'email-subscribers' ),
),
'ig_es_test_send_email' => array(
'type' => 'html',
'html' => self::get_test_send_email_html( $test_email ),
'placeholder' => '',
'supplemental' => '',
'default' => '',
'id' => 'ig_es_test_send_email',
'name' => __( 'Send test email', 'email-subscribers' ),
'desc' => __( 'Enter email address to send test email.', 'email-subscribers' ),
),
'ig_es_mailer_settings' => array(
'type' => 'html',
'sub_fields' => array(
'mailer' => array(
'id' => 'ig_es_mailer_settings[mailer]',
'name' => __( 'Select Mailer', 'email-subscribers' ),
'type' => 'html',
'html' => self::mailers_html(),
'desc' => '',
),
'ig_es_pepipost_api_key' => array(
'type' => $pepipost_api_key_defined ? 'text' : 'password',
'options' => false,
'placeholder' => '',
'supplemental' => '',
'default' => '',
'id' => 'ig_es_mailer_settings[pepipost][api_key]',
'name' => __( 'Pepipost API key', 'email-subscribers' ),
'desc' => $pepipost_api_key_defined ? ES()->get_const_set_message( 'pepipost', 'api_key' ) : '',
'class' => 'pepipost',
'disabled' => $pepipost_api_key_defined ? 'disabled' : '',
'value' => $pepipost_api_key_defined ? '******************' : '',
),
'ig_es_pepipost_docblock' => array(
'type' => 'html',
'html' => self::pepipost_doc_block(),
'id' => 'ig_es_pepipost_docblock',
'name' => '',
),
),
'placeholder' => '',
'supplemental' => '',
'default' => '',
'id' => 'ig_es_mailer_settings',
'name' => __( 'Email Sender', 'email-subscribers' ),
'info' => '',
),
);
$email_sending_settings = apply_filters( 'ig_es_registered_email_sending_settings', $email_sending_settings );
$security_settings = array(
'blocked_domains' => array(
'id' => 'ig_es_blocked_domains',
'name' => __( 'Blocked domain(s)', 'email-subscribers' ),
'type' => 'textarea',
'info' => __( 'Seeing spam signups from particular domains? Enter domains names (one per line) that you want to block here.', 'email-subscribers' ),
'default' => '',
'rows' => 3,
),
);
$security_settings = apply_filters( 'ig_es_registered_security_settings', $security_settings );
$es_settings = array(
'general' => $general_settings,
'signup_confirmation' => $signup_confirmation_settings,
'email_sending' => $email_sending_settings,
'security_settings' => $security_settings,
);
if ( ES_Common::is_rest_api_supported() ) {
$rest_api_endpoint = get_rest_url( null, 'email-subscribers/v1/subscribers' );
$rest_api_settings = array(
'allow_api' => array(
'id' => 'ig_es_allow_api',
'name' => __( 'Enable API', 'email-subscribers' ),
'info' => __( 'Enable API to add/edit/delete subscribers through third-party sites or apps.', 'email-subscribers' ),
'type' => 'checkbox',
'default' => 'no',
/* translators: REST API endpoint */
'desc' => sprintf( __( 'URL endpoint: %s', 'email-subscribers'), '<code class="es-code">' . $rest_api_endpoint . '</code>' )
),
'api_key_access_section' => array(
'id' => 'ig_es_api_keys_section',
'name' => __( 'API Keys', 'email-subscribers' ),
'type' => 'html',
'html' => self::render_rest_api_keys_section(),
),
);
$es_settings['rest_api_settings'] = $rest_api_settings;
}
return apply_filters( 'ig_es_registered_settings', $es_settings );
}
public function field_callback( $arguments, $id_key = '' ) {
$field_html = '';
if ( 'ig_es_cronurl' === $arguments['id'] ) {
$value = ES()->cron->url();
} else {
if ( ! empty( $arguments['option_value'] ) ) {
preg_match( '(\[.*$)', $arguments['id'], $m );
$n = explode( '][', $m[0] );
$n = str_replace( '[', '', $n );
$n = str_replace( ']', '', $n );
$count = count( $n );
$id = '';
foreach ( $n as $key => $val ) {
if ( '' == $id ) {
$id = ! empty( $arguments['option_value'][ $val ] ) ? $arguments['option_value'][ $val ] : '';
} else {
$id = ! empty( $id[ $val ] ) ? $id[ $val ] : '';
}
}
$value = $id;
} else {
$value = get_option( $arguments['id'] ); // Get the current value, if there is one
}
}
if ( ! $value ) { // If no value exists
$value = ! empty( $arguments['default'] ) ? $arguments['default'] : ''; // Set to our default
}
$uid = ! empty( $arguments['id'] ) ? $arguments['id'] : '';
$type = ! empty( $arguments['type'] ) ? $arguments['type'] : '';
$placeholder = ! empty( $arguments['placeholder'] ) ? $arguments['placeholder'] : '';
$readonly = ! empty( $arguments['readonly'] ) ? $arguments['readonly'] : '';
$html = ! empty( $arguments['html'] ) ? $arguments['html'] : '';
$id_key = ! empty( $id_key ) ? $id_key : $uid;
$class = ! empty( $arguments['class'] ) ? $arguments['class'] : '';
$rows = ! empty( $arguments['rows'] ) ? $arguments['rows'] : 8;
$disabled = ! empty( $arguments['disabled'] ) ? 'disabled="' . $arguments['disabled'] . '"' : '';
$value = ! empty( $arguments['value'] ) ? $arguments['value'] : $value;
// Check which type of field we want
switch ( $arguments['type'] ) {
case 'text': // If it is a text field
$field_html = sprintf( '<input name="%1$s" id="%2$s" placeholder="%4$s" value="%5$s" %6$s class="%7$s form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5" %8$s/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class, $disabled );
break;
case 'password': // If it is a text field
$field_html = sprintf( '<input name="%1$s" id="%2$s" type="%3$s" placeholder="%4$s" value="%5$s" %6$s class="form-input h-9 mt-2 mb-1 text-sm border-gray-400 w-3/5 %7$s" %8$s/>', $uid, $id_key, $type, $placeholder, $value, $readonly, $class, $disabled );
break;
case 'number': // If it is a number field
$field_html = sprintf( '<input name="%1$s" id="%1$s" type="%2$s" placeholder="%3$s" value="%4$s" %5$s min="0" class="w-2/5 mt-2 mb-1 text-sm border-gray-400 h-9 " %6$s/>', $uid, $type, $placeholder, $value, $readonly, $disabled );
break;
case 'email':
$field_html = sprintf( '<input name="%1$s" id="%2$s" type="%3$s" placeholder="%4$s" value="%5$s" class="%6$s form-input w-2/3 mt-2 mb-1 h-9 text-sm border-gray-400 w-3/5" %7$s/>', $uid, $id_key, $type, $placeholder, $value, $class, $disabled );
break;
case 'textarea':
$field_html = sprintf( '<textarea name="%1$s" id="%2$s" placeholder="%3$s" size="100" rows="%6$s" cols="58" class="%5$s form-textarea text-sm w-2/3 mt-3 mb-1 border-gray-400 w-3/5" %7$s>%4$s</textarea>', $uid, $id_key, $placeholder, $value, $class, $rows, $disabled );
break;
case 'file':
$field_html = '<input type="text" id="logo_url" name="' . $uid . '" value="' . $value . '" class="w-2/3 w-3/5 mt-2 mb-1 text-sm border-gray-400 form-input h-9' . $class . '"/> <input id="upload_logo_button" type="button" class="button" value="Upload Logo" />';
break;
case 'checkbox':
$field_html = '<label for="' . $id_key . '" class="inline-flex items-center mt-4 mb-1 cursor-pointer">
<span class="relative">';
if ( ! $disabled ) {
$field_html .= '<input id="' . $id_key . '" type="checkbox" name="' . $uid . '" value="yes" ' . checked( $value, 'yes', false ) . ' class="absolute w-0 h-0 mt-6 opacity-0 es-check-toggle ' . $class . '" />';
}
$field_html .= $placeholder . '</input>
<span class="es-mail-toggle-line"></span>
<span class="es-mail-toggle-dot"></span>
</span>
</label>';
break;
case 'select':
if ( ! empty( $arguments['options'] ) && is_array( $arguments['options'] ) ) {
$options_markup = '';
foreach ( $arguments['options'] as $key => $label ) {
$options_markup .= sprintf(
'<option value="%s" %s>%s</option>',
$key,
selected( $value, $key, false ),
$label
);
}
$field_html = sprintf( '<select name="%1$s" id="%2$s" class="%4$s form-select rounded-lg w-2/5 h-9 mt-2 mb-1 border-gray-400" %5$s>%3$s</select>', $uid, $id_key, $options_markup, $class, $disabled );
}
break;
case 'html':
default:
$field_html = $html;
break;
}
// If there is help text
if ( ! empty( $arguments['desc'] ) ) {
$helper = $arguments['desc'];
$field_html .= sprintf( '<p class="field-desciption mb-2 text-xs italic font-normal leading-snug text-gray-500 helper %s"> %s</p>', $class, $helper ); // Show it
}
return $field_html;
}
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
public function render_settings_fields( $fields ) {
$html = "<table class='mt-4 mr-4 overflow-hidden bg-white rounded-lg lg:mx-5 xl:mx-7'>";
$html .= '<tbody>';
foreach ( $fields as $key => $field ) {
if ( ! empty( $field['name'] ) ) {
$html .= "<tr id='" . $field['id'] . "-field-row' class='py-4 ml-4 border-b border-gray-100 '><th scope='row' class='block pt-3 pb-8 pr-4 ml-6 text-left pt-7'><span class='pb-2 text-sm font-semibold text-gray-600'>";
$html .= $field['name'];
if ( ! empty( $field['is_premium'] ) ) {
$premium_plan = isset( $field['plan'] ) ? $field['plan'] : '';
$html .= '</span><a class="ml-1" href="' . $field['link'] . '" target="_blank"><span class="premium-icon ' . $premium_plan . '"></span></a>';
}
// If there is help text
if ( ! empty( $field['info'] ) ) {
$helper = $field['info'];
$html .= '<br />' . sprintf( '<p class="mt-1 text-xs italic font-normal leading-snug text-gray-500">%s</p>', $helper ); // Show it
}
$button_html = '<tr>';
$html .= '</th>';
}
$html .= "<td class='w-4/6 py-2 pl-5 bg-white rounded-lg '>";
if ( ! empty( $field['upgrade_desc'] ) ) {
$html .= "<div class='flex'><div class='flex-none w-2/5'>";
}
if ( ! empty( $field['sub_fields'] ) ) {
$option_key = '';
foreach ( $field['sub_fields'] as $field_key => $sub_field ) {
if ( strpos( $sub_field['id'], '[' ) ) {
$parts = explode( '[', $sub_field['id'] );
if ( $option_key !== $parts[0] ) {
$option_value = get_option( $parts[0] );
$option_key = $parts[0];
}
$sub_field['option_value'] = is_array( $option_value ) ? $option_value : '';
}
$class = ( ! empty( $sub_field['class'] ) ) ? $sub_field['class'] : '';
$html .= ( reset( $field['sub_fields'] ) !== $sub_field ) ? '<p class="pt-1></p>' : '';
$html .= '<div class="es_sub_headline ' . $class . ' pt-4" ><strong>' . $sub_field['name'] . '</strong>';
if ( ! empty( $sub_field['tooltip_text'] ) ) {
$tooltip_html = ES_Common::get_tooltip_html( $sub_field['tooltip_text'] );
$html .= $tooltip_html;
}
$html .= '</div>';
$html .= $this->field_callback( $sub_field, $field_key );
}
} else {
$html .= $this->field_callback( $field );
}
if ( ! empty( $field['upgrade_desc'] ) ) {
$upsell_info = array(
'upgrade_title' => $field['upgrade_title'],
'pricing_url' => $field['link'],
'upsell_message' => $field['upgrade_desc'],
'cta_html' => false,
);
$html .= '</div> <div class="w-3/5">';
$html .= ES_Common::upsell_description_message_box( $upsell_info, false );
$html .= '</div>';
}
$html .= '</td></tr>';
}
$button_html = empty( $button_html ) ? '<tr>' : $button_html;
$nonce_field = wp_nonce_field( 'update-settings', 'update-settings', true, false );
$html .= $button_html . "<td class='es-settings-submit-btn'>";
$html .= '<input type="hidden" name="submitted" value="submitted" />';
$html .= '<input type="hidden" name="submit_action" value="ig-es-save-admin-settings" />';
$html .= $nonce_field;
$html .= '<input type="submit" name="submit" class="mx-6 my-2 cursor-pointer ig-es-primary-button" value="' . __( 'Save Settings', 'email-subscribers' ) . '">';
$html .= '</td></tr>';
$html .= '</tbody>';
$html .= '</table>';
$allowedtags = ig_es_allowed_html_tags_in_esc();
add_filter( 'safe_style_css', 'ig_es_allowed_css_style' );
echo wp_kses( $html, $allowedtags );
}
/**
* Prepare Mailers Setting
*
* @return string
*
* @modify 4.3.12
*/
public static function mailers_html() {
$html = '';
$es_email_type = get_option( 'ig_es_email_type', '' );
$selected_mailer_settings = get_option( 'ig_es_mailer_settings', array() );
$selected_mailer = '';
if ( ! empty( $selected_mailer_settings ) && ! empty( $selected_mailer_settings['mailer'] ) ) {
$selected_mailer = $selected_mailer_settings['mailer'];
} else {
$php_email_type_values = array(
'php_html_mail',
'php_plaintext_mail',
'phpmail',
);
if ( in_array( $es_email_type, $php_email_type_values, true ) ) {
$selected_mailer = 'phpmail';
}
}
$pepipost_doc_block = '';
$mailers = array(
'wpmail' => array(
'name' => 'WP Mail',
'logo' => ES_PLUGIN_URL . 'lite/admin/images/wpmail.png',
),
'phpmail' => array(
'name' => 'PHP mail',
'logo' => ES_PLUGIN_URL . 'lite/admin/images/phpmail.png',
),
'pepipost' => array(
'name' => 'Pepipost',
'logo' => ES_PLUGIN_URL . 'lite/admin/images/pepipost.png',
'docblock' => $pepipost_doc_block,
),
);
$mailers = apply_filters( 'ig_es_mailers', $mailers );
$selected_mailer = ( array_key_exists( $selected_mailer, $mailers ) ) ? $selected_mailer : 'wpmail';
foreach ( $mailers as $key => $mailer ) {
$html .= '<label class="inline-flex items-center cursor-pointer">';
$html .= '<input type="radio" class="absolute w-0 h-0 opacity-0 es_mailer" name="ig_es_mailer_settings[mailer]" value="' . $key . '" ' . checked( $selected_mailer, $key, false ) . '></input>';
if ( ! empty( $mailer['is_premium'] ) ) {
$html .= '<a href="' . $mailer['url'] . '" target="_blank">';
}
$html .= '<div class="mt-4 mr-4 border border-gray-200 rounded-lg shadow-md es-mailer-logo">
<div class="border-0 es-logo-wrapper">
<img src="' . $mailer['logo'] . '" alt="Default (none)">
</div><p class="mb-2 inline-block">'
. $mailer['name'] . '</p>';
if ( ! empty( $mailer['is_premium'] ) ) {
$plan = isset( $mailer['plan'] ) ? $mailer['plan'] : '';
$html .= '<span class="premium-icon ' . $plan . '"></span>';
}
$html .= '</div>';
if ( ! empty( $mailer['is_premium'] ) ) {
$html .= '</a>';
}
$html .= '</label>';
}
return $html;
}
/**
* Prepare Icegram Mailer Setting
*
* @return string
*/
public static function get_icegram_mailer_html() {
$html = '';
$opted_for_sending_service = get_option( 'ig_es_ess_opted_for_sending_service', 'no' );
$es_ess_data = get_option( 'ig_es_ess_data', '' );
$current_month = ig_es_get_current_month();
$allocated_limit = isset( $es_ess_data['allocated_limit'] ) ? $es_ess_data['allocated_limit']: 0;
$used_limit = isset( $es_ess_data['used_limit'][$current_month] ) ? $es_ess_data['used_limit'][$current_month] : 0;
$plan = ES_Service_Email_Sending::get_plan();
$premium_plans = array( 'pro', 'max' );
$is_premium_plan = in_array( $plan, $premium_plans, true );
$is_ess_branding_enabled = ES_Service_Email_Sending::is_ess_branding_enabled();
ob_start();
?>
<section id="sending_service_optin" class="pb-4">
<label for="ig_es_ess_opted_for_sending_service" class="inline-flex items-center mt-4 cursor-pointer">
<span class="relative">
<input id="ig_es_ess_opted_for_sending_service" type="checkbox" name="ig_es_ess_opted_for_sending_service" value="yes" <?php echo 'yes' === $opted_for_sending_service ? esc_attr( 'checked="checked"') : ''; ?> class="absolute w-0 h-0 mt-6 opacity-0 es-check-toggle ">
<span class="es-mail-toggle-line"></span>
<span class="es-mail-toggle-dot"></span>
</span>
<span class="pl-2 text-sm font-semibold text-gray-600">
<?php echo esc_html__( 'Enable Icegram email sending service', 'email-subscribers' ); ?>
</span>
</label>
<p class="pl-11 text-xs italic font-normal leading-snug text-gray-500">
<?php
/* translators: %s Break tag */
echo sprintf( esc_html__( 'Use this to get high speed & reliable email delivery via %sIcegram\'s own Email Sending Service at 3000 free emails/ month.', 'email-subscribers' ), '<br/>' );
?>
</p>
</section>
<section id="sending_service_info" class="pb-4">
<?php if ( $is_premium_plan ) : ?>
<label for="ig_es_ess_branding_enabled" class="inline-flex items-center mt-4 cursor-pointer">
<span class="relative">
<input id="ig_es_ess_branding_enabled" type="checkbox" name="ig_es_ess_branding_enabled" value="yes" <?php echo $is_ess_branding_enabled ? esc_attr( 'checked="checked"') : ''; ?> class="absolute w-0 h-0 mt-6 opacity-0 es-check-toggle">
<span class="es-mail-toggle-line"></span>
<span class="es-mail-toggle-dot"></span>
</span>
<span class="pl-2 text-sm font-semibold text-gray-600">
<?php echo esc_html__( 'Show "Sent by Icegram"', 'email-subscribers' ); ?>
</span>
</label>
<p class="pl-11 text-xs italic font-normal leading-snug text-gray-500">
<?php
/* translators: %s Break tag */
echo sprintf( esc_html__( 'Include "Sent by Icegram" link in the footer of your emails.', 'email-subscribers' ), '<br/>' );
?>
</p>
<br/>
<?php endif; ?>
<label id="icegram-mailer-info" class="inline-flex items-center cursor-pointer">
<div class="mr-4 border border-gray-200 rounded-lg shadow-md es-mailer-logo">
<div class="border-0 es-logo-wrapper">
<img src="<?php echo esc_url( ES_PLUGIN_URL . 'lite/admin/images/icegram-mailer.png' ); ?>" alt="Default (none)">
</div>
<p class="mb-2 inline-block" title="<?php echo esc_attr__( 'Icegram Email Sending Service', 'email-subscribers' ); ?>">
Icegram ESS
</p>
</div>
<?php
if ( ! empty( $es_ess_data ) ) {
?>
<div class="mt-4 mr-4 field-desciption mb-2 text-xs italic font-normal leading-snug text-gray-500 helper">
<div>
<?php echo esc_html__( 'Allocated limit', 'email-subscribers' ); ?>: <b><?php echo esc_html( $allocated_limit ); ?></b>
</div>
<div>
<?php echo esc_html__( 'Used limit', 'email-subscribers' ); ?>: <b><?php echo esc_html( $used_limit ); ?></b>
</div>
<div>
<?php echo esc_html__( 'Remaining limit', 'email-subscribers' ); ?>: <b><?php echo esc_html( $allocated_limit - $used_limit ); ?></b>
</div>
</div>
<?php
}
?>
</label>
</section>
<?php
$html = ob_get_clean();
return $html;
}
public static function get_test_send_email_html( $test_email ) {
/* translators: %s: Spinner image path */
$html = sprintf( '<input id="es-test-email" type="email" value=%s class="mt-3 mb-1 border-gray-400 form-input h-9"/><input type="submit" name="submit" id="es-send-test" class="ig-es-primary-button" value="Send Email"><span class="es_spinner_image_admin" id="spinner-image" style="display:none"><img src="%s" alt="Loading..."/></span>', $test_email, ES_PLUGIN_URL . 'lite/public/images/spinner.gif' );
return $html;
}
public static function pepipost_doc_block() {
$html = '';
$url = ES_Common::get_utm_tracking_url(
array(
'url' => 'https://www.icegram.com/email-subscribers-integrates-with-pepipost',
'utm_medium' => 'pepipost_doc',
)
);
ob_start();
do_action('ig_es_before_get_pepipost_doc_block');
?>
<div class="es_sub_headline ig_es_docblock ig_es_pepipost_div_wrapper pepipost">
<ul>
<li><a class="" href="https://app.pepipost.com/index.php/signup/icegram?fpr=icegram" target="_blank"><?php esc_html_e( 'Signup for Pepipost', 'email-subscribers' ); ?></a></li>
<li><?php esc_html_e( 'How to find', 'email-subscribers' ); ?> <a href="https://developers.pepipost.com/api/getstarted/overview?utm_source=icegram&utm_medium=es_inapp&utm_campaign=pepipost" target="_blank"> <?php esc_html_e( 'Pepipost API key', 'email-subscribers' ); ?></a></li>
<li><a href="<?php echo esc_url( $url ); ?>" target="_blank"><?php esc_html_e( 'Why to choose Pepipost', 'email-subscribers' ); ?></a></li>
</ul>
</div>
<?php
do_action('ig_es_after_get_pepipost_doc_block');
$html = ob_get_clean();
return $html;
}
/**
* Register ES cron info
*
* @return array $email_sending_settings ES send email settings.
*
* @since 4.4.9
*/
public function show_cron_info( $email_sending_settings ) {
$es_cron_enabled = ES()->cron->is_wp_cron_enable();
if ( $es_cron_enabled ) {
$es_cron_info = array(
'ig_es_cron_info' => array(
'id' => 'ig_es_cron_info',
'name' => __( 'Cron Info', 'email-subscribers' ),
'type' => 'html',
'html' => self::render_cron_info_html(),
),
);
$email_sending_settings = ig_es_array_insert_after( $email_sending_settings, 'ig_es_cronurl', $es_cron_info );
}
$opted_for_sending_service = get_option( 'ig_es_ess_opted_for_sending_service', '' );
if ( ! empty( $opted_for_sending_service ) ) {
$sending_service_setting = array(
'ig_es_icegram_mailer_info' => array(
'type' => 'html',
'html' => self::get_icegram_mailer_html(),
'id' => 'ig_es_icegram_mailer_info',
'name' => ' ',
),
);
$email_sending_settings = ig_es_array_insert_after( $email_sending_settings, 'ig_es_test_send_email', $sending_service_setting );
}
return $email_sending_settings;
}
/**
* Render ES cron info html
*
* @return false|string
*
* @since 4.4.9
*/
public static function render_cron_info_html() {
$site_crons = get_option( 'cron' );
if ( empty( $site_crons ) ) {
return;
}
$es_cron_enabled = ES()->cron->is_wp_cron_enable();
$es_crons_data = array();
$es_cron_events = array(
'ig_es_cron',
'ig_es_cron_worker',
'ig_es_cron_auto_responder',
'ig_es_summary_automation',
);
$cron_schedules = wp_get_schedules();
$time_offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS;
$date_format = get_option( 'date_format' );
$time_format = get_option( 'time_format' );
foreach ( $site_crons as $next_scheduled_time => $scheduled_crons ) {
if ( ! empty( $scheduled_crons ) && is_array( $scheduled_crons ) ) {
foreach ( $scheduled_crons as $cron_event => $cron_data ) {
if ( ! in_array( $cron_event, $es_cron_events, true ) ) {
continue;
}
foreach ( $cron_data as $cron_info ) {
if ( ! empty( $cron_info['schedule'] ) ) {
$cron_schedule = $cron_info['schedule'];
$cron_interval = ! empty( $cron_schedules[ $cron_schedule ]['interval'] ) ? $cron_schedules[ $cron_schedule ]['interval'] : 0;
$es_crons_data[ $cron_event ] = array(
'cron_interval' => $cron_interval,
'next_scheduled_time' => $next_scheduled_time,
);
}
}
}
}
}
$html = '';
if ( ! empty( $es_crons_data ) ) {
ob_start();
?>
<table class="min-w-full rounded-lg">
<thead>
<tr class="bg-blue-50 text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider">
<th class="px-5 py-4"><?php echo esc_html__( 'Event', 'email-subscribers' ); ?></th>
<th class="px-2 py-4 text-center"><?php echo esc_html__( 'Interval', 'email-subscribers' ); ?></th>
<th class="px-2 py-4 text-center"><?php echo esc_html__( 'Next Execution', 'email-subscribers' ); ?></th>
</tr>
</thead>
<tbody class="bg-blue-50">
<?php
foreach ( $es_cron_events as $cron_event ) {
$cron_interval = '';
$next_scheduled_time = '';
if ( ! empty( $es_crons_data[ $cron_event ] ) ) {
$es_cron_data = $es_crons_data[ $cron_event ];
$cron_interval = $es_cron_data['cron_interval'];
$next_scheduled_time = $es_cron_data['next_scheduled_time'];
} else {
if ( 'ig_es_cron_auto_responder' === $cron_event ) {
wp_schedule_event( floor( time() / 300 ) * 300 - 120, 'ig_es_cron_interval', 'ig_es_cron_auto_responder' );
} elseif ( 'ig_es_cron_worker' === $cron_event ) {
wp_schedule_event( floor( time() / 300 ) * 300, 'ig_es_cron_interval', 'ig_es_cron_worker' );
} elseif ( 'ig_es_cron' === $cron_event ) {
wp_schedule_event( strtotime( 'midnight' ) - 300, 'hourly', 'ig_es_cron' );
}
$next_scheduled_time = wp_next_scheduled( $cron_event );
if ( 'ig_es_cron' === $cron_event ) {
$cron_interval = 3600; // Hourly interval for ig_es_cron.
} else {
$cron_interval = ES()->cron->get_cron_interval();
}
}
if ( empty( $cron_interval ) || empty( $next_scheduled_time ) ) {
continue;
}
?>
<tr class="border-b border-gray-200">
<td class="pl-8 py-4 ">
<div class="flex items-center">
<div class="flex-shrink-0">
<span class="text-sm leading-5 font-medium text-center text-gray-800"><?php echo esc_html( $cron_event ); ?></span>
</div>
</div>
</td>
<td class="whitespace-no-wrap text-center">
<?php
echo esc_html( ig_es_get_human_interval( $cron_interval ) );
?>
</td>
<td class="whitespace-no-wrap text-center">
<?php /* translators: %s: Next scheduled time */ ?>
<b><?php echo esc_html( sprintf( __( 'In %s', 'email-subscribers' ), human_time_diff( time(), $next_scheduled_time ) ) ); ?></b><br>
<span title="<?php echo esc_attr( 'UTC: ' . date_i18n( $date_format . ' ' . $time_format, $next_scheduled_time ) ); ?>">
<?php echo esc_html( date_i18n( $date_format . ' ' . $time_format, $next_scheduled_time + $time_offset ) ); ?>
</span>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
$html = ob_get_clean();
}
return $html;
}
/**
* Add setting for plugin usage tracking
*
* @param array $es_settings
*
* @return array $es_settings
*
* @since 4.7.7
*/
public function show_usage_tracking_optin_setting( $es_settings ) {
// Show option to enable/disable tracking if user isn't a premium user and trial is not valid i.e. has expired.
if ( ! ES()->is_premium() && ! ES()->trial->is_trial_valid() ) {
$allow_tracking = array(
'ig_es_allow_tracking' => array(
'id' => 'ig_es_allow_tracking',
'name' => __( 'Plugin usage tracking', 'email-subscribers' ),
'type' => 'checkbox',
'default' => 'no',
'info' => __( 'Help us to improve Icegram Express by opting in to share non-sensitive plugin usage data.', 'email-subscribers' ),
),
);
$general_fields = $es_settings['general'];
$general_fields = ig_es_array_insert_after( $general_fields, 'ig_es_intermediate_unsubscribe_page', $allow_tracking );
$es_settings['general'] = $general_fields;
}
return $es_settings;
}
/**
* Get HTML for workflow migration
*
* @return string
*/
public static function get_workflow_migration_notice_html() {
ob_start();
$workflow_url = admin_url( 'admin.php?page=es_workflows' );
?>
<style>
#tabs-signup_confirmation .es-settings-submit-btn {
display: none;
}
</style>
<p class="pb-2 text-sm font-normal text-gray-500">
<?php echo esc_html__( 'Now you can control all your notifications through workflows.', 'email-subscribers' ); ?>
<?php
/* translators: 1. Anchor start tag 2. Anchor end tag */
echo sprintf( esc_html__( 'Click %1$shere%2$s to go to workflows.', 'email-subscribers' ), '<a href="' . esc_url( $workflow_url ) . '" class="text-indigo-600" target="_blank">', '</a>' );
?>
</p>
<?php
$html = ob_get_clean();
return $html;
}
public static function render_rest_api_keys_section() {
ob_start();
$rest_api_keys = get_option( 'ig_es_rest_api_keys', array() );
$rest_api_users_ids = get_users( array(
'meta_key' => 'ig_es_rest_api_keys',
'fields' => 'ID'
) );
?>
<div id="ig-es-rest-api-section">
<table class="min-w-full rounded-lg">
<thead>
<tr class="bg-blue-50 text-xs leading-4 font-medium text-gray-500 uppercase tracking-wider">
<th class="px-5 py-4"><?php echo esc_html__( 'Key', 'email-subscribers' ); ?></th>
<th class="px-2 py-4 text-center"><?php echo esc_html__( 'Username', 'email-subscribers' ); ?></th>
<th class="px-2 py-4 text-center"><?php echo esc_html__( 'Actions', 'email-subscribers' ); ?></th>
</tr>
</thead>
<tbody class="bg-blue-50">
<?php
if ( ! empty( $rest_api_users_ids ) ) {
foreach ( $rest_api_users_ids as $user_id ) {
$user = get_userdata( $user_id );
if ( ! $user ) {
continue;
}
$rest_api_keys = get_user_meta( $user_id, 'ig_es_rest_api_keys', true );
if ( ! empty( $rest_api_keys ) ) {
foreach ( $rest_api_keys as $index => $rest_api_key ) {
$key_start = substr( $rest_api_key, 0, 4 );
$key_end = substr( $rest_api_key, strlen( $rest_api_key ) - 4, 4 );
?>
<tr class="ig-es-rest-api-row border-b border-gray-200 text-xs leading-4 font-medium" data-user-id="<?php echo esc_attr( $user_id ); ?>" data-api-index="<?php echo esc_attr( $index ); ?>">
<td class="px-5 py-4 text-center"><?php echo esc_html( $key_start ); ?>***********<?php echo esc_html( $key_end ); ?></td>
<td class="px-2 py-4 text-center"><?php echo esc_html( $user->data->user_login ); ?></td>
<td class="px-2 py-4 text-center">
<a class="ig-es-delete-rest-api-key inline-block" href="#">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" />
</svg>
</a>
</td>
</tr>
<?php
}
}
?>
<?php
}
}
?>
<tr id="ig-es-no-api-keys-message" class="border-b border-gray-200 text-xs leading-4 font-medium">
<td colspan="3" class="px-5 py-4 text-center">
<?php echo esc_html__( 'No API keys found.', 'email-subscribers' ); ?>
</td>
</tr>
</tbody>
</table>
<div id="ig-es-create-new-rest-api-container" class="mt-2">
<?php
$admin_users = get_users(
array(
'role' => 'administrator'
)
);
?>
<select id="ig-es-rest-api-user-id">
<option value=""><?php echo esc_html__( 'Please select a user', 'email-subscribers' ); ?></option>
<?php
foreach ( $admin_users as $user ) {
?>
<option value="<?php echo esc_attr( $user->ID ); ?>"><?php echo esc_html( $user->data->user_email ); ?></option>
<?php
}
?>
</select>
<button type="button" id="ig-es-generate-rest-api-key" class="ig-es-title-button ml-2 align-middle ig-es-inline-loader">
<span>
<?php echo esc_html__( 'Generate API key', 'email-subscribers' ); ?>
</span>
<svg class="es-btn-loader animate-spin h-4 w-4 text-indigo"
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor"
stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor"
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
</svg>
</button>
<div id="response-messages" class="p-2 mt-2 hidden">
<div class="message"></div>
</div>
</div>
</div>
<?php
$html = ob_get_clean();
return $html;
}
}