deleted plugin Subscribe2
version 10.36
This commit is contained in:
parent
30f6692a58
commit
373ebbb254
14
wp-content/plugins/subscribe2/.gitignore
vendored
14
wp-content/plugins/subscribe2/.gitignore
vendored
@ -1,14 +0,0 @@
|
|||||||
config.codekit
|
|
||||||
.idea
|
|
||||||
.codekit-cache
|
|
||||||
/vendor/
|
|
||||||
node_modules
|
|
||||||
zip
|
|
||||||
.DS_Store
|
|
||||||
nbproject
|
|
||||||
debug.log
|
|
||||||
npm-debug.log
|
|
||||||
.netbeans.xml
|
|
||||||
.vscode
|
|
||||||
build/*
|
|
||||||
!build/index.js
|
|
@ -1,143 +0,0 @@
|
|||||||
<?php
|
|
||||||
if ( ! function_exists( 'add_action' ) ) {
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
global $current_user;
|
|
||||||
|
|
||||||
// was anything POSTed?
|
|
||||||
if ( isset( $_POST['s2_admin'] ) && 'mail' === $_POST['s2_admin'] ) {
|
|
||||||
if ( false === wp_verify_nonce( $_REQUEST['_wpnonce'], 'subscribe2-write_subscribers' . S2VERSION ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Security error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$subject = html_entity_decode( stripslashes( wp_kses( $this->substitute( $_POST['subject'] ), '' ) ), ENT_QUOTES );
|
|
||||||
$body = wpautop( $this->substitute( stripslashes( $_POST['content'] ) ), true );
|
|
||||||
if ( '' !== $current_user->display_name || '' !== $current_user->user_email ) {
|
|
||||||
$this->myname = html_entity_decode( $current_user->display_name, ENT_QUOTES );
|
|
||||||
$this->myemail = $current_user->user_email;
|
|
||||||
}
|
|
||||||
if ( isset( $_POST['send'] ) ) {
|
|
||||||
if ( 'confirmed' === $_POST['what'] ) {
|
|
||||||
$recipients = $this->get_public();
|
|
||||||
} elseif ( 'unconfirmed' === $_POST['what'] ) {
|
|
||||||
$recipients = $this->get_public( 0 );
|
|
||||||
} elseif ( 'public' === $_POST['what'] ) {
|
|
||||||
$confirmed = $this->get_public();
|
|
||||||
$unconfirmed = $this->get_public( 0 );
|
|
||||||
$recipients = array_merge( (array) $confirmed, (array) $unconfirmed );
|
|
||||||
} elseif ( is_numeric( $_POST['what'] ) ) {
|
|
||||||
$category = intval( $_POST['what'] );
|
|
||||||
$recipients = $this->get_registered( "cats=$category" );
|
|
||||||
} elseif ( 'all_users' === $_POST['what'] ) {
|
|
||||||
$recipients = $this->get_all_registered();
|
|
||||||
} elseif ( 'all' === $_POST['what'] ) {
|
|
||||||
$confirmed = $this->get_public();
|
|
||||||
$unconfirmed = $this->get_public( 0 );
|
|
||||||
$registered = $this->get_all_registered();
|
|
||||||
$recipients = array_merge( (array) $confirmed, (array) $unconfirmed, (array) $registered );
|
|
||||||
} else {
|
|
||||||
$recipients = $this->get_registered();
|
|
||||||
}
|
|
||||||
} elseif ( isset( $_POST['preview'] ) ) {
|
|
||||||
global $user_email;
|
|
||||||
$recipients[] = $user_email;
|
|
||||||
}
|
|
||||||
|
|
||||||
$uploads = array();
|
|
||||||
if ( ! empty( $_FILES ) ) {
|
|
||||||
foreach ( $_FILES['file']['name'] as $key => $value ) {
|
|
||||||
if ( 0 === $_FILES['file']['error'][ $key ] ) {
|
|
||||||
$file = array(
|
|
||||||
'name' => $_FILES['file']['name'][ $key ],
|
|
||||||
'type' => $_FILES['file']['type'][ $key ],
|
|
||||||
'tmp_name' => $_FILES['file']['tmp_name'][ $key ],
|
|
||||||
'error' => $_FILES['file']['error'][ $key ],
|
|
||||||
'size' => $_FILES['file']['size'][ $key ],
|
|
||||||
);
|
|
||||||
|
|
||||||
$uploads[] = wp_handle_upload(
|
|
||||||
$file,
|
|
||||||
array(
|
|
||||||
'test_form' => false,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$attachments = array();
|
|
||||||
if ( ! empty( $uploads ) ) {
|
|
||||||
foreach ( $uploads as $upload ) {
|
|
||||||
if ( ! isset( $upload['error'] ) ) {
|
|
||||||
$attachments[] = $upload['file'];
|
|
||||||
} else {
|
|
||||||
$upload_error = $upload['error'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( empty( $body ) ) {
|
|
||||||
$error_message = __( 'Your email was empty', 'subscribe2' );
|
|
||||||
$success = false;
|
|
||||||
} elseif ( isset( $upload_error ) ) {
|
|
||||||
$error_message = $upload_error;
|
|
||||||
$success = false;
|
|
||||||
} else {
|
|
||||||
$success = $this->mail( $recipients, $subject, $body, 'html', $attachments );
|
|
||||||
$error_message = __( 'Check your settings and check with your hosting provider', 'subscribe2' );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $success ) {
|
|
||||||
if ( isset( $_POST['preview'] ) ) {
|
|
||||||
$message = '<p class="s2_message">' . __( 'Preview message sent!', 'subscribe2' ) . '</p>';
|
|
||||||
} elseif ( isset( $_POST['send'] ) ) {
|
|
||||||
$message = '<p class="s2_message">' . __( 'Message sent!', 'subscribe2' ) . '</p>';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
global $phpmailer;
|
|
||||||
$message = '<p class="s2_error">' . __( 'Message failed!', 'subscribe2' ) . '</p>' . $error_message . $phpmailer->ErrorInfo;
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated"><strong><p>' . wp_kses_post( $message ) . '</p></strong></div>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// show our form
|
|
||||||
echo '<div class="wrap">';
|
|
||||||
echo '<h1>' . esc_html__( 'Send an email to subscribers', 'subscribe2' ) . '</h1>' . "\r\n";
|
|
||||||
echo '<form method="post" enctype="multipart/form-data">' . "\r\n";
|
|
||||||
|
|
||||||
wp_nonce_field( 'subscribe2-write_subscribers' . S2VERSION );
|
|
||||||
|
|
||||||
if ( isset( $_POST['subject'] ) ) {
|
|
||||||
$subject = stripslashes( esc_html( $_POST['subject'] ) );
|
|
||||||
} else {
|
|
||||||
$subject = __( 'A message from', 'subscribe2' ) . ' ' . html_entity_decode( get_option( 'blogname' ), ENT_QUOTES );
|
|
||||||
}
|
|
||||||
if ( ! isset( $_POST['content'] ) ) {
|
|
||||||
$body = '';
|
|
||||||
}
|
|
||||||
echo '<p>' . esc_html__( 'Subject', 'subscribe2' ) . ': <input type="text" size="69" name="subject" value="' . esc_attr( $subject ) . '" /> <br><br>';
|
|
||||||
echo '<textarea rows="12" cols="75" name="content">' . esc_textarea( $body ) . '</textarea>';
|
|
||||||
echo "<br><div id=\"upload_files\"><input type=\"file\" name=\"file[]\"></div>\r\n";
|
|
||||||
echo '<input type="button" class="button-secondary" name="addmore" value="' . esc_attr( __( 'Add More Files', 'subscribe2' ) ) . "\" onClick=\"add_file_upload();\" />\r\n";
|
|
||||||
echo "<br><br>\r\n";
|
|
||||||
echo esc_html__( 'Recipients:', 'subscribe2' ) . ' ';
|
|
||||||
$this->display_subscriber_dropdown( apply_filters( 's2_subscriber_dropdown_default', 'registered' ), false );
|
|
||||||
echo '<input type="hidden" name="s2_admin" value="mail" />';
|
|
||||||
echo '<p class="submit"><input type="submit" class="button-secondary" name="preview" value="' . esc_attr( __( 'Preview', 'subscribe2' ) ) . '" /> <input type="submit" class="button-primary" name="send" value="' . esc_attr( __( 'Send', 'subscribe2' ) ) . '" /></p>';
|
|
||||||
echo '</form></div>' . "\r\n";
|
|
||||||
echo '<div style="clear: both;"><p> </p></div>';
|
|
||||||
?>
|
|
||||||
<script type="text/javascript">
|
|
||||||
//<![CDATA[
|
|
||||||
function add_file_upload() {
|
|
||||||
var div = document.getElementById( 'upload_files' );
|
|
||||||
var field = div.getElementsByTagName( 'input' )[0];
|
|
||||||
div.appendChild( document.createElement( 'br' ) );
|
|
||||||
div.appendChild( field.cloneNode( false ) );
|
|
||||||
}
|
|
||||||
//]]>
|
|
||||||
</script>
|
|
||||||
<?php
|
|
||||||
require ABSPATH . 'wp-admin/admin-footer.php';
|
|
||||||
// just to be sure
|
|
||||||
die;
|
|
@ -1,529 +0,0 @@
|
|||||||
<?php
|
|
||||||
if ( ! function_exists( 'add_action' ) ) {
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
global $wpdb, $current_tab;
|
|
||||||
|
|
||||||
// was anything POSTed?
|
|
||||||
if ( isset( $_POST['s2_admin'] ) ) {
|
|
||||||
if ( false === wp_verify_nonce( $_REQUEST['_wpnonce'], 'subscribe2-options_subscribers' . S2VERSION ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Security error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $_POST['reset'] ) ) {
|
|
||||||
require_once S2PATH . 'classes/class-s2-upgrade.php';
|
|
||||||
global $s2_upgrade;
|
|
||||||
$s2_upgrade = new S2_Upgrade();
|
|
||||||
$s2_upgrade->reset();
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Options reset!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['preview'] ) ) {
|
|
||||||
global $user_email, $post;
|
|
||||||
$this->preview_email = true;
|
|
||||||
if ( 'never' === $this->subscribe2_options['email_freq'] ) {
|
|
||||||
$preview_posts = get_posts( 'numberposts=1' );
|
|
||||||
$preview_post = $preview_posts[0];
|
|
||||||
$this->publish( $preview_post, $user_email );
|
|
||||||
} else {
|
|
||||||
do_action( 's2_digest_preview', $user_email );
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Preview message(s) sent to logged in user', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['resend'] ) ) {
|
|
||||||
$stickies = get_option( 'sticky_posts' );
|
|
||||||
if ( ! empty( $this->subscribe2_options['last_s2cron'] ) || ( 'yes' === $this->subscribe2_options['stickies'] && ! empty( $stickies ) ) ) {
|
|
||||||
do_action( 's2_digest_resend', 'resend' );
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Attempt made to resend the Digest Notification email', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} else {
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'The Digest Notification email contained no post information. No email was sent', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
} elseif ( isset( $_POST['submit'] ) ) {
|
|
||||||
foreach ( $_POST as $key => $value ) {
|
|
||||||
if ( in_array( $key, array( 'bcclimit', 's2page', 's2_unsub_page' ), true ) ) {
|
|
||||||
// numerical inputs fixed for old option names
|
|
||||||
if ( is_numeric( $_POST[ $key ] ) && $_POST[ $key ] >= 0 ) {
|
|
||||||
$this->subscribe2_options[ $key ] = (int) $_POST[ $key ];
|
|
||||||
}
|
|
||||||
} elseif ( in_array( $key, array( 'show_meta', 'show_button', 'ajax', 'widget', 'counterwidget', 's2meta_default', 'reg_override' ), true ) ) {
|
|
||||||
// check box entries
|
|
||||||
( isset( $_POST[ $key ] ) && '1' === $_POST[ $key ] ) ? $this->subscribe2_options[ $key ] = '1' : $this->subscribe2_options[ $key ] = '0';
|
|
||||||
} elseif ( 'appearance_tab' === $key ) {
|
|
||||||
$options = array( 'show_meta', 'show_button', 'ajax', 'widget', 'counterwidget', 's2meta_default', 'js_ip_updater', 's2_unsub_page' );
|
|
||||||
foreach ( $options as $option ) {
|
|
||||||
if ( ! isset( $_POST[ $option ] ) ) {
|
|
||||||
$this->subscribe2_options[ $option ] = '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elseif ( in_array( $key, array( 'notification_subject', 'mailtext', 'confirm_subject', 'confirm_email', 'remind_subject', 'remind_email' ), true ) && ! empty( $_POST[ $key ] ) ) {
|
|
||||||
// email subject and body templates
|
|
||||||
$this->subscribe2_options[ $key ] = trim( $_POST[ $key ] );
|
|
||||||
} elseif ( in_array( $key, array( 'compulsory', 'exclude', 'format' ), true ) ) {
|
|
||||||
sort( $_POST[ $key ] );
|
|
||||||
$newvalue = implode( ',', $_POST[ $key ] );
|
|
||||||
|
|
||||||
if ( 'format' === $key ) {
|
|
||||||
$this->subscribe2_options['exclude_formats'] = $newvalue;
|
|
||||||
} else {
|
|
||||||
$this->subscribe2_options[ $key ] = $newvalue;
|
|
||||||
}
|
|
||||||
} elseif ( 'registered_users_tab' === $key ) {
|
|
||||||
$options = array( 'compulsory', 'exclude', 'format', 'reg_override' );
|
|
||||||
foreach ( $options as $option ) {
|
|
||||||
if ( ! isset( $_POST[ $option ] ) ) {
|
|
||||||
if ( 'format' === $option ) {
|
|
||||||
$this->subscribe2_options['exclude_formats'] = '';
|
|
||||||
} else {
|
|
||||||
$this->subscribe2_options[ $option ] = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elseif ( 'email_freq' === $key ) {
|
|
||||||
// send per-post or digest emails
|
|
||||||
$email_freq = $_POST['email_freq'];
|
|
||||||
$scheduled_time = wp_next_scheduled( 's2_digest_cron' );
|
|
||||||
$timestamp_offset = get_option( 'gmt_offset' ) * 60 * 60;
|
|
||||||
$crondate = ( isset( $_POST['crondate'] ) ) ? $_POST['crondate'] : 0;
|
|
||||||
$crontime = ( isset( $_POST['crondate'] ) ) ? $_POST['crontime'] : 0;
|
|
||||||
if ( $email_freq !== $this->subscribe2_options['email_freq'] || date_i18n( get_option( 'date_format' ), $scheduled_time + $timestamp_offset ) !== $crondate || gmdate( 'G', $scheduled_time + $timestamp_offset ) !== $crontime ) {
|
|
||||||
$this->subscribe2_options['email_freq'] = $email_freq;
|
|
||||||
wp_clear_scheduled_hook( 's2_digest_cron' );
|
|
||||||
$scheds = (array) wp_get_schedules();
|
|
||||||
$interval = ( isset( $scheds[ $email_freq ]['interval'] ) ) ? (int) $scheds[ $email_freq ]['interval'] : 0;
|
|
||||||
if ( 0 === $interval ) {
|
|
||||||
// if we are on per-post emails remove last_cron entry
|
|
||||||
unset( $this->subscribe2_options['last_s2cron'] );
|
|
||||||
} else {
|
|
||||||
// if we are using digest schedule the event and prime last_cron as now
|
|
||||||
$time = time() + $interval;
|
|
||||||
$srttimestamp = strtotime( $crondate ) + ( $crontime * 60 * 60 );
|
|
||||||
if ( false === $srttimestamp || 0 === $srttimestamp ) {
|
|
||||||
$srttimestamp = time();
|
|
||||||
}
|
|
||||||
$timestamp = $srttimestamp - $timestamp_offset;
|
|
||||||
while ( $timestamp < time() ) {
|
|
||||||
// if we are trying to set the time in the past increment it forward
|
|
||||||
// by the interval period until it is in the future
|
|
||||||
$timestamp += $interval;
|
|
||||||
}
|
|
||||||
wp_schedule_event( $timestamp, $email_freq, 's2_digest_cron' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( isset( $this->subscribe2_options[ $key ] ) ) {
|
|
||||||
if ( 'sender' === $key && $this->subscribe2_options[ $key ] !== $_POST[ $key ] ) {
|
|
||||||
$this->subscribe2_options['dismiss_sender_warning'] = '0';
|
|
||||||
}
|
|
||||||
$this->subscribe2_options[ $key ] = $_POST[ $key ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Options saved!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
update_option( 'subscribe2_options', $this->subscribe2_options );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// send error message if no WordPress page exists
|
|
||||||
$page_id = $wpdb->get_var( "SELECT ID FROM `{$wpdb->prefix}posts` WHERE post_type='page' AND post_status='publish' LIMIT 1" );
|
|
||||||
if ( empty( $page_id ) ) {
|
|
||||||
echo '<div id="page_message" class="error"><p class="s2_error"><strong>' . esc_html__( 'You must create a WordPress page for this plugin to work correctly.', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// display error message for GDPR
|
|
||||||
if ( defined( 'S2GDPR' ) && true === S2GDPR ) {
|
|
||||||
if ( 'yes' === $this->subscribe2_options['autosub'] || 'yes' === $this->subscribe2_options['wpregdef'] || 'yes' === $this->subscribe2_options['autosub_def'] || 'yes' === $this->subscribe2_options['comment_def'] ) {
|
|
||||||
echo '<div id="gdpr_message" class="error"><p class="s2_error"><strong>' . esc_html__( 'Your Settings may breach GDPR', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'never' !== $this->subscribe2_options['email_freq'] ) {
|
|
||||||
$disallowed_keywords = array( '{TITLE}', '{TITLETEXT}', '{PERMALINK}', '{PERMAURL}', '{DATE}', '{TIME}', '{LINK}', '{ACTION}', '{REFERENCELINKS}' );
|
|
||||||
} else {
|
|
||||||
$disallowed_keywords = array( '{POSTTIME}', '{TABLE}', '{TABLELINKS}', '{COUNT}', '{LINK}', '{ACTION}' );
|
|
||||||
}
|
|
||||||
$disallowed = false;
|
|
||||||
foreach ( $disallowed_keywords as $disallowed_keyword ) {
|
|
||||||
if ( false !== strstr( $this->subscribe2_options['mailtext'], $disallowed_keyword ) ) {
|
|
||||||
$disallowed[] = $disallowed_keyword;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$template_link = '<a href="' . admin_url( 'admin.php?page=s2_settings&tab=templates' ) . '">' . __( 'Modify your template', 'subscribe2' ) . '</a>';
|
|
||||||
if ( false !== $disallowed ) {
|
|
||||||
$disallowed_keywords = __( 'Your chosen email type (per-post or digest) does not support the following keywords:', 'subscribe2' );
|
|
||||||
echo '<div id="keyword_message" class="error"><p class="s2_error"><strong>' . esc_html( $disallowed_keywords ) . '</strong><br>' . esc_html( implode( ', ', $disallowed ) ) . '<br>' . wp_kses_post( $template_link ) . '</p></div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// send error message if sender email address is off-domain
|
|
||||||
if ( 'blogname' === $this->subscribe2_options['sender'] ) {
|
|
||||||
$sender = get_bloginfo( 'admin_email' );
|
|
||||||
} else {
|
|
||||||
$user = $this->get_userdata( $this->subscribe2_options['sender'] );
|
|
||||||
$sender = $user->user_email;
|
|
||||||
}
|
|
||||||
list( $user, $sender_domain ) = explode( '@', $sender, 2 );
|
|
||||||
|
|
||||||
$dismis_sender_worning = '';
|
|
||||||
if(isset($this->subscribe2_options['dismiss_sender_warning'])) {
|
|
||||||
$dismis_sender_worning = $this->subscribe2_options['dismiss_sender_warning'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! stristr( esc_html( $_SERVER['SERVER_NAME'] ), $sender_domain ) && 'author' !== $this->subscribe2_options['sender'] && '0' === (isset($this->subscribe2_options['dismiss_sender_warning']) ? $this->subscribe2_options['dismiss_sender_warning'] : '0') ) {
|
|
||||||
// Translators: Warning message
|
|
||||||
echo wp_kses_post( '<div id="sender_message" class="error notice is-dismissible"><p class="s2_error"><strong>' . sprintf( __( 'You appear to be sending notifications from %1$s, which has a different domain name than your blog server %2$s. This may result in failed emails.', 'subscribe2' ), $sender, $_SERVER['SERVER_NAME'] ) . '</strong></p></div>' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// detect or define which tab we are in
|
|
||||||
$current_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'email';
|
|
||||||
|
|
||||||
// show our form
|
|
||||||
echo '<div class="wrap">';
|
|
||||||
echo '<h1>' . esc_html__( 'Settings', 'subscribe2' ) . '</h1>' . "\r\n";
|
|
||||||
$s2tabs = array(
|
|
||||||
'email' => __( 'Email Settings', 'subscribe2' ),
|
|
||||||
'templates' => __( 'Templates', 'subscribe2' ),
|
|
||||||
'registered' => __( 'Registered Users', 'subscribe2' ),
|
|
||||||
'appearance' => __( 'Appearance', 'subscribe2' ),
|
|
||||||
'misc' => __( 'Miscellaneous', 'subscribe2' ),
|
|
||||||
);
|
|
||||||
echo '<h2 class="nav-tab-wrapper">';
|
|
||||||
foreach ( $s2tabs as $tab_key => $tab_caption ) {
|
|
||||||
$active = ( $current_tab === $tab_key ) ? 'nav-tab-active' : '';
|
|
||||||
echo '<a class="nav-tab ' . esc_attr( $active ) . '" href="?page=s2_settings&tab=' . esc_html( $tab_key ) . '">' . esc_html( $tab_caption ) . '</a>';
|
|
||||||
}
|
|
||||||
echo '</h2>';
|
|
||||||
|
|
||||||
echo '<form method="post">' . "\r\n";
|
|
||||||
|
|
||||||
wp_nonce_field( 'subscribe2-options_subscribers' . S2VERSION );
|
|
||||||
|
|
||||||
echo '<input type="hidden" name="s2_admin" value="options" />' . "\r\n";
|
|
||||||
echo '<input type="hidden" id="jsbcclimit" value="' . esc_attr( $this->subscribe2_options['bcclimit'] ) . '" />';
|
|
||||||
|
|
||||||
switch ( $current_tab ) {
|
|
||||||
case 'email':
|
|
||||||
// settings for outgoing emails
|
|
||||||
echo '<div class="s2_admin" id="s2_notification_settings">' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
echo wp_kses_post( 'Restrict the number of <strong>recipients per email</strong> to (0 for unlimited)', 'subscribe2' ) . ': ';
|
|
||||||
echo '<span id="s2bcclimit_1"><span id="s2bcclimit" style="background-color: #FFFBCC">' . esc_html( $this->subscribe2_options['bcclimit'] ) . '</span> ';
|
|
||||||
echo '<a href="#" onclick="s2Show(\'bcclimit\'); return false;">' . esc_html__( 'Edit', 'subscribe2' ) . '</a></span>' . "\r\n";
|
|
||||||
echo '<span id="s2bcclimit_2">' . "\r\n";
|
|
||||||
echo '<input type="text" name="bcclimit" value="' . esc_attr( $this->subscribe2_options['bcclimit'] ) . '" size="3" />' . "\r\n";
|
|
||||||
echo '<a href="#" onclick="s2Update(\'bcclimit\'); return false;">' . esc_html__( 'Update', 'subscribe2' ) . '</a>' . "\r\n";
|
|
||||||
echo '<a href="#" onclick="s2Revert(\'bcclimit\'); return false;">' . esc_html__( 'Revert', 'subscribe2' ) . '</a></span>' . "\n";
|
|
||||||
|
|
||||||
echo '<br><br>' . esc_html__( 'Send Admins notifications for new', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="admin_email" value="subs"' . checked( $this->subscribe2_options['admin_email'], 'subs', false ) . ' />' . "\r\n";
|
|
||||||
echo esc_html__( 'Subscriptions', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="admin_email" value="unsubs"' . checked( $this->subscribe2_options['admin_email'], 'unsubs', false ) . ' />' . "\r\n";
|
|
||||||
echo esc_html__( 'Unsubscriptions', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="admin_email" value="both"' . checked( $this->subscribe2_options['admin_email'], 'both', false ) . ' />' . "\r\n";
|
|
||||||
echo esc_html__( 'Both', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="admin_email" value="none"' . checked( $this->subscribe2_options['admin_email'], 'none', false ) . ' />' . "\r\n";
|
|
||||||
echo esc_html__( 'Neither', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
echo esc_html__( 'Include theme CSS stylesheet in HTML notifications', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="stylesheet" value="yes"' . checked( $this->subscribe2_options['stylesheet'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="stylesheet" value="no"' . checked( $this->subscribe2_options['stylesheet'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
echo esc_html__( 'Send Emails for Pages', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="pages" value="yes"' . checked( $this->subscribe2_options['pages'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="pages" value="no"' . checked( $this->subscribe2_options['pages'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
$s2_post_types = apply_filters( 's2_post_types', array() );
|
|
||||||
if ( ! empty( $s2_post_types ) ) {
|
|
||||||
if ( ! empty( $s2_post_types ) ) {
|
|
||||||
echo esc_html__( 'Subscribe2 will send email notifications for the following custom post types', 'subscribe2' ) . ': ';
|
|
||||||
echo '<strong>' . esc_html( implode( ', ', $s2_post_types ) ) . '</strong><br><br>' . "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
echo esc_html__( 'Send Emails for Password Protected Posts', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="password" value="yes"' . checked( $this->subscribe2_options['password'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="password" value="no"' . checked( $this->subscribe2_options['password'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Send Emails for Private Posts', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="private" value="yes"' . checked( $this->subscribe2_options['private'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="private" value="no"' . checked( $this->subscribe2_options['private'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
if ( 'never' !== $this->subscribe2_options['email_freq'] ) {
|
|
||||||
echo esc_html__( 'Include Sticky Posts at the top of all Digest Notifications', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="stickies" value="yes"' . checked( $this->subscribe2_options['stickies'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="stickies" value="no"' . checked( $this->subscribe2_options['stickies'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Send Email From', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label>' . "\r\n";
|
|
||||||
$this->admin_dropdown( true );
|
|
||||||
echo '</label><br><br>' . "\r\n";
|
|
||||||
if ( function_exists( 'wp_schedule_event' ) ) {
|
|
||||||
echo esc_html__( 'Send Emails', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
$this->display_digest_choices();
|
|
||||||
}
|
|
||||||
if ( 'never' !== $this->subscribe2_options['email_freq'] ) {
|
|
||||||
echo '<p>' . esc_html__( 'For digest notifications, date order for posts is', 'subscribe2' ) . ': ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="cron_order" value="desc"' . checked( $this->subscribe2_options['cron_order'], 'desc', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Descending', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="cron_order" value="asc"' . checked( $this->subscribe2_options['cron_order'], 'asc', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Ascending', 'subscribe2' ) . '</label></p>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Add Tracking Parameters to the Permalink', 'subscribe2' ) . ': ';
|
|
||||||
echo '<input type="text" name="tracking" value="' . esc_attr( $this->subscribe2_options['tracking'] ) . '" size="50" /> ';
|
|
||||||
echo '<br>' . esc_html__( 'eg. utm_source=subscribe2&utm_medium=email&utm_campaign=postnotify&utm_id={ID}&utm_title={TITLE}', 'subscribe2' ) . "\r\n";
|
|
||||||
echo '</p>' . "\r\n";
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'templates':
|
|
||||||
// email templates
|
|
||||||
echo '<div class="s2_admin" id="s2_templates">' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
echo '<table style="width: 100%; border-collapse: separate; border-spacing: 5px; *border-collapse: expression(\'separate\', cellSpacing = \'5px\');" class="editform">' . "\r\n";
|
|
||||||
echo '<tr><td style="vertical-align: top; height: 350px; min-height: 350px;">';
|
|
||||||
echo esc_html__( 'Notification email (must not be empty)', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Subject Line', 'subscribe2' ) . ': ';
|
|
||||||
echo '<input type="text" name="notification_subject" value="' . esc_attr( $this->subscribe2_options['notification_subject'] ) . '" size="45" />';
|
|
||||||
echo '<br>' . "\r\n";
|
|
||||||
echo '<textarea rows="9" cols="60" name="mailtext" style="width:95%;">' . esc_textarea( stripslashes( $this->subscribe2_options['mailtext'] ) ) . '</textarea>' . "\r\n";
|
|
||||||
echo '</td><td style="vertical-align: top;" rowspan="3">';
|
|
||||||
echo '<p class="submit"><input type="submit" class="button-secondary" name="preview" value="' . esc_html__( 'Send Email Preview', 'subscribe2' ) . '" /></p>' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Message substitutions', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<dl>';
|
|
||||||
echo '<dt><b><em style="color: red">' . esc_html__( 'IF THE FOLLOWING KEYWORDS ARE ALSO IN YOUR POST THEY WILL BE SUBSTITUTED', 'subscribe2' ) . '</em></b></dt><dd></dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{BLOGNAME}</b></dt><dd>' . esc_html( get_option( 'blogname' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{BLOGLINK}</b></dt><dd>' . esc_html( get_option( 'home' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TITLE}</b></dt><dd>' . wp_kses_post( __( "the post's title<br>(<i>for per-post emails only</i>)", 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TITLETEXT}</b></dt><dd>' . wp_kses_post( __( "the post's unformatted title <br>(<i>for per-post emails only</i>)", 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{POST}</b></dt><dd>' . wp_kses_post( __( "the excerpt or the entire post<br>(<i>based on the subscriber's preferences</i>)", 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{POSTTIME}</b></dt><dd>' . wp_kses_post( __( 'the excerpt of the post and the time it was posted<br>(<i>for digest emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TABLE}</b></dt><dd>' . wp_kses_post( __( 'a list of post titles<br>(<i>for digest emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TABLELINKS}</b></dt><dd>' . wp_kses_post( __( 'a list of post titles followed by links to the articles<br>(<i>for digest emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{REFERENCELINKS}</b></dt><dd>' . wp_kses_post( __( 'a reference style list of links at the end of the email with corresponding numbers in the content<br>(<i>for the full content plain text per-post email only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{PERMALINK}</b></dt><dd>' . wp_kses_post( __( "the post's permalink<br>(<i>for per-post emails only</i>)", 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TINYLINK}</b></dt><dd>' . esc_html__( "the post's permalink after conversion by TinyURL", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{PERMAURL}</b></dt><dd>' . wp_kses_post( __( "the post's unformatted permalink<br>(<i>for per-post emails only</i>)", 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{DATE}</b></dt><dd>' . wp_kses_post( __( 'the date the post was made<br>(<i>for per-post emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TIME}</b></dt><dd>' . wp_kses_post( __( 'the time the post was made<br>(<i>for per-post emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{MYNAME}</b></dt><dd>' . esc_html__( "the admin or post author's name", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{EMAIL}</b></dt><dd>' . esc_html__( "the admin or post author's email", 'subscribe2' ) . ' </dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{AUTHORNAME}</b></dt><dd>' . esc_html__( "the post author's name", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{LINK}</b></dt><dd>' . wp_kses_post( __( 'the generated link to confirm a request<br>(<i>only used in the confirmation email template</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
if ( 1 === $this->subscribe2_options['bcclimit'] ) {
|
|
||||||
echo '<dt><b>{UNSUBLINK}</b></dt><dd>' . wp_kses_post( __( 'a generated unsubscribe link<br>(<i>only used in the email notification template</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '<dt><b>{ACTION}</b></dt><dd>' . wp_kses_post( __( 'Action performed by LINK in confirmation email<br>(<i>only used in the confirmation email template</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{CATS}</b></dt><dd>' . esc_html__( "the post's assigned categories", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{TAGS}</b></dt><dd>' . esc_html__( "the post's assigned Tags", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
echo '<dt><b>{COUNT}</b></dt><dd>' . wp_kses_post( __( 'the number of posts included in the digest email<br>(<i>for digest emails only</i>)', 'subscribe2' ) ) . '</dd>' . "\r\n";
|
|
||||||
if ( current_theme_supports( 'post-thumbnails' ) ) {
|
|
||||||
echo '<dt><b>{IMAGE}</b></dt><dd>' . esc_html__( "the post's featured image", 'subscribe2' ) . '</dd>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '</dl></td></tr><tr><td style="vertical-align: top; height: 350px; min-height: 350px;">';
|
|
||||||
echo esc_html__( 'Subscribe / Unsubscribe confirmation email', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Subject Line', 'subscribe2' ) . ': ';
|
|
||||||
echo '<input type="text" name="confirm_subject" value="' . esc_attr( $this->subscribe2_options['confirm_subject'] ) . '" size="45" /><br>' . "\r\n";
|
|
||||||
echo '<textarea rows="9" cols="60" name="confirm_email" style="width:95%;">' . esc_textarea( stripslashes( $this->subscribe2_options['confirm_email'] ) ) . '</textarea>' . "\r\n";
|
|
||||||
echo '</td></tr><tr><td style="vertical-align: top; height: 350px; min-height: 350px;">';
|
|
||||||
echo esc_html__( 'Reminder email to Unconfirmed Subscribers', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Subject Line', 'subscribe2' ) . ': ';
|
|
||||||
echo '<input type="text" name="remind_subject" value="' . esc_attr( $this->subscribe2_options['remind_subject'] ) . '" size="45" /><br>' . "\r\n";
|
|
||||||
echo '<textarea rows="9" cols="60" name="remind_email" style="width:95%;">' . esc_textarea( stripslashes( $this->subscribe2_options['remind_email'] ) ) . '</textarea><br><br>' . "\r\n";
|
|
||||||
echo '</td></tr></table>' . "\r\n";
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'registered':
|
|
||||||
// Access function to allow display for form elements
|
|
||||||
require_once S2PATH . 'classes/class-s2-forms.php';
|
|
||||||
$s2_forms = new s2_forms();
|
|
||||||
|
|
||||||
// compulsory categories
|
|
||||||
echo '<div class="s2_admin" id="s2_compulsory_categories">' . "\r\n";
|
|
||||||
echo '<input type="hidden" name="registered_users_tab" value="options" />' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Compulsory Categories', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
echo '<strong><em style="color: red">' . esc_html__( 'Compulsory categories will be checked by default for Registered Subscribers', 'subscribe2' ) . '</em></strong><br>' . "\r\n";
|
|
||||||
echo '</p>';
|
|
||||||
$s2_forms->display_category_form( explode( ',', $this->subscribe2_options['compulsory'] ), 1, array(), 'compulsory' );
|
|
||||||
echo "</div>\r\n";
|
|
||||||
|
|
||||||
// excluded categories
|
|
||||||
echo '<div class="s2_admin" id="s2_excluded_categories">' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Excluded Categories', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>';
|
|
||||||
echo '<strong><em style="color: red">' . esc_html__( 'Posts assigned to any Excluded Category do not generate notifications and are not included in digest notifications', 'subscribe2' ) . '</em></strong><br>' . "\r\n";
|
|
||||||
echo '</p>';
|
|
||||||
$s2_forms->display_category_form( explode( ',', $this->subscribe2_options['exclude'] ), 1, array(), 'exclude' );
|
|
||||||
echo '<p style="text-align: center;"><label><input type="checkbox" name="reg_override" value="1"' . checked( $this->subscribe2_options['reg_override'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Allow registered users to subscribe to excluded categories?', 'subscribe2' ) . '</label></p>' . "\r\n";
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
|
|
||||||
// excluded post formats
|
|
||||||
$formats = get_theme_support( 'post-formats' );
|
|
||||||
if ( false !== $formats ) {
|
|
||||||
// excluded formats
|
|
||||||
echo '<div class="s2_admin" id="s2_excluded_formats">' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Excluded Formats', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>';
|
|
||||||
echo '<strong><em style="color: red">' . esc_html__( 'Posts assigned to any Excluded Format do not generate notifications and are not included in digest notifications', 'subscribe2' ) . '</em></strong><br>' . "\r\n";
|
|
||||||
echo '</p>';
|
|
||||||
$this->display_format_form( $formats, explode( ',', $this->subscribe2_options['exclude_formats'] ) );
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Auto Subscription for new registrations
|
|
||||||
echo '<div class="s2_admin" id="s2_autosubscribe_settings">' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Auto-Subscribe', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
echo esc_html__( 'Subscribe new users registering with your blog', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
if ( defined( 'S2GDPR' ) && ( ( true === S2GDPR && 'yes' === $this->subscribe2_options['autosub'] ) || ( false === S2GDPR ) ) ) {
|
|
||||||
echo '<label><input type="radio" name="autosub" value="yes"' . checked( $this->subscribe2_options['autosub'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Automatically', 'subscribe2' ) . '</label> ';
|
|
||||||
}
|
|
||||||
echo '<label><input type="radio" name="autosub" value="wpreg"' . checked( $this->subscribe2_options['autosub'], 'wpreg', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Display option on Registration Form', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="autosub" value="no"' . checked( $this->subscribe2_options['autosub'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Auto-subscribe includes any excluded categories', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="newreg_override" value="yes"' . checked( $this->subscribe2_options['newreg_override'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="newreg_override" value="no"' . checked( $this->subscribe2_options['newreg_override'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
if ( defined( 'S2GDPR' ) && ( ( true === S2GDPR && 'yes' === $this->subscribe2_options['wpregdef'] ) || ( false === S2GDPR ) ) ) {
|
|
||||||
echo esc_html__( 'Registration Form option is checked by default', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="wpregdef" value="yes"' . checked( $this->subscribe2_options['wpregdef'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="wpregdef" value="no"' . checked( $this->subscribe2_options['wpregdef'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Auto-subscribe users to receive email as', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="autoformat" value="html"' . checked( $this->subscribe2_options['autoformat'], 'html', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'HTML - Full', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="autoformat" value="html_excerpt"' . checked( $this->subscribe2_options['autoformat'], 'html_excerpt', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'HTML - Excerpt', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="autoformat" value="post"' . checked( $this->subscribe2_options['autoformat'], 'post', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Plain Text - Full', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="autoformat" value="excerpt"' . checked( $this->subscribe2_options['autoformat'], 'excerpt', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Plain Text - Excerpt', 'subscribe2' ) . '</label><br><br>';
|
|
||||||
echo esc_html__( 'Registered Users have the option to auto-subscribe to new categories', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="show_autosub" value="yes"' . checked( $this->subscribe2_options['show_autosub'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="show_autosub" value="no"' . checked( $this->subscribe2_options['show_autosub'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="show_autosub" value="exclude"' . checked( $this->subscribe2_options['show_autosub'], 'exclude', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'New categories are immediately excluded', 'subscribe2' ) . '</label><br><br>';
|
|
||||||
if ( defined( 'S2GDPR' ) && ( ( true === S2GDPR && 'yes' === $this->subscribe2_options['autosub_def'] ) || ( false === S2GDPR ) ) ) {
|
|
||||||
echo esc_html__( 'Option for Registered Users to auto-subscribe to new categories is checked by default', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="autosub_def" value="yes"' . checked( $this->subscribe2_options['autosub_def'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="autosub_def" value="no"' . checked( $this->subscribe2_options['autosub_def'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>';
|
|
||||||
}
|
|
||||||
// Hide these options if using Jetpack Comments
|
|
||||||
if ( ! class_exists( 'Jetpack_Comments' ) ) {
|
|
||||||
echo esc_html__( 'Display checkbox to allow subscriptions from the comment form', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="comment_subs" value="before"' . checked( $this->subscribe2_options['comment_subs'], 'before', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Before the Comment Submit button', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="comment_subs" value="after"' . checked( $this->subscribe2_options['comment_subs'], 'after', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'After the Comment Submit button', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="comment_subs" value="no"' . checked( $this->subscribe2_options['comment_subs'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>';
|
|
||||||
if ( defined( 'S2GDPR' ) && ( ( true === S2GDPR && 'yes' === $this->subscribe2_options['comment_def'] ) || ( false === S2GDPR ) ) ) {
|
|
||||||
echo esc_html__( 'Comment form checkbox is checked by default', 'subscribe2' ) . ': <br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="comment_def" value="yes"' . checked( $this->subscribe2_options['comment_def'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="comment_def" value="no"' . checked( $this->subscribe2_options['comment_def'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Show one-click subscription on profile page', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="one_click_profile" value="yes"' . checked( $this->subscribe2_options['one_click_profile'], 'yes', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="one_click_profile" value="no"' . checked( $this->subscribe2_options['one_click_profile'], 'no', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '</p></div>' . "\r\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'appearance':
|
|
||||||
// Appearance options
|
|
||||||
echo '<div class="s2_admin" id="s2_appearance_settings">' . "\r\n";
|
|
||||||
echo '<input type="hidden" name="appearance_tab" value="options" />' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
|
|
||||||
// WordPress page ID where subscribe2 token is used
|
|
||||||
echo esc_html__( 'Set default Subscribe2 page as', 'subscribe2' ) . ': ';
|
|
||||||
$this->pages_dropdown( $this->subscribe2_options['s2page'] );
|
|
||||||
echo "</br></br>";
|
|
||||||
echo esc_html__( 'Set Subscribe2 unsubscribe page', 'subscribe2' ) . ': ';
|
|
||||||
$this->pages_dropdown( isset($this->subscribe2_options['s2_unsub_page']) ? $this->subscribe2_options['s2_unsub_page'] : 0 , 's2_unsub_page');
|
|
||||||
|
|
||||||
// show link to WordPress page in meta
|
|
||||||
echo '<br><br><label><input type="checkbox" name="show_meta" value="1"' . checked( $this->subscribe2_options['show_meta'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Show a link to your subscription page in "meta"?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// show QuickTag button
|
|
||||||
echo '<label><input type="checkbox" name="show_button" value="1"' . checked( $this->subscribe2_options['show_button'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Show the Subscribe2 button on the Write toolbar?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// enable popup style form
|
|
||||||
echo '<label><input type="checkbox" name="ajax" value="1"' . checked( $this->subscribe2_options['ajax'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Enable popup style subscription form?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// show Widget
|
|
||||||
echo '<label><input type="checkbox" name="widget" value="1"' . checked( $this->subscribe2_options['widget'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Enable Subscribe2 Widget?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// show Counter Widget
|
|
||||||
echo '<label><input type="checkbox" name="counterwidget" value="1"' . checked( $this->subscribe2_options['counterwidget'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Enable Subscribe2 Counter Widget?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// s2_meta checked by default
|
|
||||||
echo '<label><input type="checkbox" name="s2meta_default" value="1"' . checked( $this->subscribe2_options['s2meta_default'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Disable email notifications is checked by default on authoring pages?', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
// Subscription form for Registered Users on Frontend
|
|
||||||
echo '<label><input type="checkbox" name="js_ip_updater" value="1"' . checked( $this->subscribe2_options['js_ip_updater'], '1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Use javascript to update IP address in Subscribe2 HTML form data? (useful if caching is enabled)', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '</p>';
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'misc':
|
|
||||||
//barred domains
|
|
||||||
echo '<div class="s2_admin" id="s2_barred_domains">' . "\r\n";
|
|
||||||
echo '<h3>' . esc_html__( 'Barred Domains', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>' . "\r\n";
|
|
||||||
echo esc_html__( 'Enter domains to bar for public subscriptions, wildcards (*) and exceptions (!) are allowed', 'subscribe2' ) . '<br>' . "\r\n";
|
|
||||||
echo esc_html__( 'Use a new line for each entry and omit the "@" symbol, for example !email.com, hotmail.com, yahoo.*', 'subscribe2' );
|
|
||||||
echo "\r\n" . '<br><textarea style="width: 98%;" rows="4" cols="60" name="barred">' . esc_textarea( $this->subscribe2_options['barred'] ) . '</textarea>';
|
|
||||||
echo '</p>';
|
|
||||||
echo '<h3>' . esc_html__( 'Links', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<a href="https://wordpress.org/plugins/subscribe2/">' . esc_html__( 'Plugin Site', 'subscribe2' ) . '</a><br>';
|
|
||||||
echo '<a href="https://wordpress.org/support/plugin/subscribe2">' . esc_html__( 'Plugin Forum', 'subscribe2' ) . '</a><br>';
|
|
||||||
echo '<a href="https://getwemail.io/subscribe2/">' . esc_html__( 'Plugin Blog', 'subscribe2' ) . '</a><br>';
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
// submit
|
|
||||||
echo '<p class="submit" style="text-align: center"><input type="submit" class="button-primary" name="submit" value="' . esc_attr( __( 'Submit', 'subscribe2' ) ) . '" /></p>';
|
|
||||||
|
|
||||||
if ( 'misc' === $current_tab ) {
|
|
||||||
// reset
|
|
||||||
echo '<h3>' . esc_html__( 'Reset to Default Settings', 'subscribe2' ) . '</h3>' . "\r\n";
|
|
||||||
echo '<p>' . esc_html__( 'Use this to reset all options to their defaults. This <strong><em>will not</em></strong> modify your list of subscribers.', 'subscribe2' ) . '</p>' . "\r\n";
|
|
||||||
echo '<p class="submit" style="text-align: center">';
|
|
||||||
echo '<input type="submit" class="button" id="deletepost" name="reset" value="' . esc_attr( __( 'RESET', 'subscribe2' ) ) . '" /></p>';
|
|
||||||
}
|
|
||||||
echo '</form></div>' . "\r\n";
|
|
||||||
|
|
||||||
require ABSPATH . 'wp-admin/admin-footer.php';
|
|
||||||
// just to be sure
|
|
||||||
die;
|
|
@ -1,338 +0,0 @@
|
|||||||
<?php
|
|
||||||
if ( ! function_exists( 'add_action' ) ) {
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
global $subscribers, $what, $current_tab;
|
|
||||||
|
|
||||||
// detect or define which tab we are in
|
|
||||||
$current_tab = isset( $_GET['tab'] ) ? esc_attr( $_GET['tab'] ) : 'public';
|
|
||||||
|
|
||||||
// Access function to allow display for form elements
|
|
||||||
require_once S2PATH . 'classes/class-s2-forms.php';
|
|
||||||
$s2_forms = new s2_forms();
|
|
||||||
|
|
||||||
// Instantiate and prepare our table data - this also runs the bulk actions
|
|
||||||
if ( ! class_exists( 'WP_List_Table' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
|
|
||||||
}
|
|
||||||
if ( ! class_exists( 'Subscribe2_List_Table' ) ) {
|
|
||||||
require_once S2PATH . 'classes/class-s2-list-table.php';
|
|
||||||
$s2_list_table = new S2_List_Table();
|
|
||||||
}
|
|
||||||
|
|
||||||
// was anything POSTed ?
|
|
||||||
if ( isset( $_POST['s2_admin'] ) ) {
|
|
||||||
$s2_request_category = '';
|
|
||||||
if (isset($_REQUEST['category']) && $_REQUEST['category']) {
|
|
||||||
$s2_request_category = $_REQUEST['category'];
|
|
||||||
}
|
|
||||||
if ( false === wp_verify_nonce( $_REQUEST['_wpnonce'], 'bulk-' . $s2_list_table->_args['plural'] ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Security error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $_POST['addresses'] ) ) {
|
|
||||||
$reg_sub_error = '';
|
|
||||||
$pub_sub_error = '';
|
|
||||||
$unsub_error = '';
|
|
||||||
$email_error = '';
|
|
||||||
$message = '';
|
|
||||||
foreach ( preg_split( '/[\s,]+/', $_POST['addresses'] ) as $email ) {
|
|
||||||
$clean_email = $this->sanitize_email( $email );
|
|
||||||
if ( false === $this->validate_email( $clean_email ) ) {
|
|
||||||
( '' === $email_error ) ? $email_error = "$email" : $email_error .= ", $email";
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
if ( isset( $_POST['subscribe'] ) ) {
|
|
||||||
if ( false !== $this->is_public( $clean_email ) ) {
|
|
||||||
( '' === $pub_sub_error ) ? $pub_sub_error = "$clean_email" : $pub_sub_error .= ", $clean_email";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ( $this->is_registered( $clean_email ) ) {
|
|
||||||
( '' === $reg_sub_error ) ? $reg_sub_error = "$clean_email" : $reg_sub_error .= ", $clean_email";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$this->add( $clean_email, true );
|
|
||||||
$message = __( 'Address(es) subscribed!', 'subscribe2' );
|
|
||||||
} elseif ( isset( $_POST['unsubscribe'] ) ) {
|
|
||||||
if ( false === $this->is_public( $clean_email ) || $this->is_registered( $clean_email ) ) {
|
|
||||||
( '' === $unsub_error ) ? $unsub_error = "$clean_email" : $unsub_error .= ", $clean_email";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$this->delete( $clean_email );
|
|
||||||
$message = __( 'Address(es) unsubscribed!', 'subscribe2' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( '' !== $reg_sub_error ) {
|
|
||||||
echo '<div id="message" class="error"><p><strong>' . esc_html__( 'Some emails were not processed, the following are already Registered Subscribers', 'subscribe2' ) . ':<br>' . esc_html( $reg_sub_error ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
if ( '' !== $pub_sub_error ) {
|
|
||||||
echo '<div id="message" class="error"><p><strong>' . esc_html__( 'Some emails were not processed, the following are already Public Subscribers', 'subscribe2' ) . ':<br>' . esc_html( $pub_sub_error ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
if ( '' !== $unsub_error ) {
|
|
||||||
echo '<div id="message" class="error"><p><strong>' . esc_html__( 'Some emails were not processed, the following were not in the database', 'subscribe2' ) . ':<br> ' . esc_html( $unsub_error ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
if ( '' !== $email_error ) {
|
|
||||||
echo '<div id="message" class="error"><p><strong>' . esc_html__( 'Some emails were not processed, the following were invalid email addresses', 'subscribe2' ) . ':<br> ' . esc_html( $email_error ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
if ( '' !== $message ) {
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html( $message ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
$_POST['what'] = 'confirmed';
|
|
||||||
} elseif ( isset( $_POST['remind'] ) ) {
|
|
||||||
$this->remind( $_POST['reminderemails'] );
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Reminder Email(s) Sent!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['sub_categories'] ) && 'subscribe' === $_POST['manage'] ) {
|
|
||||||
if ( isset( $_REQUEST['subscriber'] ) ) {
|
|
||||||
$this->subscribe_registered_users( implode( ",\r\n", $_REQUEST['subscriber'] ), $s2_request_category );
|
|
||||||
} else {
|
|
||||||
$this->subscribe_registered_users( $_POST['exportcsv'], $s2_request_category );
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Registered Users Subscribed!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['sub_categories'] ) && 'unsubscribe' === $_POST['manage'] ) {
|
|
||||||
if ( isset( $_REQUEST['subscriber'] ) ) {
|
|
||||||
$this->unsubscribe_registered_users( implode( ",\r\n", $_REQUEST['subscriber'] ), $s2_request_category );
|
|
||||||
} else {
|
|
||||||
$this->unsubscribe_registered_users( $_POST['exportcsv'], $s2_request_category );
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Registered Users Unsubscribed!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['sub_format'] ) ) {
|
|
||||||
if ( isset( $_REQUEST['subscriber'] ) ) {
|
|
||||||
$this->format_change( implode( ",\r\n", $_REQUEST['subscriber'] ), $_POST['format'] );
|
|
||||||
} else {
|
|
||||||
$this->format_change( $_POST['exportcsv'], $_POST['format'] );
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Format updated for Selected Registered Users!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
} elseif ( isset( $_POST['sub_digest'] ) ) {
|
|
||||||
if ( isset( $_REQUEST['subscriber'] ) ) {
|
|
||||||
$this->digest_change( implode( ",\r\n", $_REQUEST['subscriber'] ), $_POST['sub_category'] );
|
|
||||||
} else {
|
|
||||||
$this->digest_change( $_POST['exportcsv'], $_POST['sub_category'] );
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Digest Subscription updated for Selected Registered Users!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
// Get Registered Subscribers
|
|
||||||
$registered = $this->get_registered( 'return=emailid' );
|
|
||||||
$all_users = $this->get_all_registered( 'emailid' );
|
|
||||||
|
|
||||||
// safety check for our arrays
|
|
||||||
if ( '' === $registered ) {
|
|
||||||
$registered = array();
|
|
||||||
}
|
|
||||||
if ( '' === $all_users ) {
|
|
||||||
$all_users = array();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//Get Public Subscribers
|
|
||||||
$confirmed = $this->get_public();
|
|
||||||
$unconfirmed = $this->get_public( 0 );
|
|
||||||
// safety check for our arrays
|
|
||||||
if ( '' === $confirmed ) {
|
|
||||||
$confirmed = array();
|
|
||||||
}
|
|
||||||
if ( '' === $unconfirmed ) {
|
|
||||||
$unconfirmed = array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$reminderform = false;
|
|
||||||
if ( isset( $_REQUEST['what'] ) ) {
|
|
||||||
if ( 'public' === $_REQUEST['what'] ) {
|
|
||||||
$what = 'public';
|
|
||||||
$subscribers = array_merge( (array) $confirmed, (array) $unconfirmed );
|
|
||||||
} elseif ( 'confirmed' === $_REQUEST['what'] ) {
|
|
||||||
$what = 'confirmed';
|
|
||||||
$subscribers = $confirmed;
|
|
||||||
} elseif ( 'unconfirmed' === $_REQUEST['what'] ) {
|
|
||||||
$what = 'unconfirmed';
|
|
||||||
$subscribers = $unconfirmed;
|
|
||||||
if ( ! empty( $subscribers ) ) {
|
|
||||||
$reminderemails = implode( ',', $subscribers );
|
|
||||||
$reminderform = true;
|
|
||||||
}
|
|
||||||
} elseif ( is_numeric( $_REQUEST['what'] ) ) {
|
|
||||||
$what = intval( $_REQUEST['what'] );
|
|
||||||
$subscribers = $this->get_registered( "cats=$what&return=emailid" );
|
|
||||||
} elseif ( 'registered' === $_REQUEST['what'] ) {
|
|
||||||
$what = 'registered';
|
|
||||||
$subscribers = $registered;
|
|
||||||
} elseif ( 'all_users' === $_REQUEST['what'] ) {
|
|
||||||
$what = 'all_users';
|
|
||||||
$subscribers = $all_users;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( 'public' === $current_tab ) {
|
|
||||||
$what = 'public';
|
|
||||||
$subscribers = array_merge( (array) $confirmed, (array) $unconfirmed );
|
|
||||||
} else {
|
|
||||||
$what = 'all_users';
|
|
||||||
$subscribers = $all_users;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $_POST['s'] ) ) {
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
foreach ( $subscribers as $subscriber ) {
|
|
||||||
if ( is_numeric( stripos( $subscriber['user_email'], $_POST['s'] ) ) ) {
|
|
||||||
$result[] = $subscriber;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach ( $subscribers as $subscriber ) {
|
|
||||||
if ( is_numeric( stripos( $subscriber, $_POST['s'] ) ) ) {
|
|
||||||
$result[] = $subscriber;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$subscribers = $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
$s2_list_table->prepare_items();
|
|
||||||
|
|
||||||
// show our form
|
|
||||||
echo '<div class="wrap">';
|
|
||||||
echo '<h1>' . esc_html__( 'Subscribers', 'subscribe2' ) . '</h1>' . "\r\n";
|
|
||||||
$s2tabs = array(
|
|
||||||
'public' => __( 'Public Subscribers', 'subscribe2' ),
|
|
||||||
'registered' => __( 'Registered Subscribers', 'subscribe2' ),
|
|
||||||
);
|
|
||||||
echo '<h2 class="nav-tab-wrapper">';
|
|
||||||
foreach ( $s2tabs as $tab_key => $tab_caption ) {
|
|
||||||
$active = ( $current_tab === $tab_key ) ? 'nav-tab-active' : '';
|
|
||||||
echo '<a class="nav-tab ' . esc_attr( $active ) . '" href="' . esc_url( '?page=s2_tools&tab=' . $tab_key ) . '">' . esc_html( $tab_caption ) . '</a>';
|
|
||||||
}
|
|
||||||
echo '</h2>';
|
|
||||||
echo '<form method="post">' . "\r\n";
|
|
||||||
|
|
||||||
echo '<input type="hidden" name="s2_admin" />' . "\r\n";
|
|
||||||
switch ( $current_tab ) {
|
|
||||||
case 'public':
|
|
||||||
echo '<input type="hidden" id="s2_location" name="s2_location" value="public" />' . "\r\n";
|
|
||||||
echo '<div class="s2_admin" id="s2_add_subscribers">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Add/Remove Subscribers', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
echo '<p>' . esc_html__( 'Enter addresses, one per line or comma-separated', 'subscribe2' ) . '<br>' . "\r\n";
|
|
||||||
echo '<textarea rows="2" cols="80" name="addresses"></textarea></p>' . "\r\n";
|
|
||||||
echo '<input type="hidden" name="s2_admin" />' . "\r\n";
|
|
||||||
echo '<p class="submit" style="border-top: none;"><input type="submit" class="button-primary" name="subscribe" value="' . esc_attr( __( 'Subscribe', 'subscribe2' ) ) . '" />';
|
|
||||||
echo ' <input type="submit" class="button-primary" name="unsubscribe" value="' . esc_attr( __( 'Unsubscribe', 'subscribe2' ) ) . '" /></p>' . "\r\n";
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
|
|
||||||
// subscriber lists
|
|
||||||
echo '<div class="s2_admin" id="s2_current_subscribers">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Current Subscribers', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
echo '<br>';
|
|
||||||
$cats = $this->all_cats();
|
|
||||||
$cat_ids = array();
|
|
||||||
foreach ( $cats as $category ) {
|
|
||||||
$cat_ids[] = $category->term_id;
|
|
||||||
}
|
|
||||||
$exclude = array_merge( array( 'all', 'all_users', 'registered' ), $cat_ids );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'registered':
|
|
||||||
echo '<input type="hidden" id="s2_location" name="s2_location" value="registered" />' . "\r\n";
|
|
||||||
echo '<div class="s2_admin" id="s2_add_subscribers">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Add/Remove Subscribers', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
echo '<p class="submit" style="border-top: none;"><a class="button-primary" href="' . esc_url( admin_url( 'user-new.php' ) ) . '">' . esc_html__( 'Add Registered User', 'subscribe2' ) . '</a></p>' . "\r\n";
|
|
||||||
|
|
||||||
echo "</div>\r\n";
|
|
||||||
|
|
||||||
// subscriber lists
|
|
||||||
echo '<div class="s2_admin" id="s2_current_subscribers">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Current Subscribers', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
echo '<br>';
|
|
||||||
$exclude = array( 'all', 'public', 'confirmed', 'unconfirmed' );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// show the selected subscribers
|
|
||||||
echo '<table style="width: 100%; border-collapse: separate; border-spacing: 0px; *border-collapse: expression("separate", cellSpacing = "0px");"><tr>';
|
|
||||||
echo '<td style="width: 50%; text-align: left;">';
|
|
||||||
$this->display_subscriber_dropdown( $what, __( 'Filter', 'subscribe2' ), $exclude );
|
|
||||||
echo '</td>' . "\r\n";
|
|
||||||
if ( $reminderform ) {
|
|
||||||
echo '<td style="width: 25%; text-align: right;"><input type="hidden" name="reminderemails" value="' . esc_attr( $reminderemails ) . '" />' . "\r\n";
|
|
||||||
echo '<input type="submit" class="button-secondary" name="remind" value="' . esc_attr( __( 'Send Reminder Email', 'subscribe2' ) ) . '" /></td>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<td style="width: 25%;"></td>';
|
|
||||||
}
|
|
||||||
if ( ! empty( $subscribers ) ) {
|
|
||||||
if ( 'public' === $current_tab ) {
|
|
||||||
$exportcsv = implode( ",\r\n", $subscribers );
|
|
||||||
} else {
|
|
||||||
$exportcsv = '';
|
|
||||||
foreach ( $subscribers as $subscriber ) {
|
|
||||||
( '' === $exportcsv ) ? $exportcsv = $subscriber['user_email'] : $exportcsv .= ",\r\n" . $subscriber['user_email'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '<td style="width: 25%; text-align: right;"><input type="hidden" name="exportcsv" value="' . esc_attr( $exportcsv ) . '" />' . "\r\n";
|
|
||||||
echo '<input type="submit" class="button-secondary" name="csv" value="' . esc_attr( __( 'Save Emails to CSV File', 'subscribe2' ) ) . '" /></td>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<td style="width: 25%;"></td>';
|
|
||||||
}
|
|
||||||
echo '</tr></table>';
|
|
||||||
|
|
||||||
// output our subscriber table
|
|
||||||
$s2_list_table->search_box( __( 'Search', 'subscribe2' ), 'search_id' );
|
|
||||||
$s2_list_table->display();
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
|
|
||||||
// show bulk management form if filtered in some Registered Users
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
echo '<div class="s2_admin" id="s2_bulk_manage">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Bulk Management', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
if ( 'never' === $this->subscribe2_options['email_freq'] ) {
|
|
||||||
$categories = array();
|
|
||||||
if ( isset( $_POST['category'] ) ) {
|
|
||||||
$categories = $_POST['category'];
|
|
||||||
}
|
|
||||||
$manage = '';
|
|
||||||
if ( isset( $_POST['manage'] ) ) {
|
|
||||||
$manage = $_POST['manage'];
|
|
||||||
}
|
|
||||||
$format = '';
|
|
||||||
if ( isset( $_POST['format'] ) ) {
|
|
||||||
$format = $_POST['format'];
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Preferences for Registered Users selected above can be changed using this section.', 'subscribe2' ) . '<br>' . "\r\n";
|
|
||||||
echo '<strong><em style="color: red">' . esc_html__( 'Consider User Privacy as changes cannot be undone', 'subscribe2' ) . '</em></strong><br>' . "\r\n";
|
|
||||||
echo '<br>' . esc_html__( 'Action to perform', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="manage" value="subscribe"' . checked( $manage, 'subscribe', false ) . ' /> ' . esc_html__( 'Subscribe', 'subscribe2' ) . '</label> ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="manage" value="unsubscribe"' . checked( $manage, 'unsubscribe', false ) . ' /> ' . esc_html__( 'Unsubscribe', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
if ( '1' === $this->subscribe2_options['reg_override'] ) {
|
|
||||||
$s2_forms->display_category_form( $categories, 1 );
|
|
||||||
} else {
|
|
||||||
$s2_forms->display_category_form( $categories, 0 );
|
|
||||||
}
|
|
||||||
echo '<p class="submit"><button class="button-primary" name="sub_categories" onclick="return bmCheck();">' . esc_html__( 'Bulk Update Categories', 'subscribe2' ) . '</button></p>';
|
|
||||||
echo '<br>' . esc_html__( 'Send email as', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="format" value="html"' . checked( $format, 'html', false ) . ' /> ' . esc_html__( 'HTML - Full', 'subscribe2' ) . '</label> ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="format" value="html_excerpt"' . checked( $format, 'html_excerpt', false ) . ' /> ' . esc_html__( 'HTML - Excerpt', 'subscribe2' ) . '</label> ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="format" value="post"' . checked( $format, 'post', false ) . ' /> ' . esc_html__( 'Plain Text - Full', 'subscribe2' ) . '</label> ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="format" value="excerpt"' . checked( $format, 'excerpt', false ) . '/> ' . esc_html__( 'Plain Text - Excerpt', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '<p class="submit"><button class="button-primary" name="sub_format" onclick="return bmCheck();">' . esc_html__( 'Bulk Update Format', 'subscribe2' ) . '</button></p>';
|
|
||||||
} else {
|
|
||||||
$sub_cats = '';
|
|
||||||
if ( isset( $_POST['sub_category'] ) ) {
|
|
||||||
$sub_cats = $_POST['sub_category'];
|
|
||||||
}
|
|
||||||
echo esc_html__( 'Preferences for Registered Users selected above can be changed using this section.', 'subscribe2' ) . "<br>\r\n";
|
|
||||||
echo '<strong><em style="color: red">' . esc_html__( 'Consider User Privacy as changes cannot be undone.', 'subscribe2' ) . '</em></strong><br>' . "\r\n";
|
|
||||||
echo '<br>' . esc_html__( 'Subscribe Selected Users to receive a periodic digest notification', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="sub_category" value="digest"' . checked( $sub_cats, 'digest', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'Yes', 'subscribe2' ) . '</label> ' . "\r\n";
|
|
||||||
echo '<label><input type="radio" name="sub_category" value="-1"' . checked( $sub_cats, '-1', false ) . ' /> ';
|
|
||||||
echo esc_html__( 'No', 'subscribe2' ) . '</label>';
|
|
||||||
echo '<p class="submit"><button class="button-primary" name="sub_digest" onclick="return bmCheck();">' . esc_html__( 'Bulk Update Digest Subscription', 'subscribe2' ) . '</button></p>';
|
|
||||||
}
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '</form></div>' . "\r\n";
|
|
||||||
|
|
||||||
require ABSPATH . 'wp-admin/admin-footer.php';
|
|
||||||
// just to be sure
|
|
||||||
die;
|
|
@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
if ( ! function_exists( 'add_action' ) ) {
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once S2PATH . 'classes/class-s2-forms.php';
|
|
||||||
$s2_forms = new S2_Forms();
|
|
||||||
$s2_forms->init();
|
|
||||||
|
|
||||||
// was anything POSTed?
|
|
||||||
if ( isset( $_POST['s2_admin'] ) && 'user' === $_POST['s2_admin'] ) {
|
|
||||||
if ( false === wp_verify_nonce( $_REQUEST['_wpnonce'], 'subscribe2-user_subscribers' . S2VERSION ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Security error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
}
|
|
||||||
do_action( 's2_subscription_submit' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// show our form
|
|
||||||
echo '<div class="wrap">';
|
|
||||||
|
|
||||||
global $user_ID;
|
|
||||||
$userid = $s2_forms->get_userid();
|
|
||||||
$user = get_userdata( $userid );
|
|
||||||
|
|
||||||
if ( $userid === $user_ID ) {
|
|
||||||
echo '<h1>' . esc_html__( 'Your Notification Settings', 'subscribe2' ) . "</h1>\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<h1>' . esc_html__( 'Notification Settings for user:', 'subscribe2' ) . ' <span style="color: red;">' . esc_html( $user->display_name ) . '</span></h1>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
echo '<form method="post">';
|
|
||||||
wp_nonce_field( 'subscribe2-user_subscribers' . S2VERSION );
|
|
||||||
|
|
||||||
echo '<p>';
|
|
||||||
|
|
||||||
do_action( 's2_subscription_form', $userid );
|
|
||||||
|
|
||||||
// submit
|
|
||||||
echo '<p class="submit"><input type="submit" class="button-primary" name="submit" value="' . esc_attr( __( 'Update Preferences', 'subscribe2' ) ) . ' »" /></p>';
|
|
||||||
echo '</form>' . "\r\n";
|
|
||||||
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
|
|
||||||
require ABSPATH . 'wp-admin/admin-footer.php';
|
|
||||||
// just to be sure
|
|
||||||
die;
|
|
File diff suppressed because it is too large
Load Diff
@ -1,183 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
if ( ! class_exists( 'MO_Admin_Notice' ) ) {
|
|
||||||
|
|
||||||
class MO_Admin_Notice {
|
|
||||||
public function __construct() {
|
|
||||||
add_action( 'admin_notices', array( $this, 'admin_notice' ) );
|
|
||||||
add_action( 'network_admin_notices', array( $this, 'admin_notice' ) );
|
|
||||||
|
|
||||||
add_action( 'admin_init', array( $this, 'dismiss_admin_notice' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dismiss_admin_notice() {
|
|
||||||
if ( ! isset( $_GET['mo-adaction'] ) || 'mo_dismiss_adnotice' !== $_GET['mo-adaction'] ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = admin_url();
|
|
||||||
update_option( 'mo_dismiss_adnotice', 'true' );
|
|
||||||
|
|
||||||
wp_safe_redirect( $url );
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function admin_notice() {
|
|
||||||
|
|
||||||
global $pagenow;
|
|
||||||
|
|
||||||
if ( 'index.php' === $pagenow || ( isset( $_GET['page'] ) && false !== strpos( $_GET['page'], 's2_' ) ) ) {
|
|
||||||
|
|
||||||
if ( get_option( 'mo_dismiss_adnotice', 'false' ) === 'true' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $this->is_plugin_installed() && $this->is_plugin_active() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$dismiss_url = esc_url_raw(
|
|
||||||
add_query_arg(
|
|
||||||
array(
|
|
||||||
'mo-adaction' => 'mo_dismiss_adnotice',
|
|
||||||
),
|
|
||||||
admin_url()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$this->notice_css();
|
|
||||||
$install_url = wp_nonce_url(
|
|
||||||
admin_url( 'plugin-install.php?s=wemail&tab=search&type=term' ),
|
|
||||||
'install-plugin_mailoptin'
|
|
||||||
);
|
|
||||||
|
|
||||||
$activate_url = wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=wemail%2Fwemail.php' ), 'activate-plugin_wemail/wemail.php' );
|
|
||||||
?>
|
|
||||||
<div class="mo-admin-notice notice notice-success">
|
|
||||||
<div class="mo-notice-first-half">
|
|
||||||
<p>
|
|
||||||
<?php
|
|
||||||
printf(
|
|
||||||
// Translators: Mail Optin admin notice
|
|
||||||
__( 'Free email newsletter plugin that will %1$sincrease your email list subscribers%2$s and keep them engaged with %1$sautomated and schedule newsletters%2$s.', 'subscribe2' ),
|
|
||||||
'<span class="mo-stylize"><strong>',
|
|
||||||
'</strong></span>'
|
|
||||||
);
|
|
||||||
?>
|
|
||||||
</p>
|
|
||||||
<p style="text-decoration: underline;font-size: 12px;">Recommended by Subscribe2 plugin</p>
|
|
||||||
</div>
|
|
||||||
<div class="mo-notice-other-half">
|
|
||||||
<?php if ( ! $this->is_plugin_installed() ) : ?>
|
|
||||||
<a class="button button-primary button-hero" id="mo-install-mailoptin-plugin" href="<?php echo $install_url; ?>">
|
|
||||||
<?php _e( 'Install weMail Now for Free!', 'subscribe2' ); ?>
|
|
||||||
</a>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php if ( $this->is_plugin_installed() && ! $this->is_plugin_active() ) : ?>
|
|
||||||
<a class="button button-primary button-hero" id="mo-activate-mailoptin-plugin" href="<?php echo $activate_url; ?>">
|
|
||||||
<?php _e( 'Activate weMail Now!', 'subscribe2' ); ?>
|
|
||||||
</a>
|
|
||||||
<?php endif; ?>
|
|
||||||
<div class="mo-notice-learn-more">
|
|
||||||
<a target="_blank" href="https://getwemail.io">Learn more</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<a href="<?php echo $dismiss_url; ?>">
|
|
||||||
<button type="button" class="notice-dismiss">
|
|
||||||
<span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'subscribe2' ); ?>.</span>
|
|
||||||
</button>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function current_admin_url() {
|
|
||||||
$parts = wp_parse_url( home_url() );
|
|
||||||
$uri = $parts['scheme'] . '://' . $parts['host'];
|
|
||||||
|
|
||||||
if ( array_key_exists( 'port', $parts ) ) {
|
|
||||||
$uri .= ':' . $parts['port'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$uri .= add_query_arg( array() );
|
|
||||||
|
|
||||||
return $uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function is_plugin_installed() {
|
|
||||||
$installed_plugins = get_plugins();
|
|
||||||
|
|
||||||
return isset( $installed_plugins['wemail/wemail.php'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function is_plugin_active() {
|
|
||||||
return is_plugin_active( 'wemail/wemail.php' );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function notice_css() {
|
|
||||||
?>
|
|
||||||
<style type="text/css">
|
|
||||||
.mo-admin-notice {
|
|
||||||
background: #fff;
|
|
||||||
color: #000;
|
|
||||||
border-left-color: #46b450;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-admin-notice .notice-dismiss:before {
|
|
||||||
color: #72777c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-admin-notice .mo-stylize {
|
|
||||||
line-height: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-admin-notice .button-primary {
|
|
||||||
background: #006799;
|
|
||||||
text-shadow: none;
|
|
||||||
border: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-notice-first-half {
|
|
||||||
width: 66%;
|
|
||||||
display: inline-block;
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-notice-other-half {
|
|
||||||
width: 33%;
|
|
||||||
display: inline-block;
|
|
||||||
padding: 20px 0;
|
|
||||||
position: absolute;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-notice-first-half p {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-notice-learn-more a {
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mo-notice-learn-more {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function instance() {
|
|
||||||
static $instance = null;
|
|
||||||
|
|
||||||
if ( is_null( $instance ) ) {
|
|
||||||
$instance = new self();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MO_Admin_Notice::instance();
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,174 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Ajax {
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
// maybe use dev scripts
|
|
||||||
$this->script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
|
|
||||||
if ( is_admin() ) {
|
|
||||||
add_action( 'wp_ajax_nopriv_subscribe2_form', array( &$this, 's2_ajax_form_handler' ) );
|
|
||||||
add_action( 'wp_ajax_nopriv_subscribe2_submit', array( &$this, 's2_ajax_submit_handler' ) );
|
|
||||||
add_filter( 's2_ajax_form', array( &$this, 's2_ajax_form_class' ), 1 );
|
|
||||||
add_filter( 'safe_style_css', array( &$this, 's2_safe_css' ) );
|
|
||||||
|
|
||||||
global $s2_frontend;
|
|
||||||
require_once S2PATH . 'classes/class-s2-core.php';
|
|
||||||
require_once S2PATH . 'classes/class-s2-frontend.php';
|
|
||||||
$s2_frontend = new S2_Frontend();
|
|
||||||
|
|
||||||
$s2_frontend->subscribe2_options = get_option( 'subscribe2_options' );
|
|
||||||
} else {
|
|
||||||
// add actions for ajax form if enabled
|
|
||||||
add_action( 'wp_enqueue_scripts', array( &$this, 'add_ajax' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add jQuery code and CSS to front pages for ajax form
|
|
||||||
*/
|
|
||||||
public function add_ajax() {
|
|
||||||
// enqueue the jQuery script we need and let WordPress handle the dependencies
|
|
||||||
wp_enqueue_script( 'jquery-ui-dialog' );
|
|
||||||
$css = apply_filters( 's2_jqueryui_css', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/ui-darkness/jquery-ui.css' );
|
|
||||||
if ( is_ssl() ) {
|
|
||||||
$css = str_replace( 'http:', 'https:', $css );
|
|
||||||
}
|
|
||||||
wp_register_style( 'jquery-ui-style', $css, array(), '1.11.4' );
|
|
||||||
wp_enqueue_style( 'jquery-ui-style' );
|
|
||||||
wp_register_script( 's2-ajax', S2URL . 'include/s2-ajax' . $this->script_debug . '.js', array(), '1.3', true );
|
|
||||||
$translation_array = array(
|
|
||||||
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
|
||||||
'title' => __( 'Subscribe to this blog', 'subscribe2' ),
|
|
||||||
'nonce' => wp_create_nonce( 's2_ajax_form_nonce' ),
|
|
||||||
);
|
|
||||||
wp_localize_script( 's2-ajax', 's2AjaxScriptStrings', $translation_array );
|
|
||||||
wp_enqueue_script( 's2-ajax' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ajax form handler
|
|
||||||
*/
|
|
||||||
public function s2_ajax_form_handler() {
|
|
||||||
require_once ABSPATH . '/wp-includes/shortcodes.php';
|
|
||||||
|
|
||||||
$response = str_replace( ':', '&', $_POST['data'] );
|
|
||||||
$response = str_replace( '-', '=', $response );
|
|
||||||
wp_parse_str( $response, $atts );
|
|
||||||
|
|
||||||
global $s2_frontend;
|
|
||||||
$content = $s2_frontend->widget_shortcode( $atts );
|
|
||||||
$content = apply_filters( 's2_ajax_form', $content );
|
|
||||||
|
|
||||||
$allowed_tags = array(
|
|
||||||
'form' => array(
|
|
||||||
'action' => true,
|
|
||||||
'id' => true,
|
|
||||||
'method' => true,
|
|
||||||
'name' => true,
|
|
||||||
),
|
|
||||||
'span' => array(
|
|
||||||
'style' => true,
|
|
||||||
),
|
|
||||||
'label' => array(
|
|
||||||
'for' => true,
|
|
||||||
),
|
|
||||||
'input' => array(
|
|
||||||
'id' => true,
|
|
||||||
'name' => true,
|
|
||||||
'onblur' => true,
|
|
||||||
'onfocus' => true,
|
|
||||||
'size' => true,
|
|
||||||
'type' => true,
|
|
||||||
'value' => true,
|
|
||||||
),
|
|
||||||
'p' => true,
|
|
||||||
'br' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
echo wp_kses( $content, $allowed_tags );
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ajax submit handler
|
|
||||||
*/
|
|
||||||
public function s2_ajax_submit_handler() {
|
|
||||||
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 's2_ajax_form_nonce' ) ) {
|
|
||||||
echo '<p>' . esc_html__( 'There was an error validating your request. Please try again later.', 'subscribe2' ) . '</p>';
|
|
||||||
wp_die();
|
|
||||||
}
|
|
||||||
$data = $_POST['data'];
|
|
||||||
if ( ( isset( $data['firstname'] ) && '' !== $data['firstname'] ) || ( isset( $data['lastname'] ) && '' !== $data['lastname'] ) || ( isset( $data['uri'] ) && 'http://' !== $data['uri'] ) ) {
|
|
||||||
// looks like some invisible-to-user fields were changed; falsely report success
|
|
||||||
echo '<p>' . esc_html__( 'A confirmation message is on its way!', 'subscribe2' ) . '</p>';
|
|
||||||
wp_die();
|
|
||||||
}
|
|
||||||
|
|
||||||
global $s2_frontend, $wpdb;
|
|
||||||
$s2_frontend->email = $s2_frontend->sanitize_email( $data['email'] );
|
|
||||||
$s2_frontend->ip = $data['ip'];
|
|
||||||
if ( false === $s2_frontend->validate_email( $s2_frontend->email ) ) {
|
|
||||||
echo '<p>' . esc_html__( 'Sorry, but that does not look like an email address to me.', 'subscribe2' ) . '</p>';
|
|
||||||
} elseif ( $s2_frontend->is_barred( $s2_frontend->email ) ) {
|
|
||||||
echo '<p>' . esc_html__( 'Sorry, email addresses at that domain are currently barred due to spam, please use an alternative email address.', 'subscribe2' ) . '</p>';
|
|
||||||
} else {
|
|
||||||
if ( is_int( $s2_frontend->lockout ) && $s2_frontend->lockout > 0 ) {
|
|
||||||
$date = gmdate( 'H:i:s.u', $s2_frontend->lockout );
|
|
||||||
$ips = $wpdb->get_col( $wpdb->prepare( "SELECT ip FROM $wpdb->subscribe2 WHERE date = CURDATE() AND time > SUBTIME(CURTIME(), %s)", $date ) );
|
|
||||||
if ( in_array( $s2_frontend->ip, $ips, true ) ) {
|
|
||||||
echo '<p>' . esc_html__( 'Slow down, you move too fast.', 'subscribe2' ) . '</p>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$check = $wpdb->get_var( $wpdb->prepare( "SELECT user_email FROM $wpdb->users WHERE user_email = %s", $s2_frontend->email ) );
|
|
||||||
if ( null !== $check ) {
|
|
||||||
// Translators: Link to login page
|
|
||||||
printf( wp_kses_post( __( 'To manage your subscription options please <a href="%1$s">login.</a>', 'subscribe2' ) ), esc_url( get_option( 'siteurl' ) . '/wp-login.php' ) );
|
|
||||||
}
|
|
||||||
if ( 'subscribe' === $data['button'] ) {
|
|
||||||
if ( '1' !== $s2_frontend->is_public( $s2_frontend->email ) ) {
|
|
||||||
// the user is unknown or inactive
|
|
||||||
$s2_frontend->add( $s2_frontend->email );
|
|
||||||
$status = $s2_frontend->send_confirm( 'add' );
|
|
||||||
if ( $status ) {
|
|
||||||
echo '<p>' . esc_html__( 'A confirmation message is on its way!', 'subscribe2' ) . '</p>';
|
|
||||||
} else {
|
|
||||||
echo '<p>' . esc_html__( 'Sorry, there seems to be an error on the server. Please try again later.', 'subscribe2' ) . '</p>';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// they're already subscribed
|
|
||||||
echo '<p>' . esc_html__( 'That email address is already subscribed.', 'subscribe2' ) . '</p>';
|
|
||||||
}
|
|
||||||
} elseif ( 'unsubscribe' === $data['button'] ) {
|
|
||||||
if ( false === $s2_frontend->is_public( $s2_frontend->email ) ) {
|
|
||||||
echo '<p>' . esc_html__( 'That email address is not subscribed.', 'subscribe2' ) . '</p>';
|
|
||||||
} else {
|
|
||||||
$status = $s2_frontend->send_confirm( 'del' );
|
|
||||||
if ( $status ) {
|
|
||||||
echo '<p>' . esc_html__( 'A confirmation message is on its way!', 'subscribe2' ) . '</p>';
|
|
||||||
} else {
|
|
||||||
echo '<p>' . esc_html__( 'Sorry, there seems to be an error on the server. Please try again later.', 'subscribe2' ) . '</p>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wp_die();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter to add ajax id to form
|
|
||||||
*/
|
|
||||||
public function s2_ajax_form_class( $content ) {
|
|
||||||
$content = str_replace( '<form', '<form id="s2ajaxform"', $content );
|
|
||||||
$content = str_replace( 'wp-login.php"', 'wp-login.php" style="text-decoration: underline;"', $content );
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add display attribute to safe CSS
|
|
||||||
*/
|
|
||||||
public function s2_safe_css( $style_attributes ) {
|
|
||||||
$style_attributes[] = 'display';
|
|
||||||
return $style_attributes;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,211 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Block_Editor {
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
// maybe use dev scripts
|
|
||||||
$this->script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
|
|
||||||
|
|
||||||
add_action( 'init', array( &$this, 'register_s2_meta' ) );
|
|
||||||
add_action( 'rest_api_init', array( $this, 'register_preview_endpoint' ) );
|
|
||||||
add_action( 'rest_api_init', array( $this, 'register_resend_endpoint' ) );
|
|
||||||
add_action( 'rest_api_init', array( $this, 'register_settings_endpoint' ) );
|
|
||||||
|
|
||||||
if ( is_admin() ) {
|
|
||||||
add_action( 'enqueue_block_editor_assets', array( &$this, 'gutenberg_block_editor_assets' ), 6 );
|
|
||||||
add_action( 'enqueue_block_editor_assets', array( &$this, 'gutenberg_i18n' ), 6 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register _s2mail meta data for Block Editor
|
|
||||||
*/
|
|
||||||
public function register_s2_meta() {
|
|
||||||
register_meta(
|
|
||||||
'post',
|
|
||||||
'_s2mail',
|
|
||||||
array(
|
|
||||||
'show_in_rest' => true,
|
|
||||||
'single' => true,
|
|
||||||
'type' => 'string',
|
|
||||||
'auth_callback' => function() {
|
|
||||||
return current_user_can( 'edit_posts' );
|
|
||||||
},
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register REST endpoints for preview email
|
|
||||||
*/
|
|
||||||
public function register_preview_endpoint() {
|
|
||||||
register_rest_route(
|
|
||||||
's2/v1',
|
|
||||||
'/preview/(?P<id>[0-9]+)',
|
|
||||||
array(
|
|
||||||
'methods' => WP_REST_Server::READABLE,
|
|
||||||
'callback' => array( $this, 'preview' ),
|
|
||||||
'args' => array(
|
|
||||||
'id' => array(
|
|
||||||
'validate_callback' => function( $param ) {
|
|
||||||
return is_numeric( $param );
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'permission_callback' => function () {
|
|
||||||
return current_user_can( 'edit_posts' );
|
|
||||||
},
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register REST endpoints for resending emails
|
|
||||||
*/
|
|
||||||
public function register_resend_endpoint() {
|
|
||||||
register_rest_route(
|
|
||||||
's2/v1',
|
|
||||||
'/resend/(?P<id>[0-9]+)',
|
|
||||||
array(
|
|
||||||
'methods' => WP_REST_Server::READABLE,
|
|
||||||
'callback' => array( $this, 'resend' ),
|
|
||||||
'args' => array(
|
|
||||||
'id' => array(
|
|
||||||
'validate_callback' => function( $param ) {
|
|
||||||
return is_numeric( $param );
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'permission_callback' => function () {
|
|
||||||
return current_user_can( 'edit_posts' );
|
|
||||||
},
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register REST endpoints for surfacing settings
|
|
||||||
*/
|
|
||||||
public function register_settings_endpoint() {
|
|
||||||
register_rest_route(
|
|
||||||
's2/v1',
|
|
||||||
'/settings/(?P<setting>[a-z0-9_]+)',
|
|
||||||
array(
|
|
||||||
'methods' => WP_REST_Server::READABLE,
|
|
||||||
'callback' => array( $this, 'setting' ),
|
|
||||||
'args' => array(
|
|
||||||
'id' => array(
|
|
||||||
'validate_callback' => function( $param ) {
|
|
||||||
return preg_match( '/^[a-z0-9_]+$/', $param ) > 0;
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'permission_callback' => function () {
|
|
||||||
return current_user_can( 'edit_posts' );
|
|
||||||
},
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to trigger Preview email on REST API request
|
|
||||||
*/
|
|
||||||
public function preview( $data ) {
|
|
||||||
global $mysubscribe2;
|
|
||||||
$post = get_post( intval( $data['id'] ) );
|
|
||||||
|
|
||||||
$current_user = wp_get_current_user();
|
|
||||||
if ( 0 === $current_user->ID ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'never' !== $this->subscribe2_options['email_freq'] ) {
|
|
||||||
$mysubscribe2->subscribe2_cron( $current_user->user_email );
|
|
||||||
} else {
|
|
||||||
$mysubscribe2->publish( $post, $current_user->user_email );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to trigger resending of email on REST API request
|
|
||||||
*/
|
|
||||||
public function resend( $data ) {
|
|
||||||
global $mysubscribe2;
|
|
||||||
$post = get_post( intval( $data['id'] ) );
|
|
||||||
|
|
||||||
$current_user = wp_get_current_user();
|
|
||||||
if ( 0 === $current_user->ID ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$mysubscribe2->publish( $post );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to return value for passed setting
|
|
||||||
*/
|
|
||||||
public function setting( $data ) {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( array_key_exists( $data['setting'], $mysubscribe2->subscribe2_options ) ) {
|
|
||||||
return $mysubscribe2->subscribe2_options[ $data['setting'] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enqueue Block Editor assets
|
|
||||||
*/
|
|
||||||
public function gutenberg_block_editor_assets() {
|
|
||||||
wp_enqueue_script(
|
|
||||||
'subscribe2-shortcode',
|
|
||||||
S2URL . 'gutenberg/shortcode' . $this->script_debug . '.js',
|
|
||||||
array( 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-components', 'wp-editor' ),
|
|
||||||
'1.1',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
register_block_type(
|
|
||||||
'subscribe2-html/shortcode',
|
|
||||||
array(
|
|
||||||
'editor_script' => 'subscribe2-shortcode',
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
wp_enqueue_script(
|
|
||||||
'subscribe2-sidebar',
|
|
||||||
S2URL . 'gutenberg/sidebar' . $this->script_debug . '.js',
|
|
||||||
array( 'wp-plugins', 'wp-element', 'wp-i18n', 'wp-edit-post', 'wp-components', 'wp-data', 'wp-compose', 'wp-api-fetch' ),
|
|
||||||
'1.1',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle translation of Block Editor assets
|
|
||||||
*/
|
|
||||||
public function gutenberg_i18n() {
|
|
||||||
$translations = get_translations_for_domain( 'subscribe2' );
|
|
||||||
|
|
||||||
$locale_data = array(
|
|
||||||
'' => array(
|
|
||||||
'domain' => 'subscribe2',
|
|
||||||
'lang' => get_user_locale(),
|
|
||||||
'plural_forms' => 'nplurals=2; plural=n != 1;',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $translations->entries as $msgid => $entry ) {
|
|
||||||
$locale_data[ $msgid ] = $entry->translations;
|
|
||||||
}
|
|
||||||
|
|
||||||
wp_add_inline_script(
|
|
||||||
'wp-i18n',
|
|
||||||
'wp.i18n.setLocaleData( ' . wp_json_encode( $locale_data ) . ', "subscribe2" );'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,119 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Counter_Widget extends WP_Widget {
|
|
||||||
/**
|
|
||||||
* Declares the S2_Counter_widget class.
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
$widget_options = array(
|
|
||||||
'classname' => 's2_counter',
|
|
||||||
'description' => esc_html__( 'Subscriber Counter widget for Subscribe2', 'subscribe2' ),
|
|
||||||
'customize_selective_refresh' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
$control_options = array(
|
|
||||||
'width' => 250,
|
|
||||||
'height' => 500,
|
|
||||||
);
|
|
||||||
parent::__construct( 's2_counter', esc_html__( 'Subscribe2 Counter', 'subscribe2' ), $widget_options, $control_options );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays the Widget
|
|
||||||
*/
|
|
||||||
public function widget( $args, $instance ) {
|
|
||||||
$title = empty( $instance['title'] ) ? 'Subscriber Count' : $instance['title'];
|
|
||||||
$s2w_bg = empty( $instance['s2w_bg'] ) ? '#e3dacf' : $instance['s2w_bg'];
|
|
||||||
$s2w_fg = empty( $instance['s2w_fg'] ) ? '#345797' : $instance['s2w_fg'];
|
|
||||||
$s2w_width = empty( $instance['s2w_width'] ) ? '82' : $instance['s2w_width'];
|
|
||||||
$s2w_height = empty( $instance['s2w_height'] ) ? '16' : $instance['s2w_height'];
|
|
||||||
$s2w_font = empty( $instance['s2w_font'] ) ? '11' : $instance['s2w_font'];
|
|
||||||
|
|
||||||
echo wp_kses_post( $args['before_widget'] );
|
|
||||||
if ( ! empty( $title ) ) {
|
|
||||||
echo wp_kses_post( $args['before_title'] ) . esc_html( $title ) . wp_kses_post( $args['after_title'] );
|
|
||||||
}
|
|
||||||
global $mysubscribe2;
|
|
||||||
$registered = $mysubscribe2->get_registered();
|
|
||||||
$confirmed = $mysubscribe2->get_public();
|
|
||||||
$count = ( count( $registered ) + count( $confirmed ) );
|
|
||||||
echo wp_kses_post( '<ul><div style="text-align:center; background-color:' . $s2w_bg . '; color:' . $s2w_fg . '; width:' . $s2w_width . 'px; height:' . $s2w_height . 'px; font:' . $s2w_font . 'pt Verdana, Arial, Helvetica, sans-serif; vertical-align:middle; padding:3px; border:1px solid #444;">' );
|
|
||||||
echo esc_html( $count );
|
|
||||||
echo '</div></ul>';
|
|
||||||
echo wp_kses_post( $args['after_widget'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the widgets settings.
|
|
||||||
*/
|
|
||||||
public function update( $new_instance, $old_instance ) {
|
|
||||||
$instance = $old_instance;
|
|
||||||
$instance['title'] = wp_strip_all_tags( stripslashes( $new_instance['title'] ) );
|
|
||||||
$instance['s2w_bg'] = wp_strip_all_tags( stripslashes( $new_instance['s2w_bg'] ) );
|
|
||||||
$instance['s2w_fg'] = wp_strip_all_tags( stripslashes( $new_instance['s2w_fg'] ) );
|
|
||||||
$instance['s2w_width'] = wp_strip_all_tags( stripslashes( $new_instance['s2w_width'] ) );
|
|
||||||
$instance['s2w_height'] = wp_strip_all_tags( stripslashes( $new_instance['s2w_height'] ) );
|
|
||||||
$instance['s2w_font'] = wp_strip_all_tags( stripslashes( $new_instance['s2w_font'] ) );
|
|
||||||
|
|
||||||
return $instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the edit form for the widget.
|
|
||||||
*/
|
|
||||||
public function form( $instance ) {
|
|
||||||
// set some defaults
|
|
||||||
$options = get_option( 'widget_s2counter' );
|
|
||||||
if ( false === $options ) {
|
|
||||||
$defaults = array(
|
|
||||||
'title' => 'Subscriber Count',
|
|
||||||
's2w_bg' => '#e3dacf',
|
|
||||||
's2w_fg' => '#345797',
|
|
||||||
's2w_width' => '82',
|
|
||||||
's2w_height' => '16',
|
|
||||||
's2w_font' => '11',
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$defaults = array(
|
|
||||||
'title' => $options['title'],
|
|
||||||
's2w_bg' => $options['s2w_bg'],
|
|
||||||
's2w_fg' => $options['s2w_fg'],
|
|
||||||
's2w_width' => $options['s2w_width'],
|
|
||||||
's2w_height' => $options['s2w_height'],
|
|
||||||
's2w_font' => $options['s2w_font'],
|
|
||||||
);
|
|
||||||
delete_option( 'widget_s2counter' );
|
|
||||||
}
|
|
||||||
$instance = wp_parse_args( (array) $instance, $defaults );
|
|
||||||
// Be sure you format your options to be valid HTML attributes.
|
|
||||||
$s2w_title = htmlspecialchars( $instance['title'], ENT_QUOTES );
|
|
||||||
$s2w_bg = htmlspecialchars( $instance['s2w_bg'], ENT_QUOTES );
|
|
||||||
$s2w_fg = htmlspecialchars( $instance['s2w_fg'], ENT_QUOTES );
|
|
||||||
$s2w_width = htmlspecialchars( $instance['s2w_width'], ENT_QUOTES );
|
|
||||||
$s2w_height = htmlspecialchars( $instance['s2w_height'], ENT_QUOTES );
|
|
||||||
$s2w_font = htmlspecialchars( $instance['s2w_font'], ENT_QUOTES );
|
|
||||||
echo '<div>' . "\r\n";
|
|
||||||
echo '<fieldset><legend><label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">' . esc_html__( 'Widget Title', 'subscribe2' ) . '</label></legend>' . "\r\n";
|
|
||||||
echo '<input type="text" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" value="' . esc_attr( $s2w_title ) . '" />' . "\r\n";
|
|
||||||
echo '</fieldset>' . "\r\n";
|
|
||||||
|
|
||||||
echo '<fieldset>' . "\r\n";
|
|
||||||
echo '<legend>' . esc_html__( 'Color Scheme', 'subscribe2' ) . '</legend>' . "\r\n";
|
|
||||||
echo '<label>' . "\r\n";
|
|
||||||
echo '<input type="text" name="' . esc_attr( $this->get_field_name( 's2w_bg' ) ) . '" id="' . esc_attr( $this->get_field_id( 's2w_bg' ) ) . '" maxlength="6" value="' . esc_attr( $s2w_bg ) . '" class="colorpickerField" style="width:60px;" /> ' . esc_html__( 'Body', 'subscribe2' ) . '</label><br>' . "\r\n";
|
|
||||||
echo '<label>' . "\r\n";
|
|
||||||
echo '<input type="text" name="' . esc_attr( $this->get_field_name( 's2w_fg' ) ) . '" id="' . esc_attr( $this->get_field_id( 's2w_fg' ) ) . '" maxlength="6" value="' . esc_attr( $s2w_fg ) . '" class="colorpickerField" style="width:60px;" /> ' . esc_html__( 'Text', 'subscribe2' ) . '</label><br>' . "\r\n";
|
|
||||||
echo '<div class="s2_colorpicker" id ="' . esc_attr( $this->get_field_id( 's2_colorpicker' ) ) . '"></div>';
|
|
||||||
echo '</fieldset>';
|
|
||||||
|
|
||||||
echo '<fieldset>' . "\r\n";
|
|
||||||
echo '<legend>' . esc_html__( 'Width, Height and Font Size', 'subscribe2' ) . '</legend>' . "\r\n";
|
|
||||||
echo '<table style="border:0; padding:0; margin:0 0 12px 0; border-collapse:collapse;" align="center">' . "\r\n";
|
|
||||||
echo '<tr><td><label for="' . esc_attr( $this->get_field_id( 's2w_width' ) ) . '">' . esc_html__( 'Width', 'subscribe2' ) . '</label></td>' . "\r\n";
|
|
||||||
echo '<td><input type="text" name="' . esc_attr( $this->get_field_name( 's2w_width' ) ) . '" id="' . esc_attr( $this->get_field_id( 's2w_width' ) ) . '" value="' . esc_attr( $s2w_width ) . '" /></td></tr>' . "\r\n";
|
|
||||||
echo '<tr><td><label for="' . esc_attr( $this->get_field_id( 's2w_height' ) ) . '">' . esc_html__( 'Height', 'subscribe2' ) . '</label></td>' . "\r\n";
|
|
||||||
echo '<td><input type="text" name="' . esc_attr( $this->get_field_name( 's2w_height' ) ) . '" id="' . esc_attr( $this->get_field_id( 's2w_height' ) ) . '" value="' . esc_attr( $s2w_height ) . '" /></td></tr>' . "\r\n";
|
|
||||||
echo '<tr><td><label for="' . esc_attr( $this->get_field_id( 's2w_font' ) ) . '">' . esc_html__( 'Font', 'subscribe2' ) . '</label></td>' . "\r\n";
|
|
||||||
echo '<td><input type="text" name="' . esc_attr( $this->get_field_name( 's2w_font' ) ) . '" id="' . esc_attr( $this->get_field_id( 's2w_font' ) ) . '" value="' . esc_attr( $s2w_font ) . '" /></td></tr>' . "\r\n";
|
|
||||||
echo '</table></fieldset></div>' . "\r\n";
|
|
||||||
}
|
|
||||||
}// end S2_Counter_widget class
|
|
@ -1,198 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Form_Widget extends WP_Widget {
|
|
||||||
|
|
||||||
// Display the widget’s instance in the REST API
|
|
||||||
public $show_instance_in_rest = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declares the Subscribe2 widget class.
|
|
||||||
*/
|
|
||||||
public function __construct() {
|
|
||||||
$widget_ops = array(
|
|
||||||
'classname' => 's2_form_widget',
|
|
||||||
'description' => esc_html__( 'Sidebar Widget for Subscribe2', 'subscribe2' ),
|
|
||||||
'customize_selective_refresh' => true,
|
|
||||||
'show_instance_in_rest' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
// add_filter( 'widget_text', 'shortcode_unautop' );
|
|
||||||
// add_filter( 'widget_text', 'do_shortcode' );
|
|
||||||
|
|
||||||
$control_ops = array(
|
|
||||||
'width' => 250,
|
|
||||||
'height' => 300,
|
|
||||||
);
|
|
||||||
parent::__construct( 's2_form_widget', esc_html__( 'Subscribe2 Widget', 'subscribe2' ), $widget_ops, $control_ops );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays the Widget
|
|
||||||
*/
|
|
||||||
public function widget( $args, $instance ) {
|
|
||||||
$title = empty( $instance['title'] ) ? __( 'Subscribe2', 'subscribe2' ) : $instance['title'];
|
|
||||||
$div = empty( $instance['div'] ) ? 'search' : $instance['div'];
|
|
||||||
$widgetprecontent = empty( $instance['widgetprecontent'] ) ? '' : $instance['widgetprecontent'];
|
|
||||||
$widgetpostcontent = empty( $instance['widgetpostcontent'] ) ? '' : $instance['widgetpostcontent'];
|
|
||||||
$textbox_size = empty( $instance['size'] ) ? 20 : $instance['size'];
|
|
||||||
$hidebutton = empty( $instance['hidebutton'] ) ? 'none' : $instance['hidebutton'];
|
|
||||||
$postto = empty( $instance['postto'] ) ? '' : $instance['postto'];
|
|
||||||
$js = empty( $instance['js'] ) ? '' : $instance['js'];
|
|
||||||
$noantispam = empty( $instance['noantispam'] ) ? '' : $instance['noantispam'];
|
|
||||||
$nowrap = empty( $instance['nowrap'] ) ? '' : $instance['nowrap'];
|
|
||||||
$hide = '';
|
|
||||||
if ( 'subscribe' === $hidebutton || 'unsubscribe' === $hidebutton ) {
|
|
||||||
$hide = ' hide="' . $hidebutton . '"';
|
|
||||||
} elseif ( 'link' === $hidebutton ) {
|
|
||||||
$hide = ' link="' . __( '(Un)Subscribe to Posts', 'subscribe2' ) . '"';
|
|
||||||
}
|
|
||||||
$postid = '';
|
|
||||||
if ( ! empty( $postto ) ) {
|
|
||||||
$postid = ' id="' . $postto . '"';
|
|
||||||
}
|
|
||||||
$size = ' size="' . $textbox_size . '"';
|
|
||||||
$nojs = '';
|
|
||||||
if ( $js ) {
|
|
||||||
$nojs = ' nojs="true"';
|
|
||||||
}
|
|
||||||
if ( $noantispam ) {
|
|
||||||
$noantispam = ' noantispam="true"';
|
|
||||||
}
|
|
||||||
if ( $nowrap ) {
|
|
||||||
$nowrap = ' wrap="false"';
|
|
||||||
}
|
|
||||||
$shortcode = '[subscribe2' . $hide . $postid . $size . $nojs . $noantispam . $nowrap . ' widget="true"]';
|
|
||||||
echo wp_kses_post( $args['before_widget'] );
|
|
||||||
if ( ! empty( $title ) ) {
|
|
||||||
echo wp_kses_post( $args['before_title'] ) . esc_attr( $title ) . wp_kses_post( $args['after_title'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<div class="' . esc_attr( $div ) . '">';
|
|
||||||
if ( ! empty( $widgetprecontent ) ) {
|
|
||||||
echo wp_kses_post( $widgetprecontent );
|
|
||||||
}
|
|
||||||
echo do_shortcode( $shortcode );
|
|
||||||
|
|
||||||
if ( ! empty( $widgetpostcontent ) ) {
|
|
||||||
echo wp_kses_post( $widgetpostcontent );
|
|
||||||
}
|
|
||||||
echo '</div>';
|
|
||||||
echo wp_kses_post( $args['after_widget'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the widgets settings.
|
|
||||||
*/
|
|
||||||
public function update( $new_instance, $old_instance ) {
|
|
||||||
$instance = $old_instance;
|
|
||||||
$instance['title'] = wp_strip_all_tags( stripslashes( $new_instance['title'] ) );
|
|
||||||
$instance['div'] = wp_strip_all_tags( stripslashes( $new_instance['div'] ) );
|
|
||||||
$instance['widgetprecontent'] = stripslashes( $new_instance['widgetprecontent'] );
|
|
||||||
$instance['widgetpostcontent'] = stripslashes( $new_instance['widgetpostcontent'] );
|
|
||||||
$instance['size'] = intval( stripslashes( $new_instance['size'] ) );
|
|
||||||
$instance['hidebutton'] = wp_strip_all_tags( stripslashes( $new_instance['hidebutton'] ) );
|
|
||||||
$instance['postto'] = stripslashes( $new_instance['postto'] );
|
|
||||||
$instance['js'] = stripslashes( $new_instance['js'] );
|
|
||||||
$instance['noantispam'] = stripslashes( $new_instance['noantispam'] );
|
|
||||||
$instance['nowrap'] = stripslashes( $new_instance['nowrap'] );
|
|
||||||
|
|
||||||
return $instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the edit form for the widget.
|
|
||||||
*/
|
|
||||||
public function form( $instance ) {
|
|
||||||
// set some defaults, getting any old options first
|
|
||||||
$options = get_option( 'widget_subscribe2widget' );
|
|
||||||
if ( false === $options ) {
|
|
||||||
$defaults = array(
|
|
||||||
'title' => 'Subscribe2',
|
|
||||||
'div' => 'search',
|
|
||||||
'widgetprecontent' => '',
|
|
||||||
'widgetpostcontent' => '',
|
|
||||||
'size' => 20,
|
|
||||||
'hidebutton' => 'none',
|
|
||||||
'postto' => '',
|
|
||||||
'js' => '',
|
|
||||||
'noantispam' => '',
|
|
||||||
'nowrap' => '',
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$defaults = array(
|
|
||||||
'title' => $options['title'],
|
|
||||||
'div' => $options['div'],
|
|
||||||
'widgetprecontent' => $options['widgetprecontent'],
|
|
||||||
'widgetpostcontent' => $options['widgetpostcontent'],
|
|
||||||
'size' => $options['size'],
|
|
||||||
'hidebutton' => $options['hidebutton'],
|
|
||||||
'postto' => $options['postto'],
|
|
||||||
'js' => $options['js'],
|
|
||||||
'noantispam' => $options['noantispam'],
|
|
||||||
'nowrap' => $options['nowrap'],
|
|
||||||
);
|
|
||||||
delete_option( 'widget_subscribe2widget' );
|
|
||||||
}
|
|
||||||
// code to obtain old settings too
|
|
||||||
$instance = wp_parse_args( (array) $instance, $defaults );
|
|
||||||
|
|
||||||
$title = htmlspecialchars( $instance['title'], ENT_QUOTES );
|
|
||||||
$div = htmlspecialchars( $instance['div'], ENT_QUOTES );
|
|
||||||
$widgetprecontent = htmlspecialchars( $instance['widgetprecontent'], ENT_QUOTES );
|
|
||||||
$widgetpostcontent = htmlspecialchars( $instance['widgetpostcontent'], ENT_QUOTES );
|
|
||||||
$size = htmlspecialchars( $instance['size'], ENT_QUOTES );
|
|
||||||
$hidebutton = htmlspecialchars( $instance['hidebutton'], ENT_QUOTES );
|
|
||||||
$postto = htmlspecialchars( $instance['postto'], ENT_QUOTES );
|
|
||||||
$js = htmlspecialchars( $instance['js'], ENT_QUOTES );
|
|
||||||
$noantispam = htmlspecialchars( $instance['noantispam'], ENT_QUOTES );
|
|
||||||
$nowrap = htmlspecialchars( $instance['nowrap'], ENT_QUOTES );
|
|
||||||
|
|
||||||
global $wpdb, $mysubscribe2;
|
|
||||||
$sql = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type='page' AND post_status='publish'";
|
|
||||||
|
|
||||||
echo '<div>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'title' ) ) . '">' . esc_html__( 'Title', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input class="widefat" id="' . esc_attr( $this->get_field_id( 'title' ) ) . '" name="' . esc_attr( $this->get_field_name( 'title' ) ) . '" type="text" value="' . esc_attr( $title ) . '" /></label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'div' ) ) . '">' . esc_html__( 'Div class name', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input class="widefat" id="' . esc_attr( $this->get_field_id( 'div' ) ) . '" name="' . esc_attr( $this->get_field_name( 'div' ) ) . '" type="text" value="' . esc_attr( $div ) . '" /></label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'widgetprecontent' ) ) . '">' . esc_html__( 'Pre-Content', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<textarea class="widefat" id="' . esc_attr( $this->get_field_id( 'widgetprecontent' ) ) . '" name="' . esc_attr( $this->get_field_name( 'widgetprecontent' ) ) . '" rows="2" cols="25">' . esc_attr( $widgetprecontent ) . '</textarea></label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'widgetpostcontent' ) ) . '">' . esc_html__( 'Post-Content', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<textarea class="widefat" id="' . esc_attr( $this->get_field_id( 'widgetpostcontent' ) ) . '" name="' . esc_attr( $this->get_field_name( 'widgetpostcontent' ) ) . '" rows="2" cols="25">' . esc_attr( $widgetpostcontent ) . '</textarea></label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'size' ) ) . '">' . esc_html__( 'Text Box Size', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input class="widefat" id="' . esc_attr( $this->get_field_id( 'size' ) ) . '" name="' . esc_attr( $this->get_field_name( 'size' ) ) . '" type="text" value="' . esc_attr( $size ) . '" /></label></p>' . "\r\n";
|
|
||||||
echo '<p>' . esc_html__( 'Display options', 'subscribe2' ) . ':<br>' . "\r\n";
|
|
||||||
echo '<label for="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'complete"><input id="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'complete" name="' . esc_attr( $this->get_field_name( 'hidebutton' ) ) . '" type="radio" value="none"' . checked( 'none', $hidebutton, false ) . '/> ' . esc_html__( 'Show complete form', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '<br><label for="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'subscribe"><input id="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'subscribe" name="' . esc_attr( $this->get_field_name( 'hidebutton' ) ) . '" type="radio" value="subscribe"' . checked( 'subscribe', $hidebutton, false ) . '/> ' . esc_html__( 'Hide Subscribe button', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '<br><label for="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'unsubscribe"><input id="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'unsubscribe" name="' . esc_attr( $this->get_field_name( 'hidebutton' ) ) . '" type="radio" value="unsubscribe"' . checked( 'unsubscribe', $hidebutton, false ) . '/> ' . esc_html__( 'Hide Unsubscribe button', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
if ( '1' === $mysubscribe2->subscribe2_options['ajax'] ) {
|
|
||||||
echo '<br><label for="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'ajax"><input id="' . esc_attr( $this->get_field_id( 'hidebutton' ) ) . 'ajax" name="' . esc_attr( $this->get_field_name( 'hidebutton' ) ) . '" type="radio" value="link"' . checked( 'link', $hidebutton, false ) . '/> ' . esc_html__( 'Show as link', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '</p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'postto' ) ) . '">' . esc_html__( 'Post form content to page', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<select class="widefat" id="' . esc_attr( $this->get_field_id( 'postto' ) ) . '" name="' . esc_attr( $this->get_field_name( 'postto' ) ) . '">' . "\r\n";
|
|
||||||
echo '<option value="' . esc_attr( $mysubscribe2->subscribe2_options['s2page'] ) . '">' . esc_html__( 'Use Subscribe2 Default', 'subscribe2' ) . '</option>' . "\r\n";
|
|
||||||
echo '<option value="home"';
|
|
||||||
if ( 'home' === $postto ) {
|
|
||||||
echo ' selected="selected"';
|
|
||||||
}
|
|
||||||
echo '>' . esc_html__( 'Use Home Page', 'subscribe2' ) . '</option>' . "\r\n";
|
|
||||||
echo '<option value="self"';
|
|
||||||
if ( 'self' === $postto ) {
|
|
||||||
echo ' selected="selected"';
|
|
||||||
}
|
|
||||||
echo '>' . esc_html__( 'Use Referring Page', 'subscribe2' ) . '</option>' . "\r\n";
|
|
||||||
$mysubscribe2->pages_dropdown( $postto );
|
|
||||||
echo '</select></label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'js' ) ) . '">' . esc_html__( 'Disable JavaScript', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input id="' . esc_attr( $this->get_field_id( 'js' ) ) . '" name ="' . esc_attr( $this->get_field_name( 'js' ) ) . '" value="true" type="checkbox"' . checked( 'true', $js, false ) . '/>';
|
|
||||||
echo '</label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'noantispam' ) ) . '">' . esc_html__( 'Disable Anti-spam measures', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input id="' . esc_attr( $this->get_field_id( 'noantispam' ) ) . '" name ="' . esc_attr( $this->get_field_name( 'noantispam' ) ) . '" value="true" type="checkbox"' . checked( 'true', $noantispam, false ) . '/>';
|
|
||||||
echo '</label></p>' . "\r\n";
|
|
||||||
echo '<p><label for="' . esc_attr( $this->get_field_id( 'nowrap' ) ) . '">' . esc_html__( 'Disable wrapping of form buttons', 'subscribe2' ) . ':' . "\r\n";
|
|
||||||
echo '<input id="' . esc_attr( $this->get_field_id( 'nowrap' ) ) . '" name ="' . esc_attr( $this->get_field_name( 'nowrap' ) ) . '" value="true" type="checkbox"' . checked( 'true', $nowrap, false ) . '/>';
|
|
||||||
echo '</label></p>' . "\r\n";
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
} // End S2_Form_widget class
|
|
@ -1,428 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Forms {
|
|
||||||
/**
|
|
||||||
* Functions to Display content of Your Subscriptions page and process any input
|
|
||||||
*/
|
|
||||||
public function init() {
|
|
||||||
add_action( 's2_subscription_submit', array( &$this, 's2_your_subscription_submit' ) );
|
|
||||||
add_action( 's2_subscription_form', array( &$this, 's2_your_subscription_form' ), 10, 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return appropriate user ID if user can edit other users subscriptions
|
|
||||||
*/
|
|
||||||
public function get_userid() {
|
|
||||||
if ( isset( $_GET['id'] ) ) {
|
|
||||||
if ( ! current_user_can( apply_filters( 's2_capability', 'manage_options', 'manage' ) ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Permission error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
}
|
|
||||||
if ( is_multisite() ) {
|
|
||||||
if ( ! is_user_member_of_blog( $_GET['id'], get_current_blog_id() ) ) {
|
|
||||||
die( '<p>' . esc_html__( 'Permission error! Your request cannot be completed.', 'subscribe2' ) . '</p>' );
|
|
||||||
} else {
|
|
||||||
$userid = (int) $_GET['id'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$userid = (int) $_GET['id'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
global $user_ID;
|
|
||||||
return $user_ID;
|
|
||||||
}
|
|
||||||
return $userid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display the form to allow Regsitered users to amend their subscription
|
|
||||||
*/
|
|
||||||
public function s2_your_subscription_form( $userid ) {
|
|
||||||
if ( ! is_int( $userid ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
global $mysubscribe2;
|
|
||||||
|
|
||||||
echo '<input type="hidden" name="s2_admin" value="user" />';
|
|
||||||
if ( 'never' === $mysubscribe2->subscribe2_options['email_freq'] ) {
|
|
||||||
echo esc_html__( 'Receive email as', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="s2_format" value="html"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true ), 'html', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'HTML - Full', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="s2_format" value="html_excerpt"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true ), 'html_excerpt', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'HTML - Excerpt', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="s2_format" value="post"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true ), 'post', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'Plain Text - Full', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="s2_format" value="excerpt"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true ), 'excerpt', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'Plain Text - Excerpt', 'subscribe2' ) . '</label><br><br>' . "\r\n";
|
|
||||||
|
|
||||||
if ( 'yes' === $mysubscribe2->subscribe2_options['show_autosub'] ) {
|
|
||||||
echo esc_html__( 'Automatically subscribe me to newly created categories', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label><input type="radio" name="new_category" value="yes"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), true ), 'yes', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'Yes', 'subscribe2' ) . '</label> ';
|
|
||||||
echo '<label><input type="radio" name="new_category" value="no"' . checked( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), true ), 'no', false ) . ' />';
|
|
||||||
echo ' ' . esc_html__( 'No', 'subscribe2' ) . '</label>';
|
|
||||||
echo '</p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'yes' === $mysubscribe2->subscribe2_options['one_click_profile'] ) {
|
|
||||||
// One-click subscribe and unsubscribe buttons
|
|
||||||
echo '<h2>' . esc_html__( 'One Click Subscription / Unsubscription', 'subscribe2' ) . "</h2>\r\n";
|
|
||||||
echo '<p class="submit"><input type="submit" class="button-primary" name="subscribe" value="' . esc_html__( 'Subscribe to All', 'subscribe2' ) . '" /> ';
|
|
||||||
echo '<input type="submit" class="button-primary" name="unsubscribe" value="' . esc_html__( 'Unsubscribe from All', 'subscribe2' ) . '" /></p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// subscribed categories
|
|
||||||
if ( $mysubscribe2->s2_mu ) {
|
|
||||||
global $blog_id;
|
|
||||||
$subscribed = get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
// if we are subscribed to the current blog display an "unsubscribe" link
|
|
||||||
if ( ! empty( $subscribed ) ) {
|
|
||||||
$unsubscribe_link = esc_url( add_query_arg( 's2mu_unsubscribe', $blog_id ) );
|
|
||||||
echo '<p><a href="' . esc_url( $unsubscribe_link ) . '" class="button">' . esc_html__( 'Unsubscribe me from this blog', 'subscribe2' ) . '</a></p>';
|
|
||||||
} else {
|
|
||||||
// else we show a "subscribe" link
|
|
||||||
$subscribe_link = esc_url( add_query_arg( 's2mu_subscribe', $blog_id ) );
|
|
||||||
echo '<p><a href="' . esc_url( $subscribe_link ) . '" class="button">' . esc_html__( 'Subscribe to all categories', 'subscribe2' ) . '</a></p>';
|
|
||||||
}
|
|
||||||
echo '<h2>' . esc_html__( 'Subscribed Categories on', 'subscribe2' ) . ' ' . esc_html( get_option( 'blogname' ) ) . ' </h2>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<h2>' . esc_html__( 'Subscribed Categories', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
}
|
|
||||||
('' === $mysubscribe2->subscribe2_options['compulsory']) ? $compulsory = array() : $compulsory = explode( ',', $mysubscribe2->subscribe2_options['compulsory'] );
|
|
||||||
$this->display_category_form( explode( ',', get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true ) ), $mysubscribe2->subscribe2_options['reg_override'], $compulsory );
|
|
||||||
} else {
|
|
||||||
// we're doing daily digests, so just show
|
|
||||||
// subscribe / unnsubscribe
|
|
||||||
echo esc_html__( 'Receive periodic summaries of new posts?', 'subscribe2' ) . ': ';
|
|
||||||
echo '<label>';
|
|
||||||
echo '<input type="radio" name="category" value="digest"';
|
|
||||||
if ( get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
echo ' /> ' . esc_html__( 'Yes', 'subscribe2' ) . '</label> <label><input type="radio" name="category" value="-1" ';
|
|
||||||
if ( ! get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
echo ' /> ' . esc_html__( 'No', 'subscribe2' );
|
|
||||||
echo '</label></p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( count( $this->get_authors() ) > 1 && 'never' === $mysubscribe2->subscribe2_options['email_freq'] ) {
|
|
||||||
echo '<div class="s2_admin" id="s2_authors">' . "\r\n";
|
|
||||||
echo '<h2>' . esc_html__( 'Do not send notifications for post made by these authors', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
$this->display_author_form( explode( ',', get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), true ) ) );
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// list of subscribed blogs on WordPress mu
|
|
||||||
if ( $mysubscribe2->s2_mu && ! isset( $_GET['email'] ) ) {
|
|
||||||
global $blog_id, $s2class_multisite;
|
|
||||||
$s2blog_id = $blog_id;
|
|
||||||
$current_user = wp_get_current_user();
|
|
||||||
$blogs = $s2class_multisite->get_mu_blog_list();
|
|
||||||
|
|
||||||
$blogs_subscribed = array();
|
|
||||||
$blogs_notsubscribed = array();
|
|
||||||
|
|
||||||
foreach ( $blogs as $blog ) {
|
|
||||||
// switch to blog
|
|
||||||
switch_to_blog( $blog['blog_id'] );
|
|
||||||
|
|
||||||
// check that the Subscribe2 plugin is active on the current blog
|
|
||||||
$current_plugins = get_option( 'active_plugins' );
|
|
||||||
if ( ! is_array( $current_plugins ) ) {
|
|
||||||
$current_plugins = (array) $current_plugins;
|
|
||||||
}
|
|
||||||
if ( ! in_array( S2DIR . 'subscribe2.php', $current_plugins, true ) ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we're subscribed to the blog
|
|
||||||
$subscribed = get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
|
|
||||||
$blogname = get_option( 'blogname' );
|
|
||||||
if ( strlen( $blogname ) > 30 ) {
|
|
||||||
$blog['blogname'] = wp_html_excerpt( $blogname, 30 ) . '..';
|
|
||||||
} else {
|
|
||||||
$blog['blogname'] = $blogname;
|
|
||||||
}
|
|
||||||
$blog['description'] = get_option( 'blogdescription' );
|
|
||||||
$blog['blogurl'] = get_option( 'home' );
|
|
||||||
$blog['subscribe_page'] = get_option( 'home' ) . '/wp-admin/admin.php?page=s2';
|
|
||||||
|
|
||||||
$key = strtolower( $blog['blogname'] . '-' . $blog['blog_id'] );
|
|
||||||
if ( ! empty( $subscribed ) ) {
|
|
||||||
$blogs_subscribed[ $key ] = $blog;
|
|
||||||
} else {
|
|
||||||
$blogs_notsubscribed[ $key ] = $blog;
|
|
||||||
}
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<div class="s2_admin" id="s2_mu_sites">' . "\r\n";
|
|
||||||
if ( ! empty( $blogs_subscribed ) ) {
|
|
||||||
ksort( $blogs_subscribed );
|
|
||||||
echo '<h2>' . esc_html__( 'Subscribed Blogs', 'subscribe2' ) . '</h2>' . "\r\n";
|
|
||||||
echo '<ul class="s2_blogs">' . "\r\n";
|
|
||||||
foreach ( $blogs_subscribed as $blog ) {
|
|
||||||
echo '<li><span class="name"><a href="' . esc_url( $blog['blogurl'] ) . '" title="' . esc_attr( $blog['description'] ) . '">' . esc_html( $blog['blogname'] ) . '</a></span>' . "\r\n";
|
|
||||||
if ( $s2blog_id === $blog['blog_id'] ) {
|
|
||||||
echo '<span class="buttons">' . esc_html__( 'Viewing Settings Now', 'subscribe2' ) . '</span>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<span class="buttons">';
|
|
||||||
if ( is_user_member_of_blog( $current_user->id, $blog['blog_id'] ) ) {
|
|
||||||
echo '<a href="' . esc_url( $blog['subscribe_page'] ) . '">' . esc_html__( 'View Settings', 'subscribe2' ) . '</a>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '<a href="' . esc_url( add_query_arg( 's2mu_unsubscribe', $blog['blog_id'] ) ) . '">' . esc_html__( 'Unsubscribe', 'subscribe2' ) . '</a></span>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '<div class="additional_info">' . esc_html( $blog['description'] ) . '</div>' . "\r\n";
|
|
||||||
echo '</li>';
|
|
||||||
}
|
|
||||||
echo '</ul>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $blogs_notsubscribed ) ) {
|
|
||||||
ksort( $blogs_notsubscribed );
|
|
||||||
echo '<h2>' . esc_html__( 'Subscribe to new blogs', 'subscribe2' ) . "</h2>\r\n";
|
|
||||||
echo '<ul class="s2_blogs">';
|
|
||||||
foreach ( $blogs_notsubscribed as $blog ) {
|
|
||||||
echo '<li><span class="name"><a href="' . esc_url( $blog['blogurl'] ) . '" title="' . esc_attr( $blog['description'] ) . '">' . esc_html( $blog['blogname'] ) . '</a></span>' . "\r\n";
|
|
||||||
if ( $s2blog_id === $blog['blog_id'] ) {
|
|
||||||
echo '<span class="buttons">' . esc_html__( 'Viewing Settings Now', 'subscribe2' ) . '</span>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<span class="buttons">';
|
|
||||||
if ( is_user_member_of_blog( $current_user->id, $blog['blog_id'] ) ) {
|
|
||||||
echo '<a href="' . esc_url( $blog['subscribe_page'] ) . '">' . esc_html__( 'View Settings', 'subscribe2' ) . '</a>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '<a href="' . esc_url( add_query_arg( 's2mu_subscribe', $blog['blog_id'] ) ) . '">' . esc_html__( 'Subscribe', 'subscribe2' ) . '</a></span>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '<div class="additional_info">' . esc_html( $blog['description'] ) . '</div>' . "\r\n";
|
|
||||||
echo '</li>';
|
|
||||||
}
|
|
||||||
echo '</ul>' . "\r\n";
|
|
||||||
}
|
|
||||||
echo '</div>' . "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process input from the form that allows Regsitered users to amend their subscription
|
|
||||||
*/
|
|
||||||
public function s2_your_subscription_submit() {
|
|
||||||
global $mysubscribe2, $user_ID;
|
|
||||||
|
|
||||||
$userid = $this->get_userid();
|
|
||||||
|
|
||||||
if ( isset( $_POST['submit'] ) ) {
|
|
||||||
if ( isset( $_POST['s2_format'] ) ) {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), $_POST['s2_format'] );
|
|
||||||
} else {
|
|
||||||
// value has not been set so use default
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_format' ), 'excerpt' );
|
|
||||||
}
|
|
||||||
if ( isset( $_POST['new_category'] ) ) {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), $_POST['new_category'] );
|
|
||||||
} else {
|
|
||||||
// value has not been passed so use Settings defaults
|
|
||||||
if ( 'yes' === $mysubscribe2->subscribe2_options['show_autosub'] && 'yes' === $mysubscribe2->subscribe2_options['autosub_def'] ) {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), 'yes' );
|
|
||||||
} else {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), 'no' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$cats = ( isset( $_POST['category'] ) ) ? $_POST['category'] : '';
|
|
||||||
|
|
||||||
if ( empty( $cats ) || '-1' === $cats ) {
|
|
||||||
$oldcats = explode( ',', get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true ) );
|
|
||||||
if ( $oldcats ) {
|
|
||||||
foreach ( $oldcats as $cat ) {
|
|
||||||
delete_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $cat );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), '' );
|
|
||||||
} elseif ( 'digest' === $cats ) {
|
|
||||||
$all_cats = $mysubscribe2->all_cats( false, 'ID' );
|
|
||||||
foreach ( $all_cats as $cat ) {
|
|
||||||
( '' === $catids ) ? $catids = "$cat->term_id" : $catids .= ",$cat->term_id";
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $cat->term_id, $cat->term_id );
|
|
||||||
}
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), $catids );
|
|
||||||
} else {
|
|
||||||
if ( ! is_array( $cats ) ) {
|
|
||||||
$cats = (array) $_POST['category'];
|
|
||||||
}
|
|
||||||
sort( $cats );
|
|
||||||
$old_cats = explode( ',', get_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true ) );
|
|
||||||
$remove = array_diff( $old_cats, $cats );
|
|
||||||
$new = array_diff( $cats, $old_cats );
|
|
||||||
if ( ! empty( $remove ) ) {
|
|
||||||
// remove subscription to these cat IDs
|
|
||||||
foreach ( $remove as $id ) {
|
|
||||||
delete_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $id );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( ! empty( $new ) ) {
|
|
||||||
// add subscription to these cat IDs
|
|
||||||
foreach ( $new as $id ) {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $id, $id );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), implode( ',', $cats ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
$authors = ( isset( $_POST['author'] ) ) ? $_POST['author'] : '';
|
|
||||||
if ( is_array( $authors ) ) {
|
|
||||||
$authors = implode( ',', $authors );
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), $authors );
|
|
||||||
} elseif ( empty( $authors ) ) {
|
|
||||||
update_user_meta( $userid, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), '' );
|
|
||||||
}
|
|
||||||
} elseif ( isset( $_POST['subscribe'] ) ) {
|
|
||||||
$mysubscribe2->one_click_handler( $userid, 'subscribe' );
|
|
||||||
} elseif ( isset( $_POST['unsubscribe'] ) ) {
|
|
||||||
$mysubscribe2->one_click_handler( $userid, 'unsubscribe' );
|
|
||||||
}
|
|
||||||
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Subscription preferences updated.', 'subscribe2' ) . '</strong></p></div>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display a table of categories with checkboxes
|
|
||||||
* Optionally pre-select those categories specified
|
|
||||||
*/
|
|
||||||
public function display_category_form( $selected = array(), $override = 1, $compulsory = array(), $name = 'category' ) {
|
|
||||||
global $wpdb, $mysubscribe2;
|
|
||||||
|
|
||||||
if ( 0 === $override ) {
|
|
||||||
$all_cats = $mysubscribe2->all_cats( true );
|
|
||||||
} else {
|
|
||||||
$all_cats = $mysubscribe2->all_cats( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
$half = ( count( $all_cats ) / 2 );
|
|
||||||
$i = 0;
|
|
||||||
$j = 0;
|
|
||||||
echo '<table style="width: 100%; border-collapse: separate; border-spacing: 2px; *border-collapse: expression(\'separate\', cellSpacing = \'2px\');" class="editform">' . "\r\n";
|
|
||||||
echo '<tr><td style="text-align: left;" colspan="2">' . "\r\n";
|
|
||||||
echo '<label><input type="checkbox" name="checkall" value="checkall_' . esc_attr( $name ) . '" /> ' . esc_html__( 'Select / Unselect All', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '</td></tr>' . "\r\n";
|
|
||||||
echo '<tr style="vertical-align: top;"><td style="width: 50%; text-align: left;">' . "\r\n";
|
|
||||||
foreach ( $all_cats as $cat ) {
|
|
||||||
if ( $i >= $half && 0 === $j ) {
|
|
||||||
echo '</td><td style="width: 50%; text-align: left;">' . "\r\n";
|
|
||||||
$j++;
|
|
||||||
}
|
|
||||||
$cat_name = '';
|
|
||||||
$parents = array_reverse( get_ancestors( $cat->term_id, $cat->taxonomy ) );
|
|
||||||
if ( $parents ) {
|
|
||||||
foreach ( $parents as $parent ) {
|
|
||||||
$parent = get_term( $parent, $cat->taxonomy );
|
|
||||||
$cat_name .= $parent->name . ' » ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$cat_name .= $cat->name;
|
|
||||||
|
|
||||||
if ( 0 === $j ) {
|
|
||||||
echo '<label><input class="checkall_' . esc_attr( $name ) . '" type="checkbox" name="' . esc_attr( $name ) . '[]" value="' . esc_attr( $cat->term_id ) . '"';
|
|
||||||
if ( in_array( (string) $cat->term_id, $selected, true ) || in_array( (string) $cat->term_id, $compulsory, true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
if ( in_array( (string) $cat->term_id, $compulsory, true ) && 'category' === $name ) {
|
|
||||||
echo ' DISABLED';
|
|
||||||
}
|
|
||||||
echo ' /> <abbr title="' . esc_attr( $cat->slug ) . '">' . esc_html( $cat_name ) . '</abbr></label><br>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<label><input class="checkall_' . esc_attr( $name ) . '" type="checkbox" name="' . esc_attr( $name ) . '[]" value="' . esc_attr( $cat->term_id ) . '"';
|
|
||||||
if ( in_array( (string) $cat->term_id, $selected, true ) || in_array( (string) $cat->term_id, $compulsory, true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
if ( in_array( (string) $cat->term_id, $compulsory, true ) && 'category' === $name ) {
|
|
||||||
echo ' DISABLED';
|
|
||||||
}
|
|
||||||
echo ' /> <abbr title="' . esc_attr( $cat->slug ) . '">' . esc_html( $cat_name ) . '</abbr></label><br>' . "\r\n";
|
|
||||||
}
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
if ( ! empty( $compulsory ) ) {
|
|
||||||
foreach ( $compulsory as $cat ) {
|
|
||||||
echo '<input type="hidden" name="' . esc_attr( $name ) . '[]" value="' . esc_attr( $cat ) . '">' . "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '</td></tr>' . "\r\n";
|
|
||||||
echo '</table>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display a table of authors with checkboxes
|
|
||||||
* Optionally pre-select those authors specified
|
|
||||||
*/
|
|
||||||
public function display_author_form( $selected = array() ) {
|
|
||||||
$all_authors = $this->get_authors();
|
|
||||||
|
|
||||||
$half = ( count( $all_authors ) / 2 );
|
|
||||||
$i = 0;
|
|
||||||
$j = 0;
|
|
||||||
echo '<table style="width: 100%; border-collapse: separate; border-spacing: 2px; *border-collapse: expression(\'separate\', cellSpacing = \'2px\');" class="editform">' . "\r\n";
|
|
||||||
echo '<tr><td style="text-align: left;" colspan="2">' . "\r\n";
|
|
||||||
echo '<label><input type="checkbox" name="checkall" value="checkall_author" /> ' . esc_html__( 'Select / Unselect All', 'subscribe2' ) . '</label>' . "\r\n";
|
|
||||||
echo '</td></tr>' . "\r\n";
|
|
||||||
echo '<tr style="vertical-align: top;"><td style="width: 50%; test-align: left;">' . "\r\n";
|
|
||||||
foreach ( $all_authors as $author ) {
|
|
||||||
if ( $i >= $half && 0 === $j ) {
|
|
||||||
echo '</td><td style="width: 50%; text-align: left;">' . "\r\n";
|
|
||||||
$j++;
|
|
||||||
}
|
|
||||||
if ( 0 === $j ) {
|
|
||||||
echo '<label><input class="checkall_author" type="checkbox" name="author[]" value="' . esc_attr( $author->ID ) . '"';
|
|
||||||
if ( in_array( $author->ID, $selected, true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
echo ' /> ' . esc_html( $author->display_name ) . '</label><br>' . "\r\n";
|
|
||||||
} else {
|
|
||||||
echo '<label><input class="checkall_author" type="checkbox" name="author[]" value="' . esc_attr( $author->ID ) . '"';
|
|
||||||
if ( in_array( $author->ID, $selected, true ) ) {
|
|
||||||
echo ' checked="checked"';
|
|
||||||
}
|
|
||||||
echo ' /> ' . esc_html( $author->display_name ) . '</label><br>' . "\r\n";
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '</td></tr>' . "\r\n";
|
|
||||||
echo '</table>' . "\r\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collect an array of all author level users and above
|
|
||||||
*/
|
|
||||||
public function get_authors() {
|
|
||||||
if ( '' === $this->all_authors ) {
|
|
||||||
$role = array(
|
|
||||||
'fields' => array( 'ID', 'display_name' ),
|
|
||||||
'role' => 'administrator',
|
|
||||||
);
|
|
||||||
|
|
||||||
$administrators = get_users( $role );
|
|
||||||
|
|
||||||
$role = array(
|
|
||||||
'fields' => array( 'ID', 'display_name' ),
|
|
||||||
'role' => 'editor',
|
|
||||||
);
|
|
||||||
|
|
||||||
$editors = get_users( $role );
|
|
||||||
|
|
||||||
$role = array(
|
|
||||||
'fields' => array( 'ID', 'display_name' ),
|
|
||||||
'role' => 'author',
|
|
||||||
);
|
|
||||||
|
|
||||||
$authors = get_users( $role );
|
|
||||||
|
|
||||||
$this->all_authors = array_merge( $administrators, $editors, $authors );
|
|
||||||
}
|
|
||||||
return apply_filters( 's2_authors', $this->all_authors );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define some variables
|
|
||||||
*/
|
|
||||||
private $all_authors = '';
|
|
||||||
}
|
|
@ -1,356 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Frontend extends S2_Core {
|
|
||||||
/**
|
|
||||||
* Load all our strings
|
|
||||||
*/
|
|
||||||
public function load_strings() {
|
|
||||||
// Translators: Link to login page
|
|
||||||
$this->please_log_in = '<p class="s2_message">' . sprintf( __( 'To manage your subscription options please <a href="%1$s">login</a>.', 'subscribe2' ), get_option( 'siteurl' ) . '/wp-login.php' ) . '</p>';
|
|
||||||
|
|
||||||
$profile = apply_filters( 's2_profile_link', get_option( 'siteurl' ) . '/wp-admin/admin.php?page=s2' );
|
|
||||||
// Translators: Link to Profile page
|
|
||||||
$this->profile = '<p class="s2_message">' . sprintf( __( 'You may manage your subscription options from your <a href="%1$s">profile</a>.', 'subscribe2' ), $profile ) . '</p>';
|
|
||||||
if ( true === $this->s2_mu ) {
|
|
||||||
global $blog_id;
|
|
||||||
$user_ID = get_current_user_id();
|
|
||||||
if ( ! is_user_member_of_blog( $user_ID, $blog_id ) ) {
|
|
||||||
// if we are on multisite and the user is not a member of this blog change the link
|
|
||||||
$mu_profile = apply_filters( 's2_mu_profile_link', get_option( 'siteurl' ) . '/wp-admin/?s2mu_subscribe=' . $blog_id );
|
|
||||||
// Translators: Link to Profile page
|
|
||||||
$this->profile = '<p class="s2_message">' . sprintf( __( '<a href="%1$s">Subscribe</a> to email notifications when this blog posts new content.', 'subscribe2' ), $mu_profile ) . '</p>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->confirmation_sent = '<p class="s2_message">' . __( 'A confirmation message is on its way!', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->already_subscribed = '<p class="s2_error">' . __( 'That email address is already subscribed.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->not_subscribed = '<p class="s2_error">' . __( 'That email address is not subscribed.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->not_an_email = '<p class="s2_error">' . __( 'Sorry, but that does not look like an email address to me.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->barred_domain = '<p class="s2_error">' . __( 'Sorry, email addresses at that domain are currently barred due to spam, please use an alternative email address.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->error = '<p class="s2_error">' . __( 'Sorry, there seems to be an error on the server. Please try again later.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
// confirmation messages
|
|
||||||
$this->no_such_email = '<p class="s2_error">' . __( 'No such email address is registered.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->added = '<p class="s2_message">' . __( 'You have successfully subscribed!', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->deleted = '<p class="s2_message">' . __( 'You have successfully unsubscribed.', 'subscribe2' ) . '</p>';
|
|
||||||
|
|
||||||
$this->subscribe = __( 'subscribe', 'subscribe2' ); //ACTION replacement in subscribing confirmation email
|
|
||||||
|
|
||||||
$this->unsubscribe = __( 'unsubscribe', 'subscribe2' ); //ACTION replacement in unsubscribing in confirmation email
|
|
||||||
|
|
||||||
if ( isset( $_GET['s2_unsub'] ) && ! empty( $_GET['s2_unsub'] ) ) {
|
|
||||||
$this->unsubscribe( $_GET['s2_unsub'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process unsubscribe
|
|
||||||
*
|
|
||||||
* @param $email
|
|
||||||
*/
|
|
||||||
public function unsubscribe( $email ) {
|
|
||||||
global $wpdb;
|
|
||||||
$email = base64_decode( $email );
|
|
||||||
|
|
||||||
if (! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = $wpdb->delete( $wpdb->subscribe2,
|
|
||||||
[
|
|
||||||
'email' => $email
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( ! $count ) {
|
|
||||||
wp_safe_redirect( home_url() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display form when deprecated <!--subscribe2--> is used
|
|
||||||
*/
|
|
||||||
public function filter( $content = '' ) {
|
|
||||||
if ( '' === $content || ! strstr( $content, '<!--subscribe2-->' ) ) {
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
return preg_replace( '/(<p>)?(\n)*<!--subscribe2-->(\n)*(<\/p>)?/', do_shortcode( '[subscribe2]' ), $content );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the default query when handling a (un)subscription confirmation
|
|
||||||
* This is basically a trick: if the s2 variable is in the query string, just grab the first
|
|
||||||
* static page and override it's contents later with title_filter()
|
|
||||||
*/
|
|
||||||
public function query_filter() {
|
|
||||||
// don't interfere if we've already done our thing
|
|
||||||
if ( 1 === $this->filtered ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
global $wpdb;
|
|
||||||
|
|
||||||
// brute force Simple Facebook Connect to bypass compatiblity issues
|
|
||||||
$priority = has_filter( 'wp_head', 'sfc_base_meta' );
|
|
||||||
if ( false !== $priority ) {
|
|
||||||
remove_action( 'wp_head', 'sfc_base_meta', $priority );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 0 !== $this->subscribe2_options['s2page'] ) {
|
|
||||||
return array(
|
|
||||||
'page_id' => $this->subscribe2_options['s2page'],
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE post_type='page' AND post_status='publish' LIMIT 1" );
|
|
||||||
if ( $id ) {
|
|
||||||
return array(
|
|
||||||
'page_id' => $id,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return array(
|
|
||||||
'showposts' => 1,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overrides the page title
|
|
||||||
*/
|
|
||||||
public function title_filter( $title ) {
|
|
||||||
if ( in_the_loop() ) {
|
|
||||||
$code = $_GET['s2'];
|
|
||||||
$action = intval( substr( $code, 0, 1 ) );
|
|
||||||
if ( 1 === $action ) {
|
|
||||||
return __( 'Subscription Confirmation', 'subscribe2' );
|
|
||||||
} else {
|
|
||||||
return __( 'Unsubscription Confirmation', 'subscribe2' );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return $title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Confirm request from the link emailed to the user and email the admin
|
|
||||||
*/
|
|
||||||
public function confirm( $content = '' ) {
|
|
||||||
global $wpdb;
|
|
||||||
|
|
||||||
if ( 1 === $this->filtered && '' !== $this->message ) {
|
|
||||||
return $this->message;
|
|
||||||
} elseif ( 1 === $this->filtered ) {
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
$code = $_GET['s2'];
|
|
||||||
$action = substr( $code, 0, 1 );
|
|
||||||
$hash = substr( $code, 1, 32 );
|
|
||||||
$id = intval( substr( $code, 33 ) );
|
|
||||||
if ( $id ) {
|
|
||||||
$this->email = $this->sanitize_email( $this->get_email( $id ) );
|
|
||||||
if ( ! $this->email || wp_hash( $this->email ) !== $hash ) {
|
|
||||||
return $this->no_such_email;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return $this->no_such_email;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get current status of email so messages are only sent once per emailed link
|
|
||||||
$current = $this->is_public( $this->email );
|
|
||||||
|
|
||||||
if ( '1' === $action ) {
|
|
||||||
// make this subscription active
|
|
||||||
$this->message = apply_filters( 's2_subscribe_confirmed', $this->added );
|
|
||||||
if ( '1' !== $this->is_public( $this->email ) ) {
|
|
||||||
$this->ip = esc_html( $this->get_remote_ip() );
|
|
||||||
$this->toggle( $this->email );
|
|
||||||
if ( 'subs' === $this->subscribe2_options['admin_email'] || 'both' === $this->subscribe2_options['admin_email'] ) {
|
|
||||||
$this->admin_email( 'subscribe' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->filtered = 1;
|
|
||||||
} elseif ( '0' === $action ) {
|
|
||||||
// remove this public subscriber
|
|
||||||
$this->message = apply_filters( 's2_unsubscribe_confirmed', $this->deleted );
|
|
||||||
if ( '0' !== $this->is_public( $this->email ) ) {
|
|
||||||
$this->delete( $this->email );
|
|
||||||
if ( 'unsubs' === $this->subscribe2_options['admin_email'] || 'both' === $this->subscribe2_options['admin_email'] ) {
|
|
||||||
$this->admin_email( 'unsubscribe' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->filtered = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( '' !== $this->message ) {
|
|
||||||
return $this->message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare and send emails to admins on new subscriptions and unsubsriptions
|
|
||||||
*/
|
|
||||||
public function admin_email( $action ) {
|
|
||||||
if ( ! in_array( $action, array( 'subscribe', 'unsubscribe' ), true ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
( '' === get_option( 'blogname' ) ) ? $subject = '' : $subject = '[' . stripslashes( html_entity_decode( get_option( 'blogname' ), ENT_QUOTES ) ) . '] ';
|
|
||||||
if ( 'subscribe' === $action ) {
|
|
||||||
$subject .= __( 'New Subscription', 'subscribe2' );
|
|
||||||
$message = $this->email . ' ' . __( 'subscribed to email notifications!', 'subscribe2' );
|
|
||||||
} elseif ( 'unsubscribe' === $action ) {
|
|
||||||
$subject .= __( 'New Unsubscription', 'subscribe2' );
|
|
||||||
$message = $this->email . ' ' . __( 'unsubscribed from email notifications!', 'subscribe2' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$subject = html_entity_decode( $subject, ENT_QUOTES );
|
|
||||||
$role = array(
|
|
||||||
'fields' => array(
|
|
||||||
'user_email',
|
|
||||||
),
|
|
||||||
'role' => 'administrator',
|
|
||||||
);
|
|
||||||
|
|
||||||
$wp_user_query = get_users( $role );
|
|
||||||
foreach ( $wp_user_query as $user ) {
|
|
||||||
$recipients[] = $user->user_email;
|
|
||||||
}
|
|
||||||
|
|
||||||
$recipients = apply_filters( 's2_admin_email', $recipients, $action );
|
|
||||||
$headers = $this->headers();
|
|
||||||
// send individual emails so we don't reveal admin emails to each other
|
|
||||||
foreach ( $recipients as $recipient ) {
|
|
||||||
$status = wp_mail( $recipient, $subject, $message, $headers );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add hook for Minimeta Widget plugin
|
|
||||||
*/
|
|
||||||
public function add_minimeta() {
|
|
||||||
if ( 0 !== $this->subscribe2_options['s2page'] ) {
|
|
||||||
echo '<li><a href="' . esc_url( get_permalink( $this->subscribe2_options['s2page'] ) ) . '">' . esc_html__( '[Un]Subscribe to Posts', 'subscribe2' ) . '</a></li>' . "\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check email is not from a barred domain
|
|
||||||
*/
|
|
||||||
public function is_barred( $email = '' ) {
|
|
||||||
if ( '' === $email ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
list( $user, $domain ) = explode( '@', $email, 2 );
|
|
||||||
|
|
||||||
$domain = '@' . $domain;
|
|
||||||
|
|
||||||
foreach ( preg_split( '/[\s,]+/', $this->subscribe2_options['barred'] ) as $barred_domain ) {
|
|
||||||
if ( false !== strpos( $barred_domain, '!' ) ) {
|
|
||||||
$url = explode( '.', str_replace( '!', '', $barred_domain ) );
|
|
||||||
$count = count( $url );
|
|
||||||
// make sure our exploded domain has at least 2 components e.g. yahoo.*
|
|
||||||
if ( $count < 2 ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for ( $i = 0; $i < $count; $i++ ) {
|
|
||||||
if ( '*' === $url[ $i ] ) {
|
|
||||||
unset( $url[ $i ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$new_barred_domain = '@' . strtolower( trim( implode( '.', $url ) ) );
|
|
||||||
|
|
||||||
if ( false !== strpos( $barred_domain, '*' ) ) {
|
|
||||||
$new_barred_subdomain = '.' . strtolower( trim( implode( '.', $url ) ) );
|
|
||||||
if ( false !== stripos( $domain, $new_barred_domain ) || false !== stripos( $domain, $new_barred_subdomain ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( false !== stripos( $domain, $new_barred_domain ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( false === strpos( $barred_domain, '!' ) && false !== strpos( $barred_domain, '*' ) ) {
|
|
||||||
// wildcard and explictly allowed checking
|
|
||||||
$url = explode( '.', str_replace( '!', '', $barred_domain ) );
|
|
||||||
$count = count( $url );
|
|
||||||
// make sure our exploded domain has at least 2 components e.g. yahoo.*
|
|
||||||
if ( $count < 2 ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for ( $i = 0; $i < $count; $i++ ) {
|
|
||||||
if ( '*' === $url[ $i ] ) {
|
|
||||||
unset( $url[ $i ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$new_barred_domain = '@' . strtolower( trim( implode( '.', $url ) ) );
|
|
||||||
$new_barred_subdomain = '.' . strtolower( trim( implode( '.', $url ) ) );
|
|
||||||
|
|
||||||
if ( false !== stripos( $domain, $new_barred_domain ) || false !== stripos( $domain, $new_barred_subdomain ) ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// direct domain string comparison
|
|
||||||
$barred_domain = '@' . $barred_domain;
|
|
||||||
if ( strtolower( $domain ) === strtolower( trim( $barred_domain ) ) ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enqueue javascript ip updater code
|
|
||||||
*/
|
|
||||||
public function js_ip_script() {
|
|
||||||
wp_register_script( 's2_ip_updater', S2URL . 'include/s2-ip-updater' . $this->script_debug . '.js', array(), '1.1', true );
|
|
||||||
wp_enqueue_script( 's2_ip_updater' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add ip updater library to footer
|
|
||||||
*/
|
|
||||||
public function js_ip_library_script() {
|
|
||||||
$args = array(
|
|
||||||
'format' => 'jsonp',
|
|
||||||
'callback' => 'getip',
|
|
||||||
);
|
|
||||||
wp_enqueue_script( 's2_ip_library', add_query_arg( $args, 'https://api.ipify.org' ), array(), S2VERSION, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reformat WordPress escaped link to IPify library
|
|
||||||
*/
|
|
||||||
public function tag_replace_ampersand( $tag ) {
|
|
||||||
if ( strstr( $tag, 'ipify' ) !== false ) {
|
|
||||||
$tag = str_replace( '&', '&', $tag );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===== define some variables ===== */
|
|
||||||
public $profile = '';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create and display a dropdown list of pages
|
|
||||||
*/
|
|
||||||
public function pages_dropdown( $s2page, $name = 's2page' ) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,443 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* List Table class used in WordPress 4.3.x and above
|
|
||||||
*/
|
|
||||||
class S2_List_Table extends WP_List_Table {
|
|
||||||
private $date_format = '';
|
|
||||||
private $time_format = '';
|
|
||||||
|
|
||||||
public function __construct() {
|
|
||||||
global $status, $page;
|
|
||||||
|
|
||||||
parent::__construct(
|
|
||||||
array(
|
|
||||||
'singular' => 'subscriber',
|
|
||||||
'plural' => 'subscribers',
|
|
||||||
'ajax' => false,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
$this->date_format = get_option( 'date_format' );
|
|
||||||
$this->time_format = get_option( 'time_format' );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function column_default( $item, $column_name ) {
|
|
||||||
global $current_tab;
|
|
||||||
switch ( $column_name ) {
|
|
||||||
case 'email':
|
|
||||||
case 'date':
|
|
||||||
return $item[ $column_name ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function column_email( $item ) {
|
|
||||||
global $current_tab;
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
$actions = array(
|
|
||||||
'edit' => sprintf( '<a href="?page=%s&id=%d">%s</a>', 's2', rawurlencode( $item['id'] ), __( 'Edit', 'subscribe2' ) ),
|
|
||||||
);
|
|
||||||
return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $actions ) );
|
|
||||||
} else {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( '0' === $mysubscribe2->is_public( $item['email'] ) ) {
|
|
||||||
return sprintf( '<span style="color:#FF0000"><abbr title="%2$s">%1$s</abbr></span>', $item['email'], $item['ip'] );
|
|
||||||
} else {
|
|
||||||
return sprintf( '<abbr title="%2$s">%1$s</abbr>', $item['email'], $item['ip'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function column_date( $item ) {
|
|
||||||
global $current_tab;
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
$timestamp = strtotime( $item['date'] );
|
|
||||||
return sprintf( '<abbr title="%2$s">%1$s</abbr>', date_i18n( $this->date_format, $timestamp ), date_i18n( $this->time_format, $timestamp ) );
|
|
||||||
} else {
|
|
||||||
$timestamp = strtotime( $item['date'] . ' ' . $item['time'] );
|
|
||||||
return sprintf( '<abbr title="%2$s">%1$s</abbr>', date_i18n( $this->date_format, $timestamp ), date_i18n( $this->time_format, $timestamp ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function column_cb( $item ) {
|
|
||||||
return sprintf( '<input type="checkbox" name="%1$s[]" value="%2$s" />', $this->_args['singular'], $item['email'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_columns() {
|
|
||||||
global $current_tab;
|
|
||||||
$columns = array(
|
|
||||||
'cb' => '<input type="checkbox" />',
|
|
||||||
'email' => _x( 'Email', 'column name', 'subscribe2' ),
|
|
||||||
'date' => _x( 'Date', 'column name', 'subscribe2' ),
|
|
||||||
);
|
|
||||||
return $columns;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_sortable_columns() {
|
|
||||||
global $current_tab;
|
|
||||||
$sortable_columns = array(
|
|
||||||
'email' => array( 'email', true ),
|
|
||||||
'date' => array( 'date', false ),
|
|
||||||
);
|
|
||||||
return $sortable_columns;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function print_column_headers( $with_id = true ) {
|
|
||||||
list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
|
|
||||||
|
|
||||||
$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
|
|
||||||
$current_url = remove_query_arg( 'paged', $current_url );
|
|
||||||
|
|
||||||
if ( isset( $_REQUEST['what'] ) ) {
|
|
||||||
$current_url = add_query_arg(
|
|
||||||
array(
|
|
||||||
'what' => $_REQUEST['what'],
|
|
||||||
),
|
|
||||||
$current_url
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $_GET['orderby'] ) ) {
|
|
||||||
$current_orderby = $_GET['orderby'];
|
|
||||||
} else {
|
|
||||||
$current_orderby = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) {
|
|
||||||
$current_order = 'desc';
|
|
||||||
} else {
|
|
||||||
$current_order = 'asc';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $columns['cb'] ) ) {
|
|
||||||
static $cb_counter = 1;
|
|
||||||
$columns['cb'] = '<label class="screen-reader-text" for="cb-select-all-' . $cb_counter . '">' . __( 'Select All', 'subscribe2' ) . '</label>'
|
|
||||||
. '<input id="cb-select-all-' . $cb_counter . '" type="checkbox" />';
|
|
||||||
$cb_counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ( $columns as $column_key => $column_display_name ) {
|
|
||||||
$class = array( 'manage-column', "column-$column_key" );
|
|
||||||
|
|
||||||
if ( in_array( $column_key, $hidden, true ) ) {
|
|
||||||
$class[] = 'hidden';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'cb' === $column_key ) {
|
|
||||||
$class[] = 'check-column';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $column_key === $primary ) {
|
|
||||||
$class[] = 'column-primary';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $sortable[ $column_key ] ) ) {
|
|
||||||
list( $orderby, $desc_first ) = $sortable[ $column_key ];
|
|
||||||
|
|
||||||
if ( $current_orderby === $orderby ) {
|
|
||||||
$order = 'asc' === $current_order ? 'desc' : 'asc';
|
|
||||||
$class[] = 'sorted';
|
|
||||||
$class[] = $current_order;
|
|
||||||
} else {
|
|
||||||
$order = $desc_first ? 'desc' : 'asc';
|
|
||||||
$class[] = 'sortable';
|
|
||||||
$class[] = $desc_first ? 'asc' : 'desc';
|
|
||||||
}
|
|
||||||
|
|
||||||
$column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$tag = ( 'cb' === $column_key ) ? 'td' : 'th';
|
|
||||||
$scope = ( 'th' === $tag ) ? 'scope="col"' : '';
|
|
||||||
$id = $with_id ? "id='$column_key'" : '';
|
|
||||||
|
|
||||||
if ( ! empty( $class ) ) {
|
|
||||||
$class = "class='" . join( ' ', $class ) . "'";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "<$tag $scope $id $class>$column_display_name</$tag>"; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function get_bulk_actions() {
|
|
||||||
global $current_tab;
|
|
||||||
if ( 'registered' === $current_tab ) {
|
|
||||||
if ( is_multisite() ) {
|
|
||||||
return array();
|
|
||||||
} else {
|
|
||||||
return array(
|
|
||||||
'delete' => __( 'Delete', 'subscribe2' ),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$actions = array(
|
|
||||||
'delete' => __( 'Delete', 'subscribe2' ),
|
|
||||||
'toggle' => __( 'Toggle', 'subscribe2' ),
|
|
||||||
);
|
|
||||||
return $actions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function process_bulk_action() {
|
|
||||||
if ( in_array( $this->current_action(), array( 'delete', 'toggle' ), true ) ) {
|
|
||||||
if ( ! isset( $_REQUEST['subscriber'] ) ) {
|
|
||||||
echo '<div id="message" class="error"><p><strong>' . esc_html__( 'No users were selected.', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( 'delete' === $this->current_action() ) {
|
|
||||||
global $mysubscribe2, $current_user, $subscribers;
|
|
||||||
$message = array();
|
|
||||||
foreach ( $_REQUEST['subscriber'] as $address ) {
|
|
||||||
$address = trim( stripslashes( $address ) );
|
|
||||||
if ( false !== $mysubscribe2->is_public( $address ) ) {
|
|
||||||
$mysubscribe2->delete( $address );
|
|
||||||
$key = array_search( $address, $subscribers, true );
|
|
||||||
unset( $subscribers[ $key ] );
|
|
||||||
$message['public_deleted'] = __( 'Address(es) deleted!', 'subscribe2' );
|
|
||||||
} else {
|
|
||||||
$user = get_user_by( 'email', $address );
|
|
||||||
if ( ! current_user_can( 'delete_user', $user->ID ) || $user->ID === $current_user->ID ) {
|
|
||||||
$message['reg_delete_error'] = __( 'Delete failed! You cannot delete some or all of these users.', 'subscribe2' );
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
$message['reg_deleted'] = __( 'Registered user(s) deleted! Any posts made by these users were assigned to you.', 'subscribe2' );
|
|
||||||
foreach ( $subscribers as $key => $data ) {
|
|
||||||
if ( in_array( $address, $data, true ) ) {
|
|
||||||
unset( $subscribers[ $key ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wp_delete_user( $user->ID, $current_user->ID );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$final_message = implode( '<br><br>', array_filter( $message ) );
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html( $final_message ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
if ( 'toggle' === $this->current_action() ) {
|
|
||||||
global $mysubscribe2, $current_user, $subscribers;
|
|
||||||
$mysubscribe2->ip = $current_user->user_login;
|
|
||||||
foreach ( $_REQUEST['subscriber'] as $address ) {
|
|
||||||
$address = trim( stripslashes( $address ) );
|
|
||||||
$mysubscribe2->toggle( $address );
|
|
||||||
if ( 'confirmed' === $_POST['what'] || 'unconfirmed' === $_POST['what'] ) {
|
|
||||||
$key = array_search( $address, $subscribers, true );
|
|
||||||
unset( $subscribers[ $key ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '<div id="message" class="updated fade"><p><strong>' . esc_html__( 'Status changed!', 'subscribe2' ) . '</strong></p></div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function pagination( $which ) {
|
|
||||||
if ( empty( $this->_pagination_args ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$total_items = intval( $this->_pagination_args['total_items'] );
|
|
||||||
$total_pages = intval( $this->_pagination_args['total_pages'] );
|
|
||||||
$infinite_scroll = false;
|
|
||||||
if ( isset( $this->_pagination_args['infinite_scroll'] ) ) {
|
|
||||||
$infinite_scroll = $this->_pagination_args['infinite_scroll'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'top' === $which && $total_pages > 1 ) {
|
|
||||||
$this->screen->render_screen_reader_content( 'heading_pagination' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Translators: Pagination
|
|
||||||
$output = '<span class="displaying-num">' . sprintf( _n( '%s item', '%s items', $total_items, 'subscribe2' ), number_format_i18n( $total_items ) ) . '</span>';
|
|
||||||
|
|
||||||
if ( isset( $_POST['what'] ) ) {
|
|
||||||
$current = 1;
|
|
||||||
} else {
|
|
||||||
$current = intval( $this->get_pagenum() );
|
|
||||||
}
|
|
||||||
|
|
||||||
$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
|
|
||||||
|
|
||||||
$current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );
|
|
||||||
|
|
||||||
if ( isset( $_REQUEST['what'] ) ) {
|
|
||||||
$current_url = add_query_arg(
|
|
||||||
array(
|
|
||||||
'what' => $_REQUEST['what'],
|
|
||||||
),
|
|
||||||
$current_url
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $_POST['s'] ) ) {
|
|
||||||
$current_url = add_query_arg(
|
|
||||||
array(
|
|
||||||
's' => $_POST['s'],
|
|
||||||
),
|
|
||||||
$current_url
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$page_links = array();
|
|
||||||
|
|
||||||
$total_pages_before = '<span class="paging-input">';
|
|
||||||
$total_pages_after = '</span>';
|
|
||||||
|
|
||||||
$disable_first = false;
|
|
||||||
$disable_last = false;
|
|
||||||
$disable_prev = false;
|
|
||||||
$disable_next = false;
|
|
||||||
|
|
||||||
if ( 1 === $current ) {
|
|
||||||
$disable_first = true;
|
|
||||||
$disable_prev = true;
|
|
||||||
}
|
|
||||||
if ( 2 === $current ) {
|
|
||||||
$disable_first = true;
|
|
||||||
}
|
|
||||||
if ( $current === $total_pages ) {
|
|
||||||
$disable_last = true;
|
|
||||||
$disable_next = true;
|
|
||||||
}
|
|
||||||
if ( $current === $total_pages - 1 ) {
|
|
||||||
$disable_last = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $disable_first ) {
|
|
||||||
$page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">«</span>';
|
|
||||||
} else {
|
|
||||||
$page_links[] = sprintf(
|
|
||||||
"<a class='first-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
|
|
||||||
esc_url( remove_query_arg( 'paged', $current_url ) ),
|
|
||||||
__( 'First page', 'subscribe2' ),
|
|
||||||
'«'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $disable_prev ) {
|
|
||||||
$page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">‹</span>';
|
|
||||||
} else {
|
|
||||||
$page_links[] = sprintf(
|
|
||||||
"<a class='prev-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
|
|
||||||
esc_url( add_query_arg( 'paged', max( 1, $current - 1 ), $current_url ) ),
|
|
||||||
__( 'Previous page', 'subscribe2' ),
|
|
||||||
'‹'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'bottom' === $which ) {
|
|
||||||
$html_current_page = $current;
|
|
||||||
$total_pages_before = '<span class="screen-reader-text">' . __( 'Current Page', 'subscribe2' ) . '</span><span id="table-paging" class="paging-input">';
|
|
||||||
} else {
|
|
||||||
$html_current_page = sprintf(
|
|
||||||
"%s<input class='current-page' id='current-page-selector' type='text' name='paged' value='%s' size='%d' aria-describedby='table-paging' />",
|
|
||||||
'<label for="current-page-selector" class="screen-reader-text">' . __( 'Current Page', 'subscribe2' ) . '</label>',
|
|
||||||
$current,
|
|
||||||
strlen( $total_pages )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );
|
|
||||||
// Translators: Pagination
|
|
||||||
$page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging', 'subscribe2' ), $html_current_page, $html_total_pages ) . $total_pages_after;
|
|
||||||
|
|
||||||
if ( $disable_next ) {
|
|
||||||
$page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">›</span>';
|
|
||||||
} else {
|
|
||||||
$page_links[] = sprintf(
|
|
||||||
"<a class='next-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
|
|
||||||
esc_url( add_query_arg( 'paged', min( $total_pages, $current + 1 ), $current_url ) ),
|
|
||||||
__( 'Next page', 'subscribe2' ),
|
|
||||||
'›'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $disable_last ) {
|
|
||||||
$page_links[] = '<span class="tablenav-pages-navspan" aria-hidden="true">»</span>';
|
|
||||||
} else {
|
|
||||||
$page_links[] = sprintf(
|
|
||||||
"<a class='last-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>",
|
|
||||||
esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),
|
|
||||||
__( 'Last page', 'subscribe2' ),
|
|
||||||
'»'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$pagination_links_class = 'pagination-links';
|
|
||||||
if ( ! empty( $infinite_scroll ) ) {
|
|
||||||
$pagination_links_class = ' hide-if-js';
|
|
||||||
}
|
|
||||||
$output .= "\n<span class='$pagination_links_class'>" . join( "\n", $page_links ) . '</span>';
|
|
||||||
|
|
||||||
if ( $total_pages ) {
|
|
||||||
$page_class = $total_pages < 2 ? ' one-page' : '';
|
|
||||||
} else {
|
|
||||||
$page_class = ' no-pages';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_pagination = "<div class='tablenav-pages{$page_class}'>$output</div>";
|
|
||||||
|
|
||||||
echo $this->_pagination; // phpcs:ignore WordPress.Security.EscapeOutput
|
|
||||||
}
|
|
||||||
|
|
||||||
public function prepare_items() {
|
|
||||||
global $mysubscribe2, $subscribers, $current_tab;
|
|
||||||
|
|
||||||
$user = get_current_user_id();
|
|
||||||
$screen = get_current_screen();
|
|
||||||
$screen_option = $screen->get_option( 'per_page', 'option' );
|
|
||||||
$per_page = get_user_meta( $user, $screen_option, true );
|
|
||||||
if ( empty( $per_page ) || $per_page < 1 ) {
|
|
||||||
$per_page = $screen->get_option( 'per_page', 'default' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$columns = $this->get_columns();
|
|
||||||
$hidden = array();
|
|
||||||
$sortable = $this->get_sortable_columns();
|
|
||||||
|
|
||||||
$this->_column_headers = array( $columns, $hidden, $sortable );
|
|
||||||
|
|
||||||
$this->process_bulk_action();
|
|
||||||
|
|
||||||
$data = array();
|
|
||||||
if ( 'public' === $current_tab ) {
|
|
||||||
foreach ( (array) $subscribers as $email ) {
|
|
||||||
$data[] = array(
|
|
||||||
'email' => $email,
|
|
||||||
'date' => $mysubscribe2->signup_date( $email ),
|
|
||||||
'time' => $mysubscribe2->signup_time( $email ),
|
|
||||||
'ip' => $mysubscribe2->signup_ip( $email ),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach ( (array) $subscribers as $subscriber ) {
|
|
||||||
$data[] = array(
|
|
||||||
'email' => $subscriber['user_email'],
|
|
||||||
'id' => $subscriber['ID'],
|
|
||||||
'date' => get_userdata( $subscriber['ID'] )->user_registered,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function usort_reorder( $a, $b ) {
|
|
||||||
$orderby = ( ! empty( $_REQUEST['orderby'] ) ) ? $_REQUEST['orderby'] : 'email';
|
|
||||||
$order = ( ! empty( $_REQUEST['order'] ) ) ? $_REQUEST['order'] : 'asc';
|
|
||||||
$result = strcasecmp( $a[ $orderby ], $b[ $orderby ] );
|
|
||||||
return ( 'asc' === $order ) ? $result : -$result;
|
|
||||||
}
|
|
||||||
usort( $data, 'usort_reorder' );
|
|
||||||
|
|
||||||
if ( isset( $_POST['what'] ) ) {
|
|
||||||
$current_page = 1;
|
|
||||||
} else {
|
|
||||||
$current_page = $this->get_pagenum();
|
|
||||||
}
|
|
||||||
$total_items = count( $data );
|
|
||||||
$data = array_slice( $data, ( ( $current_page - 1 ) * $per_page ), $per_page );
|
|
||||||
$this->items = $data;
|
|
||||||
|
|
||||||
$this->set_pagination_args(
|
|
||||||
array(
|
|
||||||
'total_items' => $total_items,
|
|
||||||
'per_page' => $per_page,
|
|
||||||
'total_pages' => ceil( $total_items / $per_page ),
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,174 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Multisite {
|
|
||||||
/* === WP Multisite specific functions === */
|
|
||||||
/**
|
|
||||||
* Handles subscriptions and unsubscriptions for different blogs on WPMU installs
|
|
||||||
*/
|
|
||||||
public function wpmu_subscribe() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
// subscribe to new blog
|
|
||||||
if ( ! empty( $_GET['s2mu_subscribe'] ) ) {
|
|
||||||
$sub_id = intval( $_GET['s2mu_subscribe'] );
|
|
||||||
if ( $sub_id >= 0 ) {
|
|
||||||
switch_to_blog( $sub_id );
|
|
||||||
|
|
||||||
$user_ID = get_current_user_id();
|
|
||||||
|
|
||||||
// if user is not a user of the current blog
|
|
||||||
if ( ! is_user_member_of_blog( $user_ID, $sub_id ) ) {
|
|
||||||
// add user to current blog as subscriber
|
|
||||||
add_user_to_blog( $sub_id, $user_ID, 'subscriber' );
|
|
||||||
// add an action hook for external manipulation of blog and user data
|
|
||||||
do_action_ref_array( 'subscribe2_wpmu_subscribe', array( $user_ID, $sub_id ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// get categories, remove excluded ones if override is off
|
|
||||||
if ( 0 === $mysubscribe2->subscribe2_options['reg_override'] ) {
|
|
||||||
$all_cats = $mysubscribe2->all_cats( true, 'ID' );
|
|
||||||
} else {
|
|
||||||
$all_cats = $mysubscribe2->all_cats( false, 'ID' );
|
|
||||||
}
|
|
||||||
|
|
||||||
$cats_string = '';
|
|
||||||
foreach ( $all_cats as $cat ) {
|
|
||||||
( '' === $cats_string ) ? $cats_string = "$cat->term_id" : $cats_string .= ",$cat->term_id";
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $cat->term_id, $cat->term_id );
|
|
||||||
}
|
|
||||||
if ( empty( $cats_string ) ) {
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ) );
|
|
||||||
} else {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), $cats_string );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elseif ( ! empty( $_GET['s2mu_unsubscribe'] ) ) {
|
|
||||||
// unsubscribe from a blog
|
|
||||||
$unsub_id = intval( $_GET['s2mu_unsubscribe'] );
|
|
||||||
if ( $unsub_id >= 0 ) {
|
|
||||||
switch_to_blog( $unsub_id );
|
|
||||||
|
|
||||||
$user_ID = get_current_user_id();
|
|
||||||
|
|
||||||
// delete subscription to all categories on that blog
|
|
||||||
$cats = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
$cats = explode( ',', $cats );
|
|
||||||
if ( ! is_array( $cats ) ) {
|
|
||||||
$cats = array( $cats );
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ( $cats as $id ) {
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $id );
|
|
||||||
}
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ) );
|
|
||||||
|
|
||||||
// add an action hook for external manipulation of blog and user data
|
|
||||||
do_action_ref_array( 'subscribe2_wpmu_unsubscribe', array( $user_ID, $unsub_id ) );
|
|
||||||
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! is_user_member_of_blog( $user_ID ) ) {
|
|
||||||
$user_blogs = get_active_blog_for_user( $user_ID );
|
|
||||||
if ( is_array( $user_blogs ) ) {
|
|
||||||
switch_to_blog( key( $user_blogs ) );
|
|
||||||
} else {
|
|
||||||
// no longer a member of a blog
|
|
||||||
wp_safe_redirect( get_option( 'siteurl' ) ); // redirect to front page
|
|
||||||
exit( 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// redirect to profile page
|
|
||||||
$url = get_option( 'siteurl' ) . '/wp-admin/admin.php?page=s2';
|
|
||||||
wp_safe_redirect( $url );
|
|
||||||
exit( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtain a list of current WordPress multiuser blogs
|
|
||||||
* Note this may affect performance but there is no alternative
|
|
||||||
*/
|
|
||||||
public function get_mu_blog_list() {
|
|
||||||
global $wpdb;
|
|
||||||
$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC", $wpdb->siteid ), ARRAY_A );
|
|
||||||
|
|
||||||
foreach ( $blogs as $details ) {
|
|
||||||
//reindex the array so the key is the same as the blog_id
|
|
||||||
$blog_list[ $details['blog_id'] ] = $details;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! is_array( $blog_list ) ) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply_filters( 's2_mu_blog_list', $blog_list );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register user details when new user is added to a multisite blog
|
|
||||||
*/
|
|
||||||
public function wpmu_add_user( $user_ID = 0 ) {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( 0 === $user_ID ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( 'yes' === $mysubscribe2->subscribe2_options['autosub'] ) {
|
|
||||||
$mysubscribe2->register( $user_ID, true );
|
|
||||||
} else {
|
|
||||||
$mysubscribe2->register( $user_ID, false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete user details when a user is removed from a multisite blog
|
|
||||||
*/
|
|
||||||
public function wpmu_remove_user( $user_ID ) {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( 0 === $user_ID ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ) );
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ) );
|
|
||||||
$cats = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
if ( ! empty( $cats ) ) {
|
|
||||||
$cats = explode( ',', $cats );
|
|
||||||
foreach ( $cats as $cat ) {
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $cat );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rename WPMU widgets on upgrade without requiring user to re-enable
|
|
||||||
*/
|
|
||||||
public function namechange_subscribe2_widget() {
|
|
||||||
global $wpdb;
|
|
||||||
$blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
|
|
||||||
|
|
||||||
foreach ( $blogs as $blog ) {
|
|
||||||
switch_to_blog( $blog );
|
|
||||||
|
|
||||||
$sidebars = get_option( 'sidebars_widgets' );
|
|
||||||
if ( empty( $sidebars ) || ! is_array( $sidebars ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$changed = false;
|
|
||||||
foreach ( $sidebars as $s => $sidebar ) {
|
|
||||||
if ( empty( $sidebar ) || ! is_array( $sidebar ) ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
foreach ( $sidebar as $w => $widget ) {
|
|
||||||
if ( 'subscribe2widget' === $widget ) {
|
|
||||||
$sidebars[ $s ][ $w ] = 'subscribe2';
|
|
||||||
$changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( $changed ) {
|
|
||||||
update_option( 'sidebar_widgets', $sidebars );
|
|
||||||
}
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Uninstall {
|
|
||||||
public function uninstall() {
|
|
||||||
global $wp_version, $wpmu_version;
|
|
||||||
// Is Subscribe2 free active
|
|
||||||
if ( is_plugin_active( 'subscribe2/subscribe2.php' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is this WordPressMU or not?
|
|
||||||
if ( isset( $wpmu_version ) || strpos( $wp_version, 'wordpress-mu' ) ) {
|
|
||||||
$s2_mu = true;
|
|
||||||
}
|
|
||||||
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
|
|
||||||
$s2_mu = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $s2_mu ) && true === $s2_mu ) {
|
|
||||||
global $wpdb;
|
|
||||||
$blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
|
|
||||||
foreach ( $blogs as $blog ) {
|
|
||||||
switch_to_blog( $blog );
|
|
||||||
$this->clean_database();
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->clean_database();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function clean_database() {
|
|
||||||
global $wpdb;
|
|
||||||
// delete entry from wp_options table
|
|
||||||
delete_option( 'subscribe2_options' );
|
|
||||||
// delete legacy entry from wp-options table
|
|
||||||
delete_option( 's2_future_posts' );
|
|
||||||
// remove and scheduled events
|
|
||||||
wp_clear_scheduled_hook( 's2_digest_cron' );
|
|
||||||
// delete usermeta data for registered users
|
|
||||||
// use LIKE and % wildcard as meta_key names are prepended on WPMU
|
|
||||||
// and s2_cat is appended with category ID integer
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_cat%'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_subscribed'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_format'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_autosub'" );
|
|
||||||
// delete any postmeta data that supressed notifications
|
|
||||||
$wpdb->query( "DELETE from $wpdb->postmeta WHERE meta_key = 's2mail'" );
|
|
||||||
|
|
||||||
// drop the subscribe2 table
|
|
||||||
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}subscribe2" );
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,554 +0,0 @@
|
|||||||
<?php
|
|
||||||
class S2_Upgrade {
|
|
||||||
/* ===== Install and reset ===== */
|
|
||||||
/**
|
|
||||||
* Install our table
|
|
||||||
*/
|
|
||||||
public function install() {
|
|
||||||
global $wpdb, $mysubscribe2;
|
|
||||||
// load our translations and strings
|
|
||||||
$mysubscribe2->load_translations();
|
|
||||||
|
|
||||||
// include upgrade functions
|
|
||||||
if ( ! function_exists( 'maybe_create_table' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
$charset_collate = '';
|
|
||||||
if ( ! empty( $wpdb->charset ) ) {
|
|
||||||
$charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset}";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $wpdb->collate ) ) {
|
|
||||||
$charset_collate .= " COLLATE {$wpdb->collate}";
|
|
||||||
}
|
|
||||||
|
|
||||||
$date = gmdate( 'Y-m-d' );
|
|
||||||
$sql = "CREATE TABLE $wpdb->subscribe2 (
|
|
||||||
id int(11) NOT NULL auto_increment,
|
|
||||||
email varchar(64) NOT NULL default '',
|
|
||||||
active tinyint(1) default 0,
|
|
||||||
date DATE default '$date' NOT NULL,
|
|
||||||
time TIME DEFAULT '00:00:00' NOT NULL,
|
|
||||||
ip char(64) NOT NULL default 'admin',
|
|
||||||
conf_date DATE,
|
|
||||||
conf_time TIME,
|
|
||||||
conf_ip char(64),
|
|
||||||
PRIMARY KEY (id) ) $charset_collate";
|
|
||||||
|
|
||||||
// create the table, as needed
|
|
||||||
maybe_create_table( $wpdb->subscribe2, $sql );
|
|
||||||
|
|
||||||
// safety check if options exist and if not create them
|
|
||||||
if ( ! is_array( $mysubscribe2->subscribe2_options ) ) {
|
|
||||||
$this->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
// create table entries for registered users
|
|
||||||
$users = $mysubscribe2->get_all_registered( 'ID' );
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user_ID ) {
|
|
||||||
$check_format = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true );
|
|
||||||
if ( empty( $check_format ) ) {
|
|
||||||
// no prior settings so create them
|
|
||||||
$mysubscribe2->register( $user_ID );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset our options
|
|
||||||
*/
|
|
||||||
public function reset() {
|
|
||||||
// load our translations and strings
|
|
||||||
global $mysubscribe2;
|
|
||||||
$mysubscribe2->load_translations();
|
|
||||||
|
|
||||||
delete_option( 'subscribe2_options' );
|
|
||||||
wp_clear_scheduled_hook( 's2_digest_cron' );
|
|
||||||
unset( $mysubscribe2->subscribe2_options );
|
|
||||||
require S2PATH . 'include/options.php';
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = S2VERSION;
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Core upgrade function for the database and settings
|
|
||||||
*/
|
|
||||||
public function upgrade() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
// load our translations and strings
|
|
||||||
$mysubscribe2->load_translations();
|
|
||||||
|
|
||||||
// ensure that the options are in the database
|
|
||||||
require S2PATH . 'include/options.php';
|
|
||||||
// catch older versions that didn't use serialised options
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['version'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '2.0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// let's take the time to ensure that database entries exist for all registered users
|
|
||||||
$this->upgrade_core();
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '2.3', '<' ) ) {
|
|
||||||
$this->upgrade2_3();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '2.3';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '5.1', '<' ) ) {
|
|
||||||
$this->upgrade5_1();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '5.1';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '5.6', '<' ) ) {
|
|
||||||
$this->upgrade5_6();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '5.6';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '5.9', '<' ) ) {
|
|
||||||
$this->upgrade5_9();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '5.9';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '6.4', '<' ) ) {
|
|
||||||
$this->upgrade6_4();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '6.4';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '7.0', '<' ) ) {
|
|
||||||
$this->upgrade7_0();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '7.0';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '8.5', '<' ) ) {
|
|
||||||
$this->upgrade8_5();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '8.5';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '8.6', '<' ) ) {
|
|
||||||
$this->upgrade8_6();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '8.6';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '8.8', '<' ) ) {
|
|
||||||
$this->upgrade8_8();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '8.8';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '9.5', '<' ) ) {
|
|
||||||
$this->upgrade9_5();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '9.5';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '10.14', '<' ) ) {
|
|
||||||
$this->upgrade10_14();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '10.14';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
if ( version_compare( $mysubscribe2->subscribe2_options['version'], '10.23', '<' ) ) {
|
|
||||||
$this->upgrade10_23();
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = '10.23';
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
|
|
||||||
$mysubscribe2->subscribe2_options['version'] = S2VERSION;
|
|
||||||
update_option( 'subscribe2_options', $mysubscribe2->subscribe2_options );
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade_core() {
|
|
||||||
// let's take the time to double check data for registered users
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( version_compare( $mysubscribe2->wp_release, '3.5', '<' ) ) {
|
|
||||||
global $wpdb;
|
|
||||||
$users = $wpdb->get_col( $wpdb->prepare( "SELECT ID from $wpdb->users WHERE ID NOT IN (SELECT user_id FROM $wpdb->usermeta WHERE meta_key=%s)", $mysubscribe2->get_usermeta_keyname( 's2_format' ) ) );
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user_ID ) {
|
|
||||||
$mysubscribe2->register( $user_ID );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$args = array(
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_format' ),
|
|
||||||
'compare' => 'NOT EXISTS',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
$mysubscribe2->register( $user->ID );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// let's make sure that the 's2_authors' key exists on every site for all Registered Users too
|
|
||||||
$this->upgrade7_0();
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade2_3() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
|
|
||||||
// include upgrade functions
|
|
||||||
if ( ! function_exists( 'maybe_add_column' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
$date = gmdate( 'Y-m-d' );
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'date', "ALTER TABLE $wpdb->subscribe2 ADD date DATE DEFAULT '$date' NOT NULL AFTER active" );
|
|
||||||
|
|
||||||
// update the options table to serialized format
|
|
||||||
$old_options = $wpdb->get_col( "SELECT option_name from $wpdb->options where option_name LIKE 's2%' AND option_name <> 's2_future_posts'" );
|
|
||||||
|
|
||||||
if ( ! empty( $old_options ) ) {
|
|
||||||
foreach ( $old_options as $option ) {
|
|
||||||
$value = get_option( $option );
|
|
||||||
$option_array = substr( $option, 3 );
|
|
||||||
$mysubscribe2->subscribe2_options[ $option_array ] = $value;
|
|
||||||
delete_option( $option );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade5_1() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
|
|
||||||
// include upgrade functions
|
|
||||||
if ( ! function_exists( 'maybe_add_column' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'ip', "ALTER TABLE $wpdb->subscribe2 ADD ip char(64) DEFAULT 'admin' NOT NULL AFTER date" );
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade5_6() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
// correct autoformat to upgrade from pre 5.6
|
|
||||||
if ( 'text' === $mysubscribe2->subscribe2_options['autoformat'] ) {
|
|
||||||
$mysubscribe2->subscribe2_options['autoformat'] = 'excerpt';
|
|
||||||
}
|
|
||||||
if ( 'full' === $mysubscribe2->subscribe2_options['autoformat'] ) {
|
|
||||||
$mysubscribe2->subscribe2_options['autoformat'] = 'post';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade5_9() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
// ensure existing public subscriber emails are all sanitized
|
|
||||||
$confirmed = $mysubscribe2->get_public();
|
|
||||||
$unconfirmed = $mysubscribe2->get_public( 0 );
|
|
||||||
$public_subscribers = array_merge( (array) $confirmed, (array) $unconfirmed );
|
|
||||||
|
|
||||||
foreach ( $public_subscribers as $email ) {
|
|
||||||
$new_email = $mysubscribe2->sanitize_email( $email );
|
|
||||||
if ( $email !== $new_email ) {
|
|
||||||
$wpdb->get_results( $wpdb->prepare( "UPDATE $wpdb->subscribe2 SET email=%s WHERE CAST(email as binary)=%s", $new_email, $email ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade6_4() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
// change old CAPITALISED keywords to those in {PARENTHESES}; since version 6.4
|
|
||||||
$keywords = array( 'BLOGNAME', 'BLOGLINK', 'TITLE', 'POST', 'POSTTIME', 'TABLE', 'TABLELINKS', 'PERMALINK', 'TINYLINK', 'DATE', 'TIME', 'MYNAME', 'EMAIL', 'AUTHORNAME', 'LINK', 'CATS', 'TAGS', 'COUNT', 'ACTION' );
|
|
||||||
$keyword = implode( '|', $keywords );
|
|
||||||
$regex = '/(?<!\{)\b(' . $keyword . ')\b(?!\{)/xm';
|
|
||||||
$replace = '{\1}';
|
|
||||||
|
|
||||||
$mysubscribe2->subscribe2_options['mailtext'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['mailtext'] );
|
|
||||||
$mysubscribe2->subscribe2_options['notification_subject'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['notification_subject'] );
|
|
||||||
$mysubscribe2->subscribe2_options['confirm_email'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['confirm_email'] );
|
|
||||||
$mysubscribe2->subscribe2_options['confirm_subject'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['confirm_subject'] );
|
|
||||||
$mysubscribe2->subscribe2_options['remind_email'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['remind_email'] );
|
|
||||||
$mysubscribe2->subscribe2_options['remind_subject'] = preg_replace( $regex, $replace, $mysubscribe2->subscribe2_options['remind_subject'] );
|
|
||||||
|
|
||||||
if ( version_compare( $mysubscribe2->wp_release, '3.5', '<' ) ) {
|
|
||||||
$users = $mysubscribe2->get_all_registered( 'ID' );
|
|
||||||
foreach ( $users as $user_ID ) {
|
|
||||||
$check_format = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ), true );
|
|
||||||
// if user is already registered update format remove 's2_excerpt' field and update 's2_format'
|
|
||||||
if ( 'html' === $check_format ) {
|
|
||||||
delete_user_meta( $user_ID, 's2_excerpt' );
|
|
||||||
} elseif ( 'text' === $check_format ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ), get_user_meta( $user_ID, 's2_excerpt' ) );
|
|
||||||
delete_user_meta( $user_ID, 's2_excerpt' );
|
|
||||||
}
|
|
||||||
$subscribed = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
if ( strstr( $subscribed, '-1' ) ) {
|
|
||||||
// make sure we remove '-1' from any settings
|
|
||||||
$old_cats = explode( ',', $subscribed );
|
|
||||||
$pos = array_search( '-1', $old_cats, true );
|
|
||||||
unset( $old_cats[ $pos ] );
|
|
||||||
$cats = implode( ',', $old_cats );
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), $cats );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$args = array(
|
|
||||||
'relation' => 'AND',
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_format' ),
|
|
||||||
'value' => 'html',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => 's2_excerpt',
|
|
||||||
'compare' => 'EXISTS',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
delete_user_meta( $user->ID, 's2_excerpt' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$args = array(
|
|
||||||
'relation' => 'AND',
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_format' ),
|
|
||||||
'value' => 'text',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => 's2_excerpt',
|
|
||||||
'compare' => 'EXISTS',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
update_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ), get_user_meta( $user->ID, 's2_excerpt' ) );
|
|
||||||
delete_user_meta( $user->ID, 's2_excerpt' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$args = array(
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ),
|
|
||||||
'value' => '-1',
|
|
||||||
'compare' => 'LIKE',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
$subscribed = get_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
$old_cats = explode( ',', $subscribed );
|
|
||||||
$pos = array_search( '-1', $old_cats, true );
|
|
||||||
unset( $old_cats[ $pos ] );
|
|
||||||
$cats = implode( ',', $old_cats );
|
|
||||||
update_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), $cats );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// upgrade old wpmu user meta data to new
|
|
||||||
if ( true === $mysubscribe2->s2_mu ) {
|
|
||||||
global $s2class_multisite, $wpdb;
|
|
||||||
$s2class_multisite->namechange_subscribe2_widget();
|
|
||||||
// loop through all users
|
|
||||||
foreach ( $users as $user_ID ) {
|
|
||||||
// get categories which the user is subscribed to (old ones)
|
|
||||||
$categories = get_user_meta( $user_ID, 's2_subscribed', true );
|
|
||||||
$categories = explode( ',', $categories );
|
|
||||||
$format = get_user_meta( $user_ID, 's2_format', true );
|
|
||||||
$autosub = get_user_meta( $user_ID, 's2_autosub', true );
|
|
||||||
|
|
||||||
// load blogs of user (only if we need them)
|
|
||||||
$blogs = array();
|
|
||||||
if ( count( $categories ) > 0 && ! in_array( '-1', $categories, true ) ) {
|
|
||||||
$blogs = get_blogs_of_user( $user_ID, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ( $blogs as $blog ) {
|
|
||||||
switch_to_blog( $blog->userblog_id );
|
|
||||||
|
|
||||||
$blog_categories = (array) $wpdb->get_col( "SELECT term_id FROM $wpdb->term_taxonomy WHERE taxonomy = 'category'" );
|
|
||||||
$subscribed_categories = array_intersect( $categories, $blog_categories );
|
|
||||||
if ( ! empty( $subscribed_categories ) ) {
|
|
||||||
foreach ( $subscribed_categories as $subscribed_category ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_cat' ) . $subscribed_category, $subscribed_category );
|
|
||||||
}
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), implode( ',', $subscribed_categories ) );
|
|
||||||
}
|
|
||||||
if ( ! empty( $format ) ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_format' ), $format );
|
|
||||||
}
|
|
||||||
if ( ! empty( $autosub ) ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_autosub' ), $autosub );
|
|
||||||
}
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete old user meta keys
|
|
||||||
delete_user_meta( $user_ID, 's2_subscribed' );
|
|
||||||
delete_user_meta( $user_ID, 's2_format' );
|
|
||||||
delete_user_meta( $user_ID, 's2_autosub' );
|
|
||||||
foreach ( $categories as $cat ) {
|
|
||||||
delete_user_meta( $user_ID, 's2_cat' . $cat );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade7_0() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
if ( version_compare( $mysubscribe2->wp_release, '3.5', '<' ) ) {
|
|
||||||
$users = $wpdb->get_col( $wpdb->prepare( "SELECT ID from $wpdb->users WHERE ID NOT IN (SELECT user_id from $wpdb->usermeta WHERE meta_key=%s", $mysubscribe2->get_usermeta_keyname( 's2_authors' ) ) );
|
|
||||||
foreach ( $users as $user_ID ) {
|
|
||||||
$check_authors = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), true );
|
|
||||||
if ( empty( $check_authors ) ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), '' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$args = array(
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_authors' ),
|
|
||||||
'compare' => 'NOT EXISTS',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
update_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_authors' ), '' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade8_5() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
|
|
||||||
// include upgrade functions
|
|
||||||
if ( ! function_exists( 'maybe_add_column' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'time', "ALTER TABLE $wpdb->subscribe2 ADD time TIME DEFAULT '00:00:00' NOT NULL AFTER date" );
|
|
||||||
|
|
||||||
// update postmeta field to a protected name, from version 8.5
|
|
||||||
$wpdb->query( "UPDATE $wpdb->postmeta SET meta_key = '_s2mail' WHERE meta_key = 's2mail'" );
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade8_6() {
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
|
|
||||||
// include upgrade functions
|
|
||||||
if ( ! function_exists( 'maybe_add_column' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'conf_date', "ALTER TABLE $wpdb->subscribe2 ADD conf_date DATE AFTER ip" );
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'conf_time', "ALTER TABLE $wpdb->subscribe2 ADD conf_time TIME AFTER conf_date" );
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'conf_ip', "ALTER TABLE $wpdb->subscribe2 ADD conf_ip char(64) AFTER conf_time" );
|
|
||||||
|
|
||||||
// remove unnecessary table data
|
|
||||||
$wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key = 's2_cat'" );
|
|
||||||
|
|
||||||
$users = $wpdb->get_results(
|
|
||||||
$wpdb->prepare(
|
|
||||||
"SELECT ID FROM $wpdb->users INNER JOIN $wpdb->usermeta ON ( $wpdb->users.ID = $wpdb->usermeta.user_id) WHERE ( $wpdb->usermeta.meta_key = %s AND $wpdb->usermeta.meta_value LIKE %s )",
|
|
||||||
$mysubscribe2->get_usermeta_keyname( 's2_subscribed' ),
|
|
||||||
$wpdb->esc_like( ',' ) . '%'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
// make sure we remove leading ',' from this setting
|
|
||||||
$subscribed = get_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
$old_cats = explode( ',', $subscribed );
|
|
||||||
unset( $old_cats[0] );
|
|
||||||
$cats = implode( ',', $old_cats );
|
|
||||||
update_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), $cats );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade8_8() {
|
|
||||||
// to ensure compulsory category collects all users we need there to be s2_subscribed meta-keys for all users
|
|
||||||
global $mysubscribe2, $wpdb;
|
|
||||||
|
|
||||||
if ( version_compare( $mysubscribe2->wp_release, '3.5', '<' ) ) {
|
|
||||||
$all_registered = $mysubscribe2->get_all_registered( 'ID' );
|
|
||||||
if ( ! empty( $all_registered ) ) {
|
|
||||||
foreach ( $all_registered as $user_ID ) {
|
|
||||||
$check_subscribed = get_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), true );
|
|
||||||
if ( empty( $check_subscribed ) ) {
|
|
||||||
update_user_meta( $user_ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), '' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$args = array(
|
|
||||||
'meta_query' => array(
|
|
||||||
array(
|
|
||||||
'key' => $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ),
|
|
||||||
'compare' => 'NOT EXISTS',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
$user_query = new WP_User_Query( $args );
|
|
||||||
$users = $user_query->get_results();
|
|
||||||
if ( ! empty( $users ) ) {
|
|
||||||
foreach ( $users as $user ) {
|
|
||||||
update_user_meta( $user->ID, $mysubscribe2->get_usermeta_keyname( 's2_subscribed' ), '' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check the time column again as the upgrade8_6() function contained a bug
|
|
||||||
// include upgrade-functions for maybe_add_column;
|
|
||||||
if ( ! function_exists( 'maybe_add_column' ) ) {
|
|
||||||
require_once ABSPATH . 'wp-admin/install-helper.php';
|
|
||||||
}
|
|
||||||
maybe_add_column( $wpdb->subscribe2, 'time', "ALTER TABLE $wpdb->subscribe2 ADD time TIME DEFAULT '00:00:00' NOT NULL AFTER date" );
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade9_5() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( 'never' !== $mysubscribe2->subscribe2_options['email_freq'] ) {
|
|
||||||
$mysubscribe2->subscribe2_options['last_s2cron'] = '';
|
|
||||||
unset( $mysubscribe2->subscribe2_options['previous_s2cron'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade10_14() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['frontend_form'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['frontend_form'] = '0';
|
|
||||||
}
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['dismiss_sender_warning'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['dismiss_sender_warning'] = '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade10_15() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['js_ip_updater'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['js_ip_updater'] = '0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function upgrade10_23() {
|
|
||||||
global $mysubscribe2;
|
|
||||||
if ( isset( $mysubscribe2->subscribe2_options['entries'] ) ) {
|
|
||||||
unset( $mysubscribe2->subscribe2_options['entries'] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
<?php
|
|
||||||
/* THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. */
|
|
||||||
/* THIS FILE EXPOSES STRINGS FROM JAVASCRIPT FILES FOR TRANSLATION */
|
|
||||||
$generated_i18n_strings = array(
|
|
||||||
__( 'Subscribe2 HTML', 'subscribe2' ),
|
|
||||||
__( 'email', 'subscribe2' ),
|
|
||||||
__( 'notification', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Shortcode Parameters', 'subscribe2' ),
|
|
||||||
__( 'Button Display Options', 'subscribe2' ),
|
|
||||||
__( 'Show Both Buttons', 'subscribe2' ),
|
|
||||||
__( 'Hide Subscribe Button', 'subscribe2' ),
|
|
||||||
__( 'Hide Unsubscribe Button', 'subscribe2' ),
|
|
||||||
__( 'Page ID', 'subscribe2' ),
|
|
||||||
__( 'Disable Javascript', 'subscribe2' ),
|
|
||||||
__( 'Disable Simple Anti-Spam Measures', 'subscribe2' ),
|
|
||||||
__( 'Textbox size', 'subscribe2' ),
|
|
||||||
__( 'Disable wrapping of form buttons', 'subscribe2' ),
|
|
||||||
__( 'Link Text', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 HTML Shortcode', 'subscribe2' ),
|
|
||||||
__( 'Check here to disable sending of an email notification for this post/page', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Resend', 'subscribe2' ),
|
|
||||||
__( 'Resend the notification email of this post to current subscribers:', 'subscribe2' ),
|
|
||||||
__( 'Resend Notification', 'subscribe2' ),
|
|
||||||
__( 'Attempt made to send email preview', 'subscribe2' ),
|
|
||||||
__( 'Attempt made to resend email notification', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Sidebar', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Sidebar', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Override', 'subscribe2' ),
|
|
||||||
__( 'Subscribe2 Preview', 'subscribe2' ),
|
|
||||||
__( 'Send preview email of this post to currently logged in user:', 'subscribe2' ),
|
|
||||||
__( 'Send Preview', 'subscribe2' ),
|
|
||||||
);
|
|
@ -1,401 +0,0 @@
|
|||||||
// Version 1.0 - Initial version
|
|
||||||
// Version 1.0.1 - fix for useOnce deprecation, improve Transition from unsaved block and update 'edit' drop use of id
|
|
||||||
// Version 1.0.2 - fixed issue with transformation of text box size at default value
|
|
||||||
// Version 1.1 - eslinted and fixed bug in transformation of wrap attribute
|
|
||||||
|
|
||||||
( function( blocks, i18n, element, components, editor ) {
|
|
||||||
var el = element.createElement,
|
|
||||||
TextControl = components.TextControl,
|
|
||||||
CheckboxControl = components.CheckboxControl,
|
|
||||||
RadioControl = components.RadioControl;
|
|
||||||
|
|
||||||
function s2shortcode( props, control, newVal ) {
|
|
||||||
var attributes = props.attributes || '';
|
|
||||||
var hide = '',
|
|
||||||
id = '',
|
|
||||||
nojs = '',
|
|
||||||
antispam = '',
|
|
||||||
size = '',
|
|
||||||
wrap = '',
|
|
||||||
link = '';
|
|
||||||
|
|
||||||
// First we define the shortcode parameters from known Control values
|
|
||||||
if ( 'subscribe' === attributes.hide ) {
|
|
||||||
hide = ' hide="subscribe"';
|
|
||||||
} else if ( 'unsubscribe' === attributes.hide ) {
|
|
||||||
hide = ' hide="unsubscribe"';
|
|
||||||
}
|
|
||||||
if ( '' !== attributes.id && undefined !== attributes.id ) {
|
|
||||||
id = ' id="' + attributes.id + '"';
|
|
||||||
}
|
|
||||||
if ( true === attributes.nojs ) {
|
|
||||||
nojs = ' nojs="true"';
|
|
||||||
}
|
|
||||||
if ( true === attributes.antispam ) {
|
|
||||||
antispam = ' antispam="true"';
|
|
||||||
}
|
|
||||||
if ( '' !== attributes.size && undefined !== attributes.size && '20' !== attributes.size ) {
|
|
||||||
size = ' size="' + attributes.size + '"';
|
|
||||||
}
|
|
||||||
if ( true === attributes.wrap ) {
|
|
||||||
wrap = ' wrap="false"';
|
|
||||||
}
|
|
||||||
if ( '' !== attributes.link && undefined !== attributes.link ) {
|
|
||||||
link = ' link="' + attributes.link + '"';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second we amend parameter values based on recent input as values are asynchronous
|
|
||||||
switch ( control ) {
|
|
||||||
case 'hide':
|
|
||||||
if ( 'none' === newVal ) {
|
|
||||||
hide = '';
|
|
||||||
} else if ( 'subscribe' === newVal ) {
|
|
||||||
hide = ' hide="subscribe"';
|
|
||||||
} else if ( 'unsubscribe' === newVal ) {
|
|
||||||
hide = ' hide="unsubscribe"';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'id':
|
|
||||||
if ( '' === newVal ) {
|
|
||||||
id = '';
|
|
||||||
} else {
|
|
||||||
id = ' id="' + newVal + '"';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'nojs':
|
|
||||||
if ( true === newVal ) {
|
|
||||||
nojs = ' nojs="true"';
|
|
||||||
} else if ( false === newVal ) {
|
|
||||||
nojs = '';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'antispam':
|
|
||||||
if ( true === newVal ) {
|
|
||||||
antispam = ' antispam="true"';
|
|
||||||
} else if ( false === newVal ) {
|
|
||||||
antispam = '';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'size':
|
|
||||||
if ( '20' === newVal ) {
|
|
||||||
size = '';
|
|
||||||
} else {
|
|
||||||
size = ' size="' + newVal + '"';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'wrap':
|
|
||||||
if ( true === newVal ) {
|
|
||||||
wrap = ' wrap="false"';
|
|
||||||
} else if ( false === newVal ) {
|
|
||||||
wrap = '';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'link':
|
|
||||||
if ( '' === newVal ) {
|
|
||||||
link = '';
|
|
||||||
} else {
|
|
||||||
link = ' link="' + newVal + '"';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we construct and return our shortcode
|
|
||||||
props.attributes.shortcode = '[subscribe2' + hide + id + nojs + antispam + size + wrap + link + ']';
|
|
||||||
return props.attributes.shortcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
blocks.registerBlockType(
|
|
||||||
'subscribe2-html/shortcode',
|
|
||||||
{
|
|
||||||
title: i18n.__( 'Subscribe2 HTML', 'subscribe2' ),
|
|
||||||
icon: 'email',
|
|
||||||
category: 'widgets',
|
|
||||||
keywords: [
|
|
||||||
i18n.__( 'email', 'subscribe2' ),
|
|
||||||
i18n.__( 'notification', 'subscribe2' )
|
|
||||||
],
|
|
||||||
supports: {
|
|
||||||
customClassName: false,
|
|
||||||
className: false,
|
|
||||||
multiple: false,
|
|
||||||
html: false
|
|
||||||
},
|
|
||||||
attributes: {
|
|
||||||
shortcode: {
|
|
||||||
type: 'text',
|
|
||||||
selector: 'p'
|
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: 'string'
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: 'string'
|
|
||||||
},
|
|
||||||
nojs: {
|
|
||||||
type: 'boolean'
|
|
||||||
},
|
|
||||||
antispam: {
|
|
||||||
type: 'boolean'
|
|
||||||
},
|
|
||||||
size: {
|
|
||||||
type: 'number'
|
|
||||||
},
|
|
||||||
wrap: {
|
|
||||||
type: 'boolean'
|
|
||||||
},
|
|
||||||
link: {
|
|
||||||
type: 'string'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
transforms: {
|
|
||||||
to: [
|
|
||||||
{
|
|
||||||
type: 'block',
|
|
||||||
blocks: [ 'core/shortcode' ],
|
|
||||||
transform: function( content ) {
|
|
||||||
if ( undefined === content.shortcode || '' === content.shortcode ) {
|
|
||||||
content.shortcode = '[subscribe2]';
|
|
||||||
}
|
|
||||||
return blocks.createBlock( 'core/shortcode', { text: content.shortcode } );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
from: [
|
|
||||||
{
|
|
||||||
type: 'block',
|
|
||||||
blocks: [ 'core/shortcode' ],
|
|
||||||
transform: function( content ) {
|
|
||||||
var shortcode, params, param, hide, id, nojs, antispam, size, wrap, link, i, l;
|
|
||||||
if ( 'subscribe2' === content.text.substr( 1, 10 ) ) {
|
|
||||||
shortcode = content.text;
|
|
||||||
params = content.text.replace( /^\[subscribe2|\]$/g, '' ).replace( /^\s+|\s+$/g, '' ).split( /['"]\s/g );
|
|
||||||
l = params.length;
|
|
||||||
|
|
||||||
for ( i = 0; i < l; i++ ) {
|
|
||||||
param = params[i].split( '=' );
|
|
||||||
if ( 'hide' === param[0] ) {
|
|
||||||
hide = param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'id' === param[0] ) {
|
|
||||||
id = param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'nojs' === param[0] ) {
|
|
||||||
nojs = 'true' === param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'antispam' === param[0] ) {
|
|
||||||
antispam = 'true' === param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'size' === param[0] ) {
|
|
||||||
size = param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'wrap' === param[0] ) {
|
|
||||||
wrap = 'false' === param[1].replace( /['"]+/g, '' );
|
|
||||||
}
|
|
||||||
if ( 'link' === param[0] ) {
|
|
||||||
link = param[1].replace( /^['"]|['"]$/g, '' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return blocks.createBlock(
|
|
||||||
'subscribe2-html/shortcode',
|
|
||||||
{
|
|
||||||
shortcode: shortcode,
|
|
||||||
hide: hide,
|
|
||||||
id: id,
|
|
||||||
nojs: nojs,
|
|
||||||
antispam: antispam,
|
|
||||||
size: size,
|
|
||||||
wrap: wrap,
|
|
||||||
link: link
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'shortcode',
|
|
||||||
tag: 'subscribe2',
|
|
||||||
attributes: {
|
|
||||||
shortcode: {
|
|
||||||
type: 'string',
|
|
||||||
selector: 'p'
|
|
||||||
},
|
|
||||||
hide: {
|
|
||||||
type: 'string',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.hide || 'none';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
id: {
|
|
||||||
type: 'string',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.id || '';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nojs: {
|
|
||||||
type: 'boolean',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.nojs || false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
antispam: {
|
|
||||||
type: 'boolean',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.antispam || false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
size: {
|
|
||||||
type: 'number',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.size || '20';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
wrap: {
|
|
||||||
type: 'boolean',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.wrap || false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
link: {
|
|
||||||
type: 'string',
|
|
||||||
shortcode: function( content ) {
|
|
||||||
return content.named.link || '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
edit: function( props ) {
|
|
||||||
var hide = props.attributes.hide || 'none',
|
|
||||||
id = props.attributes.id || '',
|
|
||||||
nojs = props.attributes.nojs || false,
|
|
||||||
antispam = props.attributes.antispam || false,
|
|
||||||
size = props.attributes.size || '20',
|
|
||||||
wrap = props.attributes.wrap || false,
|
|
||||||
link = props.attributes.link || '',
|
|
||||||
isSelected = props.isSelected;
|
|
||||||
|
|
||||||
function onChangeHide( newHide ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'hide', newHide );
|
|
||||||
props.setAttributes( { hide: newHide } );
|
|
||||||
}
|
|
||||||
function onChangeId( newId ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'id', newId );
|
|
||||||
props.setAttributes( { id: newId } );
|
|
||||||
}
|
|
||||||
function onChangeNojs( newNojs ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'nojs', newNojs );
|
|
||||||
props.setAttributes( { nojs: newNojs } );
|
|
||||||
}
|
|
||||||
function onChangeAntispam( newAntispam ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'antispam', newAntispam );
|
|
||||||
props.setAttributes( { antispam: newAntispam } );
|
|
||||||
}
|
|
||||||
function onChangeSize( newSize ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'size', newSize );
|
|
||||||
props.setAttributes( { size: newSize } );
|
|
||||||
}
|
|
||||||
function onChangeWrap( newWrap ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'wrap', newWrap );
|
|
||||||
props.setAttributes( { wrap: newWrap } );
|
|
||||||
}
|
|
||||||
function onChangeLink( newLink ) {
|
|
||||||
props.attributes.shortcode = s2shortcode( props, 'link', newLink );
|
|
||||||
props.setAttributes( { link: newLink } );
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
isSelected && el(
|
|
||||||
editor.InspectorControls,
|
|
||||||
{ key: 'subscribe2-html/inspector' },
|
|
||||||
el( 'h3', {}, i18n.__( 'Subscribe2 Shortcode Parameters', 'subscribe2' ) ),
|
|
||||||
el(
|
|
||||||
RadioControl,
|
|
||||||
{
|
|
||||||
label: i18n.__( 'Button Display Options', 'subscribe2' ),
|
|
||||||
selected: hide,
|
|
||||||
onChange: onChangeHide,
|
|
||||||
options: [
|
|
||||||
{ value: 'none', label: i18n.__( 'Show Both Buttons', 'subscribe2' ) },
|
|
||||||
{ value: 'subscribe', label: i18n.__( 'Hide Subscribe Button', 'subscribe2' ) },
|
|
||||||
{ value: 'unsubscribe', label: i18n.__( 'Hide Unsubscribe Button', 'subscribe2' ) }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
TextControl,
|
|
||||||
{
|
|
||||||
type: 'number',
|
|
||||||
label: i18n.__( 'Page ID', 'subscribe2' ),
|
|
||||||
value: id,
|
|
||||||
onChange: onChangeId
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
CheckboxControl,
|
|
||||||
{
|
|
||||||
label: i18n.__( 'Disable Javascript', 'subscribe2' ),
|
|
||||||
checked: nojs,
|
|
||||||
onChange: onChangeNojs
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
CheckboxControl,
|
|
||||||
{
|
|
||||||
label: i18n.__( 'Disable Simple Anti-Spam Measures', 'subscribe2' ),
|
|
||||||
checked: antispam,
|
|
||||||
onChange: onChangeAntispam
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
TextControl,
|
|
||||||
{
|
|
||||||
type: 'number',
|
|
||||||
label: i18n.__( 'Textbox size', 'subscribe2' ),
|
|
||||||
value: size,
|
|
||||||
onChange: onChangeSize
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
CheckboxControl,
|
|
||||||
{
|
|
||||||
label: i18n.__( 'Disable wrapping of form buttons', 'subscribe2' ),
|
|
||||||
checked: wrap,
|
|
||||||
onChange: onChangeWrap
|
|
||||||
}
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
TextControl,
|
|
||||||
{
|
|
||||||
type: 'string',
|
|
||||||
label: i18n.__( 'Link Text', 'subscribe2' ),
|
|
||||||
value: link,
|
|
||||||
onChange: onChangeLink
|
|
||||||
}
|
|
||||||
)
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
'div',
|
|
||||||
{
|
|
||||||
key: 'subscribe2-html/block',
|
|
||||||
style: { backgroundColor: '#ff0', color: '#000', padding: '2px', 'textAlign': 'center' }
|
|
||||||
},
|
|
||||||
i18n.__( 'Subscribe2 HTML Shortcode', 'subscribe2' )
|
|
||||||
)
|
|
||||||
];
|
|
||||||
},
|
|
||||||
save: function( props ) {
|
|
||||||
return el( element.RawHTML, null, '<p>' + props.attributes.shortcode + '</p>' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} (
|
|
||||||
window.wp.blocks,
|
|
||||||
window.wp.i18n,
|
|
||||||
window.wp.element,
|
|
||||||
window.wp.components,
|
|
||||||
window.wp.editor
|
|
||||||
) );
|
|
File diff suppressed because one or more lines are too long
@ -1,221 +0,0 @@
|
|||||||
// Version 1.0 - Initial version
|
|
||||||
// Version 1.1 - Add Resend functionality
|
|
||||||
|
|
||||||
var privateSetting = '';
|
|
||||||
|
|
||||||
wp.apiFetch( { path: '/s2/v1/settings/private' } ).then(
|
|
||||||
function ( setting ) {
|
|
||||||
privateSetting = setting;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
wp.apiFetch( { path: '/s2/v1/settings/s2meta_default' } ).then(
|
|
||||||
function ( setting ) {
|
|
||||||
var s2mail = wp.data.select( 'core/editor' ).getEditedPostAttribute( 'meta' )._s2mail;
|
|
||||||
|
|
||||||
if ( '' === s2mail ) {
|
|
||||||
if ( '0' === setting ) {
|
|
||||||
s2mail = 'yes';
|
|
||||||
} else if ( '1' === setting ) {
|
|
||||||
s2mail = 'no';
|
|
||||||
}
|
|
||||||
wp.data.dispatch( 'core/editor' ).editPost( { meta: { '_s2mail': s2mail } } );
|
|
||||||
wp.data.dispatch( 'core/editor' ).savePost();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
( function( plugins, element, i18n, editPost, components, data, compose, apiFetch ) {
|
|
||||||
var registerPlugin = plugins.registerPlugin,
|
|
||||||
el = element.createElement,
|
|
||||||
__ = i18n.__,
|
|
||||||
Fragment = element.Fragment,
|
|
||||||
PluginSidebar = editPost.PluginSidebar,
|
|
||||||
PluginSidebarMoreMenuItem = editPost.PluginSidebarMoreMenuItem,
|
|
||||||
PanelBody = components.PanelBody,
|
|
||||||
PanelRow = components.PanelRow,
|
|
||||||
CheckboxControl = components.CheckboxControl,
|
|
||||||
Button = components.Button,
|
|
||||||
select = data.select,
|
|
||||||
dispatch = data.dispatch,
|
|
||||||
withSelect = data.withSelect,
|
|
||||||
withDispatch = data.withDispatch,
|
|
||||||
Compose = compose.compose;
|
|
||||||
|
|
||||||
var CheckboxControlMeta = Compose(
|
|
||||||
withSelect(
|
|
||||||
function( select, props ) {
|
|
||||||
var s2mail = select( 'core/editor' ).getEditedPostAttribute( 'meta' )[ props.fieldName ];
|
|
||||||
return {
|
|
||||||
metaChecked: ( 'no' === s2mail ? true : false )
|
|
||||||
};
|
|
||||||
}
|
|
||||||
),
|
|
||||||
withDispatch(
|
|
||||||
function( dispatch, props ) {
|
|
||||||
return {
|
|
||||||
setMetaChecked: function( value ) {
|
|
||||||
var s2mail = ( true === value ? 'no' : 'yes' );
|
|
||||||
dispatch( 'core/editor' ).editPost( { meta: { [ props.fieldName ]: s2mail } } );
|
|
||||||
dispatch( 'core/editor' ).savePost();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)(
|
|
||||||
function( props ) {
|
|
||||||
return el(
|
|
||||||
CheckboxControl,
|
|
||||||
{
|
|
||||||
label: __( 'Check here to disable sending of an email notification for this post/page', 'subscribe2' ),
|
|
||||||
checked: props.metaChecked,
|
|
||||||
onChange: function( content ) {
|
|
||||||
props.setMetaChecked( content );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
var maybeRenderResend = function() {
|
|
||||||
if ( 'publish' === select( 'core/editor' ).getEditedPostAttribute( 'status' ) ) {
|
|
||||||
return renderResendPanel();
|
|
||||||
} else if ( 'private' === select( 'core/editor' ).getEditedPostAttribute( 'status' ) && 'yes' === privateSetting ) {
|
|
||||||
return renderResendPanel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var renderResendPanel = function() {
|
|
||||||
return el(
|
|
||||||
PanelBody,
|
|
||||||
{
|
|
||||||
title: __( 'Subscribe2 Resend', 'subscribe2' ),
|
|
||||||
initialOpen: false
|
|
||||||
},
|
|
||||||
el(
|
|
||||||
PanelRow,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
'div',
|
|
||||||
null,
|
|
||||||
__( 'Resend the notification email of this post to current subscribers:', 'subscribe2' )
|
|
||||||
)
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
PanelRow,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
Button,
|
|
||||||
{
|
|
||||||
isDefault: true,
|
|
||||||
onClick: resendClick
|
|
||||||
},
|
|
||||||
__( 'Resend Notification', 'subscribe2' )
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
var previewClick = function() {
|
|
||||||
var postid = select( 'core/editor' ).getCurrentPostId();
|
|
||||||
dispatch( 'core/editor' ).savePost();
|
|
||||||
apiFetch( { path: '/s2/v1/preview/' + postid } );
|
|
||||||
dispatch( 'core/notices' ).createInfoNotice( __( 'Attempt made to send email preview', 'subscribe2' ) );
|
|
||||||
};
|
|
||||||
|
|
||||||
var resendClick = function() {
|
|
||||||
var postid = select( 'core/editor' ).getCurrentPostId();
|
|
||||||
dispatch( 'core/editor' ).savePost();
|
|
||||||
apiFetch( { path: '/s2/v1/resend/' + postid } );
|
|
||||||
dispatch( 'core/notices' ).createInfoNotice( __( 'Attempt made to resend email notification', 'subscribe2' ) );
|
|
||||||
};
|
|
||||||
|
|
||||||
var s2sidebar = function() {
|
|
||||||
return el(
|
|
||||||
Fragment,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
PluginSidebarMoreMenuItem,
|
|
||||||
{
|
|
||||||
target: 's2-sidebar',
|
|
||||||
icon: 'email'
|
|
||||||
},
|
|
||||||
__( 'Subscribe2 Sidebar', 'subscribe2' )
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
PluginSidebar,
|
|
||||||
{
|
|
||||||
name: 's2-sidebar',
|
|
||||||
title: __( 'Subscribe2 Sidebar', 'subscribe2' ),
|
|
||||||
icon: 'email',
|
|
||||||
isPinned: true,
|
|
||||||
isPinnable: true,
|
|
||||||
togglePin: true,
|
|
||||||
togglesidebar: false
|
|
||||||
},
|
|
||||||
el(
|
|
||||||
PanelBody,
|
|
||||||
{
|
|
||||||
title: __( 'Subscribe2 Override', 'subscribe2' ),
|
|
||||||
initialOpen: true
|
|
||||||
},
|
|
||||||
el(
|
|
||||||
PanelRow,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
CheckboxControlMeta,
|
|
||||||
{
|
|
||||||
fieldName: '_s2mail'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
PanelBody,
|
|
||||||
{
|
|
||||||
title: __( 'Subscribe2 Preview', 'subscribe2' ),
|
|
||||||
initialOpen: false
|
|
||||||
},
|
|
||||||
el(
|
|
||||||
PanelRow,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
'div',
|
|
||||||
null,
|
|
||||||
__( 'Send preview email of this post to currently logged in user:', 'subscribe2' )
|
|
||||||
)
|
|
||||||
),
|
|
||||||
el(
|
|
||||||
PanelRow,
|
|
||||||
{},
|
|
||||||
el(
|
|
||||||
Button,
|
|
||||||
{
|
|
||||||
isDefault: true,
|
|
||||||
onClick: previewClick
|
|
||||||
},
|
|
||||||
__( 'Send Preview', 'subscribe2' )
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
maybeRenderResend()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
registerPlugin(
|
|
||||||
'subscribe2-sidebar',
|
|
||||||
{
|
|
||||||
render: s2sidebar
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} (
|
|
||||||
wp.plugins,
|
|
||||||
wp.element,
|
|
||||||
wp.i18n,
|
|
||||||
wp.editPost,
|
|
||||||
wp.components,
|
|
||||||
wp.data,
|
|
||||||
wp.compose,
|
|
||||||
wp.apiFetch
|
|
||||||
) );
|
|
@ -1 +0,0 @@
|
|||||||
var privateSetting="";wp.apiFetch({path:"/s2/v1/settings/private"}).then(function(e){privateSetting=e}),wp.apiFetch({path:"/s2/v1/settings/s2meta_default"}).then(function(e){var t=wp.data.select("core/editor").getEditedPostAttribute("meta")._s2mail;""===t&&("0"===e?t="yes":"1"===e&&(t="no"),wp.data.dispatch("core/editor").editPost({meta:{_s2mail:t}}),wp.data.dispatch("core/editor").savePost())}),function(e,t,i,s,r,n,o,a){var c=e.registerPlugin,d=t.createElement,u=i.__,b=t.Fragment,l=s.PluginSidebar,p=s.PluginSidebarMoreMenuItem,m=r.PanelBody,h=r.PanelRow,f=r.CheckboxControl,v=r.Button,g=n.select,P=n.dispatch,w=n.withSelect,S=n.withDispatch,C=(0,o.compose)(w(function(e,t){return{metaChecked:"no"===e("core/editor").getEditedPostAttribute("meta")[t.fieldName]}}),S(function(e,t){return{setMetaChecked:function(i){var s=!0===i?"no":"yes";e("core/editor").editPost({meta:{[t.fieldName]:s}}),e("core/editor").savePost()}}}))(function(e){return d(f,{label:u("Check here to disable sending of an email notification for this post/page","subscribe2"),checked:e.metaChecked,onChange:function(t){e.setMetaChecked(t)}})}),k=function(){return d(m,{title:u("Subscribe2 Resend","subscribe2"),initialOpen:!1},d(h,{},d("div",null,u("Resend the notification email of this post to current subscribers:","subscribe2"))),d(h,{},d(v,{isDefault:!0,onClick:N},u("Resend Notification","subscribe2"))))},A=function(){var e=g("core/editor").getCurrentPostId();P("core/editor").savePost(),a({path:"/s2/v1/preview/"+e}),P("core/notices").createInfoNotice(u("Attempt made to send email preview","subscribe2"))},N=function(){var e=g("core/editor").getCurrentPostId();P("core/editor").savePost(),a({path:"/s2/v1/resend/"+e}),P("core/notices").createInfoNotice(u("Attempt made to resend email notification","subscribe2"))};c("subscribe2-sidebar",{render:function(){return d(b,{},d(p,{target:"s2-sidebar",icon:"email"},u("Subscribe2 Sidebar","subscribe2")),d(l,{name:"s2-sidebar",title:u("Subscribe2 Sidebar","subscribe2"),icon:"email",isPinned:!0,isPinnable:!0,togglePin:!0,togglesidebar:!1},d(m,{title:u("Subscribe2 Override","subscribe2"),initialOpen:!0},d(h,{},d(C,{fieldName:"_s2mail"}))),d(m,{title:u("Subscribe2 Preview","subscribe2"),initialOpen:!1},d(h,{},d("div",null,u("Send preview email of this post to currently logged in user:","subscribe2"))),d(h,{},d(v,{isDefault:!0,onClick:A},u("Send Preview","subscribe2")))),"publish"===g("core/editor").getEditedPostAttribute("status")?k():"private"===g("core/editor").getEditedPostAttribute("status")&&"yes"===privateSetting?k():void 0))}})}(wp.plugins,wp.element,wp.i18n,wp.editPost,wp.components,wp.data,wp.compose,wp.apiFetch);
|
|
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "appsero/client",
|
|
||||||
"description": "Appsero Client",
|
|
||||||
"keywords": ["analytics", "wordpress", "plugin", "theme"],
|
|
||||||
"type": "library",
|
|
||||||
"license": "MIT",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Tareq Hasan",
|
|
||||||
"email": "tareq@appsero.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Appsero\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,206 +0,0 @@
|
|||||||
# Appsero - Client
|
|
||||||
|
|
||||||
- [Installation](#installation)
|
|
||||||
- [Insights](#insights)
|
|
||||||
- [Dynamic Usage](#dynamic-usage)
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
You can install AppSero Client in two ways, via composer and manually.
|
|
||||||
|
|
||||||
### 1. Composer Installation
|
|
||||||
|
|
||||||
Add dependency in your project (theme/plugin):
|
|
||||||
|
|
||||||
```
|
|
||||||
composer require appsero/client
|
|
||||||
```
|
|
||||||
|
|
||||||
Now add `autoload.php` in your file if you haven't done already.
|
|
||||||
|
|
||||||
```php
|
|
||||||
require __DIR__ . '/vendor/autoload.php';
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Manual Installation
|
|
||||||
|
|
||||||
Clone the repository in your project.
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /path/to/your/project/folder
|
|
||||||
git clone https://github.com/AppSero/client.git appsero
|
|
||||||
```
|
|
||||||
|
|
||||||
Now include the dependencies in your plugin/theme.
|
|
||||||
|
|
||||||
```php
|
|
||||||
require __DIR__ . '/appsero/src/Client.php';
|
|
||||||
```
|
|
||||||
|
|
||||||
## Insights
|
|
||||||
|
|
||||||
AppSero can be used in both themes and plugins.
|
|
||||||
|
|
||||||
The `Appsero\Client` class has *three* parameters:
|
|
||||||
|
|
||||||
```php
|
|
||||||
$client = new Appsero\Client( $hash, $name, $file );
|
|
||||||
```
|
|
||||||
|
|
||||||
- **hash** (*string*, *required*) - The unique identifier for a plugin or theme.
|
|
||||||
- **name** (*string*, *required*) - The name of the plugin or theme.
|
|
||||||
- **file** (*string*, *required*) - The **main file** path of the plugin. For theme, path to `functions.php`
|
|
||||||
|
|
||||||
### Usage Example
|
|
||||||
|
|
||||||
Please refer to the **installation** step before start using the class.
|
|
||||||
|
|
||||||
You can obtain the **hash** for your plugin for the [Appsero Dashboard](https://dashboard.appsero.com). The 3rd parameter **must** have to be the main file of the plugin.
|
|
||||||
|
|
||||||
```php
|
|
||||||
/**
|
|
||||||
* Initialize the tracker
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function appsero_init_tracker_appsero_test() {
|
|
||||||
|
|
||||||
if ( ! class_exists( 'Appsero\Client' ) ) {
|
|
||||||
require_once __DIR__ . '/appsero/src/Client.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
$client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044891', 'Akismet', __FILE__ );
|
|
||||||
|
|
||||||
// Active insights
|
|
||||||
$client->insights()->init();
|
|
||||||
|
|
||||||
// Active automatic updater
|
|
||||||
$client->updater();
|
|
||||||
|
|
||||||
// Active license page and checker
|
|
||||||
$args = array(
|
|
||||||
'type' => 'options',
|
|
||||||
'menu_title' => 'Akismet',
|
|
||||||
'page_title' => 'Akismet License Settings',
|
|
||||||
'menu_slug' => 'akismet_settings',
|
|
||||||
);
|
|
||||||
$client->license()->add_settings_page( $args );
|
|
||||||
}
|
|
||||||
|
|
||||||
appsero_init_tracker_appsero_test();
|
|
||||||
```
|
|
||||||
|
|
||||||
Make sure you call this function directly, never use any action hook to call this function.
|
|
||||||
|
|
||||||
> For plugins example code that needs to be used on your main plugin file.
|
|
||||||
> For themes example code that needs to be used on your themes `functions.php` file.
|
|
||||||
|
|
||||||
## More Usage
|
|
||||||
|
|
||||||
Sometimes you wouldn't want to show the notice, or want to customize the notice message. You can do that as well.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 1. Hiding the notice
|
|
||||||
|
|
||||||
```php
|
|
||||||
$client->insights()
|
|
||||||
->hide_notice()
|
|
||||||
->init();
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Customizing the notice message
|
|
||||||
|
|
||||||
```php
|
|
||||||
$client->insights()
|
|
||||||
->notice( 'My Custom Notice Message' )
|
|
||||||
->init();
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. Adding extra data
|
|
||||||
|
|
||||||
You can add extra metadata from your theme or plugin. In that case, the **keys** has to be whitelisted from the Appsero dashboard.
|
|
||||||
`add_extra` method also support callback as parameter, If you need database call then callback is best for you.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$metadata = array(
|
|
||||||
'key' => 'value',
|
|
||||||
'another' => 'another_value'
|
|
||||||
);
|
|
||||||
$client->insights()
|
|
||||||
->add_extra( $metadata )
|
|
||||||
->init();
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```php
|
|
||||||
$metadata = function () {
|
|
||||||
return array(
|
|
||||||
'key' => 'value',
|
|
||||||
'another' => 'another_value'
|
|
||||||
);
|
|
||||||
};
|
|
||||||
$client->insights()
|
|
||||||
->add_extra( $metadata )
|
|
||||||
->init();
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Check License Validity
|
|
||||||
|
|
||||||
Check your plugin/theme is using with valid license or not, First create a global variable of `License` object then use it anywhere in your code.
|
|
||||||
If you are using it outside of same function make sure you global the variable before using the condition.
|
|
||||||
|
|
||||||
```php
|
|
||||||
$client = new Appsero\Client( 'a4a8da5b-b419-4656-98e9-4a42e9044892', 'Twenty Twelve', __FILE__ );
|
|
||||||
|
|
||||||
$args = array(
|
|
||||||
'type' => 'submenu',
|
|
||||||
'menu_title' => 'Twenty Twelve License',
|
|
||||||
'page_title' => 'Twenty Twelve License Settings',
|
|
||||||
'menu_slug' => 'twenty_twelve_settings',
|
|
||||||
'parent_slug' => 'themes.php',
|
|
||||||
);
|
|
||||||
|
|
||||||
global $twenty_twelve_license;
|
|
||||||
$twenty_twelve_license = $client->license();
|
|
||||||
$twenty_twelve_license->add_settings_page( $args );
|
|
||||||
|
|
||||||
if ( $twenty_twelve_license->is_valid() ) {
|
|
||||||
// Your special code here
|
|
||||||
}
|
|
||||||
|
|
||||||
Or check by pricing plan title
|
|
||||||
|
|
||||||
if ( $twenty_twelve_license->is_valid_by( 'title', 'Business' ) ) {
|
|
||||||
// Your special code here
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Use your own license form
|
|
||||||
|
|
||||||
You can easily manage license by creating a form using HTTP request. Call `license_form_submit` method from License object.
|
|
||||||
|
|
||||||
```php
|
|
||||||
global $twenty_twelve_license; // License object
|
|
||||||
$twenty_twelve_license->license_form_submit([
|
|
||||||
'_nonce' => wp_create_nonce( 'Twenty Twelve' ), // create a nonce with name
|
|
||||||
'_action' => 'active', // active, deactive
|
|
||||||
'license_key' => 'random-license-key', // no need to provide if you want to deactive
|
|
||||||
]);
|
|
||||||
if ( ! $twenty_twelve_license->error ) {
|
|
||||||
// license activated
|
|
||||||
$twenty_twelve_license->success; // Success message is here
|
|
||||||
} else {
|
|
||||||
$twenty_twelve_license->error; // has error message here
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
Created and maintained by [Appsero](https://appsero.com).
|
|
@ -1,233 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Appsero;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appsero Client
|
|
||||||
*
|
|
||||||
* This class is necessary to set project data
|
|
||||||
*/
|
|
||||||
class Client {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The client version
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $version = '1.1.11';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hash identifier of the plugin
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $hash;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of the plugin
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The plugin/theme file path
|
|
||||||
* @example .../wp-content/plugins/test-slug/test-slug.php
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $file;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Main plugin file
|
|
||||||
* @example test-slug/test-slug.php
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $basename;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Slug of the plugin
|
|
||||||
* @example test-slug
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $slug;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The project version
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $project_version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The project type
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* textdomain
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $textdomain;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the class
|
|
||||||
*
|
|
||||||
* @param string $hash hash of the plugin
|
|
||||||
* @param string $name readable name of the plugin
|
|
||||||
* @param string $file main plugin file path
|
|
||||||
*/
|
|
||||||
public function __construct( $hash, $name, $file ) {
|
|
||||||
$this->hash = $hash;
|
|
||||||
$this->name = $name;
|
|
||||||
$this->file = $file;
|
|
||||||
|
|
||||||
$this->set_basename_and_slug();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize insights class
|
|
||||||
*
|
|
||||||
* @return Appsero\Insights
|
|
||||||
*/
|
|
||||||
public function insights() {
|
|
||||||
|
|
||||||
if ( ! class_exists( __NAMESPACE__ . '\Insights') ) {
|
|
||||||
require_once __DIR__ . '/Insights.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Insights( $this );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize plugin/theme updater
|
|
||||||
*
|
|
||||||
* @return Appsero\Updater
|
|
||||||
*/
|
|
||||||
public function updater() {
|
|
||||||
|
|
||||||
if ( ! class_exists( __NAMESPACE__ . '\Updater') ) {
|
|
||||||
require_once __DIR__ . '/Updater.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Updater( $this );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize license checker
|
|
||||||
*
|
|
||||||
* @return Appsero\License
|
|
||||||
*/
|
|
||||||
public function license() {
|
|
||||||
|
|
||||||
if ( ! class_exists( __NAMESPACE__ . '\License') ) {
|
|
||||||
require_once __DIR__ . '/License.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
return new License( $this );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* API Endpoint
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function endpoint() {
|
|
||||||
$endpoint = apply_filters( 'appsero_endpoint', 'https://api.appsero.com' );
|
|
||||||
|
|
||||||
return trailingslashit( $endpoint );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set project basename, slug and version
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function set_basename_and_slug() {
|
|
||||||
|
|
||||||
if ( strpos( $this->file, WP_CONTENT_DIR . '/themes/' ) === false ) {
|
|
||||||
|
|
||||||
$this->basename = plugin_basename( $this->file );
|
|
||||||
|
|
||||||
list( $this->slug, $mainfile) = explode( '/', $this->basename );
|
|
||||||
|
|
||||||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
|
||||||
|
|
||||||
$plugin_data = get_plugin_data( $this->file );
|
|
||||||
|
|
||||||
$this->project_version = $plugin_data['Version'];
|
|
||||||
$this->type = 'plugin';
|
|
||||||
$this->textdomain = $this->slug;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$this->basename = str_replace( WP_CONTENT_DIR . '/themes/', '', $this->file );
|
|
||||||
|
|
||||||
list( $this->slug, $mainfile) = explode( '/', $this->basename );
|
|
||||||
|
|
||||||
$theme = wp_get_theme( $this->slug );
|
|
||||||
|
|
||||||
$this->project_version = $theme->version;
|
|
||||||
$this->type = 'theme';
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send request to remote endpoint
|
|
||||||
*
|
|
||||||
* @param array $params
|
|
||||||
* @param string $route
|
|
||||||
*
|
|
||||||
* @return array|WP_Error Array of results including HTTP headers or WP_Error if the request failed.
|
|
||||||
*/
|
|
||||||
public function send_request( $params, $route, $blocking = false ) {
|
|
||||||
$url = $this->endpoint() . $route;
|
|
||||||
|
|
||||||
$headers = array(
|
|
||||||
'user-agent' => 'Appsero/' . md5( esc_url( home_url() ) ) . ';',
|
|
||||||
'Accept' => 'application/json',
|
|
||||||
);
|
|
||||||
|
|
||||||
$response = wp_remote_post( $url, array(
|
|
||||||
'method' => 'POST',
|
|
||||||
'timeout' => 30,
|
|
||||||
'redirection' => 5,
|
|
||||||
'httpversion' => '1.0',
|
|
||||||
'blocking' => $blocking,
|
|
||||||
'headers' => $headers,
|
|
||||||
'body' => array_merge( $params, array( 'client' => $this->version ) ),
|
|
||||||
'cookies' => array()
|
|
||||||
) );
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the current server is localhost
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function is_local_server() {
|
|
||||||
return in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translate function _e()
|
|
||||||
*/
|
|
||||||
public function _etrans( $text ) {
|
|
||||||
call_user_func( '_e', $text, $this->textdomain );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translate function __()
|
|
||||||
*/
|
|
||||||
public function __trans( $text ) {
|
|
||||||
return call_user_func( '__', $text, $this->textdomain );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,972 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Appsero;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appsero Insights
|
|
||||||
*
|
|
||||||
* This is a tracker class to track plugin usage based on if the customer has opted in.
|
|
||||||
* No personal information is being tracked by this class, only general settings, active plugins, environment details
|
|
||||||
* and admin email.
|
|
||||||
*/
|
|
||||||
class Insights {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The notice text
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $notice;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wheather to the notice or not
|
|
||||||
*
|
|
||||||
* @var boolean
|
|
||||||
*/
|
|
||||||
protected $show_notice = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If extra data needs to be sent
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $extra_data = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AppSero\Client
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
*/
|
|
||||||
protected $client;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the class
|
|
||||||
*
|
|
||||||
* @param AppSero\Client
|
|
||||||
*/
|
|
||||||
public function __construct( $client, $name = null, $file = null ) {
|
|
||||||
|
|
||||||
if ( is_string( $client ) && ! empty( $name ) && ! empty( $file ) ) {
|
|
||||||
$client = new Client( $client, $name, $file );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_object( $client ) && is_a( $client, 'Appsero\Client' ) ) {
|
|
||||||
$this->client = $client;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Don't show the notice
|
|
||||||
*
|
|
||||||
* @return \self
|
|
||||||
*/
|
|
||||||
public function hide_notice() {
|
|
||||||
$this->show_notice = false;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add extra data if needed
|
|
||||||
*
|
|
||||||
* @param array $data
|
|
||||||
*
|
|
||||||
* @return \self
|
|
||||||
*/
|
|
||||||
public function add_extra( $data = array() ) {
|
|
||||||
$this->extra_data = $data;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set custom notice text
|
|
||||||
*
|
|
||||||
* @param string $text
|
|
||||||
*
|
|
||||||
* @return \self
|
|
||||||
*/
|
|
||||||
public function notice( $text ) {
|
|
||||||
$this->notice = $text;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize insights
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function init() {
|
|
||||||
if ( $this->client->type == 'plugin' ) {
|
|
||||||
$this->init_plugin();
|
|
||||||
} else if ( $this->client->type == 'theme' ) {
|
|
||||||
$this->init_theme();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize theme hooks
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function init_theme() {
|
|
||||||
$this->init_common();
|
|
||||||
|
|
||||||
add_action( 'switch_theme', array( $this, 'deactivation_cleanup' ) );
|
|
||||||
add_action( 'switch_theme', array( $this, 'theme_deactivated' ), 12, 3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize plugin hooks
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function init_plugin() {
|
|
||||||
// plugin deactivate popup
|
|
||||||
if ( ! $this->is_local_server() ) {
|
|
||||||
add_filter( 'plugin_action_links_' . $this->client->basename, array( $this, 'plugin_action_links' ) );
|
|
||||||
add_action( 'admin_footer', array( $this, 'deactivate_scripts' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->init_common();
|
|
||||||
|
|
||||||
register_activation_hook( $this->client->file, array( $this, 'activate_plugin' ) );
|
|
||||||
register_deactivation_hook( $this->client->file, array( $this, 'deactivation_cleanup' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize common hooks
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function init_common() {
|
|
||||||
|
|
||||||
if ( $this->show_notice ) {
|
|
||||||
// tracking notice
|
|
||||||
add_action( 'admin_notices', array( $this, 'admin_notice' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
add_action( 'admin_init', array( $this, 'handle_optin_optout' ) );
|
|
||||||
|
|
||||||
// uninstall reason
|
|
||||||
add_action( 'wp_ajax_' . $this->client->slug . '_submit-uninstall-reason', array( $this, 'uninstall_reason_submission' ) );
|
|
||||||
|
|
||||||
// cron events
|
|
||||||
add_filter( 'cron_schedules', array( $this, 'add_weekly_schedule' ) );
|
|
||||||
add_action( $this->client->slug . '_tracker_send_event', array( $this, 'send_tracking_data' ) );
|
|
||||||
// add_action( 'admin_init', array( $this, 'send_tracking_data' ) ); // test
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send tracking data to AppSero server
|
|
||||||
*
|
|
||||||
* @param boolean $override
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function send_tracking_data( $override = false ) {
|
|
||||||
// skip on AJAX Requests
|
|
||||||
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! $this->tracking_allowed() && ! $override ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send a maximum of once per week
|
|
||||||
$last_send = $this->get_last_send();
|
|
||||||
|
|
||||||
if ( $last_send && $last_send > strtotime( '-1 week' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = $this->client->send_request( $this->get_tracking_data(), 'track' );
|
|
||||||
|
|
||||||
update_option( $this->client->slug . '_tracking_last_send', time() );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the tracking data points
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function get_tracking_data() {
|
|
||||||
$all_plugins = $this->get_all_plugins();
|
|
||||||
|
|
||||||
$users = get_users( array(
|
|
||||||
'role' => 'administrator',
|
|
||||||
'orderby' => 'ID',
|
|
||||||
'order' => 'ASC',
|
|
||||||
'number' => 1,
|
|
||||||
'paged' => 1,
|
|
||||||
) );
|
|
||||||
|
|
||||||
$admin_user = ( is_array( $users ) && ! empty( $users ) ) ? $users[0] : false;
|
|
||||||
$first_name = $last_name = '';
|
|
||||||
|
|
||||||
if ( $admin_user ) {
|
|
||||||
$first_name = $admin_user->first_name ? $admin_user->first_name : $admin_user->display_name;
|
|
||||||
$last_name = $admin_user->last_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'version' => $this->client->project_version,
|
|
||||||
'url' => esc_url( home_url() ),
|
|
||||||
'site' => $this->get_site_name(),
|
|
||||||
'admin_email' => get_option( 'admin_email' ),
|
|
||||||
'first_name' => $first_name,
|
|
||||||
'last_name' => $last_name,
|
|
||||||
'hash' => $this->client->hash,
|
|
||||||
'server' => $this->get_server_info(),
|
|
||||||
'wp' => $this->get_wp_info(),
|
|
||||||
'users' => $this->get_user_counts(),
|
|
||||||
'active_plugins' => count( $all_plugins['active_plugins'] ),
|
|
||||||
'inactive_plugins' => count( $all_plugins['inactive_plugins'] ),
|
|
||||||
'ip_address' => $this->get_user_ip_address(),
|
|
||||||
'theme' => get_stylesheet(),
|
|
||||||
'version' => $this->client->project_version,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Add metadata
|
|
||||||
if ( $extra = $this->get_extra_data() ) {
|
|
||||||
$data['extra'] = $extra;
|
|
||||||
}
|
|
||||||
|
|
||||||
return apply_filters( $this->client->slug . '_tracker_data', $data );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If a child class wants to send extra data
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
protected function get_extra_data() {
|
|
||||||
if ( is_callable( $this->extra_data ) ) {
|
|
||||||
return call_user_func( $this->extra_data );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_array( $this->extra_data ) ) {
|
|
||||||
return $this->extra_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Explain the user which data we collect
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function data_we_collect() {
|
|
||||||
$data = array(
|
|
||||||
'Server environment details (php, mysql, server, WordPress versions)',
|
|
||||||
'Number of users in your site',
|
|
||||||
'Site language',
|
|
||||||
'Number of active and inactive plugins',
|
|
||||||
'Site name and url',
|
|
||||||
'Your name and email address',
|
|
||||||
);
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the user has opted into tracking
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function tracking_allowed() {
|
|
||||||
$allow_tracking = get_option( $this->client->slug . '_allow_tracking', 'no' );
|
|
||||||
|
|
||||||
return $allow_tracking == 'yes';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the last time a tracking was sent
|
|
||||||
*
|
|
||||||
* @return false|string
|
|
||||||
*/
|
|
||||||
private function get_last_send() {
|
|
||||||
return get_option( $this->client->slug . '_tracking_last_send', false );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the notice has been dismissed or enabled
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
private function notice_dismissed() {
|
|
||||||
$hide_notice = get_option( $this->client->slug . '_tracking_notice', null );
|
|
||||||
|
|
||||||
if ( 'hide' == $hide_notice ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the current server is localhost
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
private function is_local_server() {
|
|
||||||
return false;
|
|
||||||
|
|
||||||
$is_local = in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) );
|
|
||||||
|
|
||||||
return apply_filters( 'appsero_is_local', $is_local );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedule the event weekly
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function schedule_event() {
|
|
||||||
$hook_name = $this->client->slug . '_tracker_send_event';
|
|
||||||
|
|
||||||
if ( ! wp_next_scheduled( $hook_name ) ) {
|
|
||||||
wp_schedule_event( time(), 'weekly', $hook_name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear any scheduled hook
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function clear_schedule_event() {
|
|
||||||
wp_clear_scheduled_hook( $this->client->slug . '_tracker_send_event' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display the admin notice to users that have not opted-in or out
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function admin_notice() {
|
|
||||||
|
|
||||||
if ( $this->notice_dismissed() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $this->tracking_allowed() ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! current_user_can( 'manage_options' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't show tracking if a local server
|
|
||||||
if ( ! $this->is_local_server() ) {
|
|
||||||
$optin_url = add_query_arg( $this->client->slug . '_tracker_optin', 'true' );
|
|
||||||
$optout_url = add_query_arg( $this->client->slug . '_tracker_optout', 'true' );
|
|
||||||
|
|
||||||
if ( empty( $this->notice ) ) {
|
|
||||||
$notice = sprintf( $this->client->__trans( 'Want to help make <strong>%1$s</strong> even more awesome? Allow %1$s to collect non-sensitive diagnostic data and usage information.' ), $this->client->name );
|
|
||||||
} else {
|
|
||||||
$notice = $this->notice;
|
|
||||||
}
|
|
||||||
|
|
||||||
$policy_url = 'https://' . 'appsero.com/privacy-policy/';
|
|
||||||
|
|
||||||
$notice .= ' (<a class="' . $this->client->slug . '-insights-data-we-collect" href="#">' . $this->client->__trans( 'what we collect' ) . '</a>)';
|
|
||||||
$notice .= '<p class="description" style="display:none;">' . implode( ', ', $this->data_we_collect() ) . '. No sensitive data is tracked. ';
|
|
||||||
$notice .= 'We are using Appsero to collect your data. <a href="' . $policy_url . '">Learn more</a> about how Appsero collects and handle your data.</p>';
|
|
||||||
|
|
||||||
echo '<div class="updated"><p>';
|
|
||||||
echo $notice;
|
|
||||||
echo '</p><p class="submit">';
|
|
||||||
echo ' <a href="' . esc_url( $optin_url ) . '" class="button-primary button-large">' . $this->client->__trans( 'Allow' ) . '</a>';
|
|
||||||
echo ' <a href="' . esc_url( $optout_url ) . '" class="button-secondary button-large">' . $this->client->__trans( 'No thanks' ) . '</a>';
|
|
||||||
echo '</p></div>';
|
|
||||||
|
|
||||||
echo "<script type='text/javascript'>jQuery('." . $this->client->slug . "-insights-data-we-collect').on('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
jQuery(this).parents('.updated').find('p.description').slideToggle('fast');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* handle the optin/optout
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function handle_optin_optout() {
|
|
||||||
|
|
||||||
if ( isset( $_GET[ $this->client->slug . '_tracker_optin' ] ) && $_GET[ $this->client->slug . '_tracker_optin' ] == 'true' ) {
|
|
||||||
$this->optin();
|
|
||||||
|
|
||||||
wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optin' ) );
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $_GET[ $this->client->slug . '_tracker_optout' ] ) && $_GET[ $this->client->slug . '_tracker_optout' ] == 'true' ) {
|
|
||||||
$this->optout();
|
|
||||||
|
|
||||||
wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optout' ) );
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tracking optin
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function optin() {
|
|
||||||
update_option( $this->client->slug . '_allow_tracking', 'yes' );
|
|
||||||
update_option( $this->client->slug . '_tracking_notice', 'hide' );
|
|
||||||
|
|
||||||
$this->clear_schedule_event();
|
|
||||||
$this->schedule_event();
|
|
||||||
$this->send_tracking_data();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Optout from tracking
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function optout() {
|
|
||||||
update_option( $this->client->slug . '_allow_tracking', 'no' );
|
|
||||||
update_option( $this->client->slug . '_tracking_notice', 'hide' );
|
|
||||||
|
|
||||||
$this->clear_schedule_event();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the number of post counts
|
|
||||||
*
|
|
||||||
* @param string $post_type
|
|
||||||
*
|
|
||||||
* @return integer
|
|
||||||
*/
|
|
||||||
public function get_post_count( $post_type ) {
|
|
||||||
global $wpdb;
|
|
||||||
|
|
||||||
return (int) $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts WHERE post_type = '$post_type' and post_status = 'publish'");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get server related info.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private static function get_server_info() {
|
|
||||||
global $wpdb;
|
|
||||||
|
|
||||||
$server_data = array();
|
|
||||||
|
|
||||||
if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
|
|
||||||
$server_data['software'] = $_SERVER['SERVER_SOFTWARE'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( function_exists( 'phpversion' ) ) {
|
|
||||||
$server_data['php_version'] = phpversion();
|
|
||||||
}
|
|
||||||
|
|
||||||
$server_data['mysql_version'] = $wpdb->db_version();
|
|
||||||
|
|
||||||
$server_data['php_max_upload_size'] = size_format( wp_max_upload_size() );
|
|
||||||
$server_data['php_default_timezone'] = date_default_timezone_get();
|
|
||||||
$server_data['php_soap'] = class_exists( 'SoapClient' ) ? 'Yes' : 'No';
|
|
||||||
$server_data['php_fsockopen'] = function_exists( 'fsockopen' ) ? 'Yes' : 'No';
|
|
||||||
$server_data['php_curl'] = function_exists( 'curl_init' ) ? 'Yes' : 'No';
|
|
||||||
|
|
||||||
return $server_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get WordPress related data.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function get_wp_info() {
|
|
||||||
$wp_data = array();
|
|
||||||
|
|
||||||
$wp_data['memory_limit'] = WP_MEMORY_LIMIT;
|
|
||||||
$wp_data['debug_mode'] = ( defined('WP_DEBUG') && WP_DEBUG ) ? 'Yes' : 'No';
|
|
||||||
$wp_data['locale'] = get_locale();
|
|
||||||
$wp_data['version'] = get_bloginfo( 'version' );
|
|
||||||
$wp_data['multisite'] = is_multisite() ? 'Yes' : 'No';
|
|
||||||
|
|
||||||
return $wp_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the list of active and inactive plugins
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function get_all_plugins() {
|
|
||||||
// Ensure get_plugins function is loaded
|
|
||||||
if ( ! function_exists( 'get_plugins' ) ) {
|
|
||||||
include ABSPATH . '/wp-admin/includes/plugin.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
$plugins = get_plugins();
|
|
||||||
$active_plugins_keys = get_option( 'active_plugins', array() );
|
|
||||||
$active_plugins = array();
|
|
||||||
|
|
||||||
foreach ( $plugins as $k => $v ) {
|
|
||||||
// Take care of formatting the data how we want it.
|
|
||||||
$formatted = array();
|
|
||||||
$formatted['name'] = strip_tags( $v['Name'] );
|
|
||||||
|
|
||||||
if ( isset( $v['Version'] ) ) {
|
|
||||||
$formatted['version'] = strip_tags( $v['Version'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $v['Author'] ) ) {
|
|
||||||
$formatted['author'] = strip_tags( $v['Author'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $v['Network'] ) ) {
|
|
||||||
$formatted['network'] = strip_tags( $v['Network'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $v['PluginURI'] ) ) {
|
|
||||||
$formatted['plugin_uri'] = strip_tags( $v['PluginURI'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( in_array( $k, $active_plugins_keys ) ) {
|
|
||||||
// Remove active plugins from list so we can show active and inactive separately
|
|
||||||
unset( $plugins[$k] );
|
|
||||||
$active_plugins[$k] = $formatted;
|
|
||||||
} else {
|
|
||||||
$plugins[$k] = $formatted;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return array( 'active_plugins' => $active_plugins, 'inactive_plugins' => $plugins );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get user totals based on user role.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function get_user_counts() {
|
|
||||||
$user_count = array();
|
|
||||||
$user_count_data = count_users();
|
|
||||||
$user_count['total'] = $user_count_data['total_users'];
|
|
||||||
|
|
||||||
// Get user count based on user role
|
|
||||||
foreach ( $user_count_data['avail_roles'] as $role => $count ) {
|
|
||||||
$user_count[ $role ] = $count;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $user_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add weekly cron schedule
|
|
||||||
*
|
|
||||||
* @param array $schedules
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function add_weekly_schedule( $schedules ) {
|
|
||||||
|
|
||||||
$schedules['weekly'] = array(
|
|
||||||
'interval' => DAY_IN_SECONDS * 7,
|
|
||||||
'display' => 'Once Weekly',
|
|
||||||
);
|
|
||||||
|
|
||||||
return $schedules;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin activation hook
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function activate_plugin() {
|
|
||||||
$allowed = get_option( $this->client->slug . '_allow_tracking', 'no' );
|
|
||||||
|
|
||||||
// if it wasn't allowed before, do nothing
|
|
||||||
if ( 'yes' !== $allowed ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// re-schedule and delete the last sent time so we could force send again
|
|
||||||
$hook_name = $this->client->slug . '_tracker_send_event';
|
|
||||||
if ( ! wp_next_scheduled( $hook_name ) ) {
|
|
||||||
wp_schedule_event( time(), 'weekly', $hook_name );
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_option( $this->client->slug . '_tracking_last_send' );
|
|
||||||
|
|
||||||
$this->send_tracking_data( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear our options upon deactivation
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function deactivation_cleanup() {
|
|
||||||
$this->clear_schedule_event();
|
|
||||||
|
|
||||||
if ( 'theme' == $this->client->type ) {
|
|
||||||
delete_option( $this->client->slug . '_tracking_last_send' );
|
|
||||||
delete_option( $this->client->slug . '_allow_tracking' );
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_option( $this->client->slug . '_tracking_notice' );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hook into action links and modify the deactivate link
|
|
||||||
*
|
|
||||||
* @param array $links
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function plugin_action_links( $links ) {
|
|
||||||
|
|
||||||
if ( array_key_exists( 'deactivate', $links ) ) {
|
|
||||||
$links['deactivate'] = str_replace( '<a', '<a class="' . $this->client->slug . '-deactivate-link"', $links['deactivate'] );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $links;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin uninstall reasons
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function get_uninstall_reasons() {
|
|
||||||
$reasons = array(
|
|
||||||
array(
|
|
||||||
'id' => 'could-not-understand',
|
|
||||||
'text' => "I couldn't understand how to make it work",
|
|
||||||
'type' => 'textarea',
|
|
||||||
'placeholder' => 'Would you like us to assist you?'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'found-better-plugin',
|
|
||||||
'text' => 'I found a better plugin',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'Which plugin?'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'not-have-that-feature',
|
|
||||||
'text' => 'The plugin is great, but I need specific feature that you don\'t support',
|
|
||||||
'type' => 'textarea',
|
|
||||||
'placeholder' => 'Could you tell us more about that feature?'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'is-not-working',
|
|
||||||
'text' => 'The plugin is not working',
|
|
||||||
'type' => 'textarea',
|
|
||||||
'placeholder' => 'Could you tell us a bit more whats not working?'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'looking-for-other',
|
|
||||||
'text' => "It's not what I was looking for",
|
|
||||||
'type' => '',
|
|
||||||
'placeholder' => ''
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'did-not-work-as-expected',
|
|
||||||
'text' => "The plugin didn't work as expected",
|
|
||||||
'type' => 'textarea',
|
|
||||||
'placeholder' => 'What did you expect?'
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
'id' => 'other',
|
|
||||||
'text' => 'Other',
|
|
||||||
'type' => 'textarea',
|
|
||||||
'placeholder' => 'Could you tell us a bit more?'
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
return $reasons;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin deactivation uninstall reason submission
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function uninstall_reason_submission() {
|
|
||||||
|
|
||||||
if ( ! isset( $_POST['reason_id'] ) ) {
|
|
||||||
wp_send_json_error();
|
|
||||||
}
|
|
||||||
|
|
||||||
$current_user = wp_get_current_user();
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'hash' => $this->client->hash,
|
|
||||||
'reason_id' => sanitize_text_field( $_POST['reason_id'] ),
|
|
||||||
'reason_info' => isset( $_REQUEST['reason_info'] ) ? trim( stripslashes( $_REQUEST['reason_info'] ) ) : '',
|
|
||||||
'site' => $this->get_site_name(),
|
|
||||||
'url' => esc_url( home_url() ),
|
|
||||||
'admin_email' => get_option( 'admin_email' ),
|
|
||||||
'user_email' => $current_user->user_email,
|
|
||||||
'first_name' => $current_user->first_name,
|
|
||||||
'last_name' => $current_user->last_name,
|
|
||||||
'server' => $this->get_server_info(),
|
|
||||||
'wp' => $this->get_wp_info(),
|
|
||||||
'ip_address' => $this->get_user_ip_address(),
|
|
||||||
'theme' => get_stylesheet(),
|
|
||||||
'version' => $this->client->project_version,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Add metadata
|
|
||||||
if ( $extra = $this->get_extra_data() ) {
|
|
||||||
$data['extra'] = $extra;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->client->send_request( $data, 'deactivate' );
|
|
||||||
|
|
||||||
wp_send_json_success();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the plugin deactivation feedback
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function deactivate_scripts() {
|
|
||||||
global $pagenow;
|
|
||||||
|
|
||||||
if ( 'plugins.php' != $pagenow ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$reasons = $this->get_uninstall_reasons();
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="wd-dr-modal" id="<?php echo $this->client->slug; ?>-wd-dr-modal">
|
|
||||||
<div class="wd-dr-modal-wrap">
|
|
||||||
<div class="wd-dr-modal-header">
|
|
||||||
<h3><?php $this->client->_etrans( 'If you have a moment, please let us know why you are deactivating:' ); ?></h3>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="wd-dr-modal-body">
|
|
||||||
<ul class="reasons">
|
|
||||||
<?php foreach ($reasons as $reason) { ?>
|
|
||||||
<li data-type="<?php echo esc_attr( $reason['type'] ); ?>" data-placeholder="<?php echo esc_attr( $reason['placeholder'] ); ?>">
|
|
||||||
<label><input type="radio" name="selected-reason" value="<?php echo $reason['id']; ?>"> <?php echo $reason['text']; ?></label>
|
|
||||||
</li>
|
|
||||||
<?php } ?>
|
|
||||||
</ul>
|
|
||||||
<p class="wd-dr-modal-reasons-bottom">
|
|
||||||
We share your data with <a href="<?php echo 'https://appsero.com'; ?>">Appsero</a> to troubleshoot problems & make product improvements.
|
|
||||||
<a href="<?php echo 'https://appsero.com/privacy-policy'; ?>">Learn more</a> about how Appsero handles your data.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="wd-dr-modal-footer">
|
|
||||||
<a href="#" class="dont-bother-me"><?php $this->client->_etrans( "I rather wouldn't say" ); ?></a>
|
|
||||||
<button class="button-secondary"><?php $this->client->_etrans( 'Submit & Deactivate' ); ?></button>
|
|
||||||
<button class="button-primary"><?php $this->client->_etrans( 'Cancel' ); ?></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
.wd-dr-modal {
|
|
||||||
position: fixed;
|
|
||||||
z-index: 99999;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
background: rgba(0,0,0,0.5);
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal.modal-active {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal-wrap {
|
|
||||||
width: 475px;
|
|
||||||
position: relative;
|
|
||||||
margin: 10% auto;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal-header {
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
padding: 8px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal-header h3 {
|
|
||||||
line-height: 150%;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal-body {
|
|
||||||
padding: 5px 20px 20px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wd-dr-modal-body .reason-input {
|
|
||||||
margin-top: 5px;
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
.wd-dr-modal-footer {
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
padding: 12px 20px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.wd-dr-modal-reasons-bottom {
|
|
||||||
margin: 15px 0 0 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
(function($) {
|
|
||||||
$(function() {
|
|
||||||
var modal = $( '#<?php echo $this->client->slug; ?>-wd-dr-modal' );
|
|
||||||
var deactivateLink = '';
|
|
||||||
|
|
||||||
$( '#the-list' ).on('click', 'a.<?php echo $this->client->slug; ?>-deactivate-link', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
modal.addClass('modal-active');
|
|
||||||
deactivateLink = $(this).attr('href');
|
|
||||||
modal.find('a.dont-bother-me').attr('href', deactivateLink).css('float', 'left');
|
|
||||||
});
|
|
||||||
|
|
||||||
modal.on('click', 'button.button-primary', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
modal.removeClass('modal-active');
|
|
||||||
});
|
|
||||||
|
|
||||||
modal.on('click', 'input[type="radio"]', function () {
|
|
||||||
var parent = $(this).parents('li:first');
|
|
||||||
|
|
||||||
modal.find('.reason-input').remove();
|
|
||||||
|
|
||||||
var inputType = parent.data('type'),
|
|
||||||
inputPlaceholder = parent.data('placeholder'),
|
|
||||||
reasonInputHtml = '<div class="reason-input">' + ( ( 'text' === inputType ) ? '<input type="text" size="40" />' : '<textarea rows="5" cols="45"></textarea>' ) + '</div>';
|
|
||||||
|
|
||||||
if ( inputType !== '' ) {
|
|
||||||
parent.append( $(reasonInputHtml) );
|
|
||||||
parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
modal.on('click', 'button.button-secondary', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
var button = $(this);
|
|
||||||
|
|
||||||
if ( button.hasClass('disabled') ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var $radio = $( 'input[type="radio"]:checked', modal );
|
|
||||||
|
|
||||||
var $selected_reason = $radio.parents('li:first'),
|
|
||||||
$input = $selected_reason.find('textarea, input[type="text"]');
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: ajaxurl,
|
|
||||||
type: 'POST',
|
|
||||||
data: {
|
|
||||||
action: '<?php echo $this->client->slug; ?>_submit-uninstall-reason',
|
|
||||||
reason_id: ( 0 === $radio.length ) ? 'none' : $radio.val(),
|
|
||||||
reason_info: ( 0 !== $input.length ) ? $input.val().trim() : ''
|
|
||||||
},
|
|
||||||
beforeSend: function() {
|
|
||||||
button.addClass('disabled');
|
|
||||||
button.text('Processing...');
|
|
||||||
},
|
|
||||||
complete: function() {
|
|
||||||
window.location.href = deactivateLink;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}(jQuery));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run after theme deactivated
|
|
||||||
* @param string $new_name
|
|
||||||
* @param object $new_theme
|
|
||||||
* @param object $old_theme
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function theme_deactivated( $new_name, $new_theme, $old_theme ) {
|
|
||||||
// Make sure this is appsero theme
|
|
||||||
if ( $old_theme->get_template() == $this->client->slug ) {
|
|
||||||
$current_user = wp_get_current_user();
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'hash' => $this->client->hash,
|
|
||||||
'reason_id' => 'none',
|
|
||||||
'reason_info' => '',
|
|
||||||
'site' => $this->get_site_name(),
|
|
||||||
'url' => esc_url( home_url() ),
|
|
||||||
'admin_email' => get_option( 'admin_email' ),
|
|
||||||
'user_email' => $current_user->user_email,
|
|
||||||
'first_name' => $current_user->first_name,
|
|
||||||
'last_name' => $current_user->last_name,
|
|
||||||
'server' => $this->get_server_info(),
|
|
||||||
'wp' => $this->get_wp_info(),
|
|
||||||
'ip_address' => $this->get_user_ip_address(),
|
|
||||||
'theme' => get_stylesheet(),
|
|
||||||
'version' => $this->client->project_version,
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->client->send_request( $data, 'deactivate' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get user IP Address
|
|
||||||
*/
|
|
||||||
private function get_user_ip_address() {
|
|
||||||
$response = wp_remote_get( 'https://icanhazip.com/' );
|
|
||||||
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$ip = trim( wp_remote_retrieve_body( $response ) );
|
|
||||||
|
|
||||||
if ( ! filter_var( $ip, FILTER_VALIDATE_IP ) ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get site name
|
|
||||||
*/
|
|
||||||
private function get_site_name() {
|
|
||||||
$site_name = get_bloginfo( 'name' );
|
|
||||||
|
|
||||||
if ( empty( $site_name ) ) {
|
|
||||||
$site_name = get_bloginfo( 'description' );
|
|
||||||
$site_name = wp_trim_words( $site_name, 3, '' );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( empty( $site_name ) ) {
|
|
||||||
$site_name = esc_url( home_url() );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $site_name;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,705 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Appsero;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appsero License Checker
|
|
||||||
*
|
|
||||||
* This class will check, active and deactive license
|
|
||||||
*/
|
|
||||||
class License {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AppSero\Client
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
*/
|
|
||||||
protected $client;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Arguments of create menu
|
|
||||||
*
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
protected $menu_args;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* `option_name` of `wp_options` table
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $option_key;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Error message of HTTP request
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $error;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Success message on form submit
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $success;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Corn schedule hook name
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $schedule_hook;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set value for valid licnese
|
|
||||||
*
|
|
||||||
* @var boolean
|
|
||||||
*/
|
|
||||||
private $is_valid_licnese = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the class
|
|
||||||
*
|
|
||||||
* @param Appsero\Client
|
|
||||||
*/
|
|
||||||
public function __construct( Client $client ) {
|
|
||||||
$this->client = $client;
|
|
||||||
|
|
||||||
$this->option_key = 'appsero_' . md5( $this->client->slug ) . '_manage_license';
|
|
||||||
|
|
||||||
$this->schedule_hook = $this->client->slug . '_license_check_event';
|
|
||||||
|
|
||||||
// Run hook to check license status daily
|
|
||||||
add_action( $this->schedule_hook, array( $this, 'check_license_status' ) );
|
|
||||||
|
|
||||||
// Active/Deactive corn schedule
|
|
||||||
$this->run_schedule();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check license
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function check( $license_key ) {
|
|
||||||
$route = 'public/license/' . $this->client->hash . '/check';
|
|
||||||
|
|
||||||
return $this->send_request( $license_key, $route );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Active a license
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function activate( $license_key ) {
|
|
||||||
$route = 'public/license/' . $this->client->hash . '/activate';
|
|
||||||
|
|
||||||
return $this->send_request( $license_key, $route );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deactivate a license
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function deactivate( $license_key ) {
|
|
||||||
$route = 'public/license/' . $this->client->hash . '/deactivate';
|
|
||||||
|
|
||||||
return $this->send_request( $license_key, $route );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send common request
|
|
||||||
*
|
|
||||||
* @param $license_key
|
|
||||||
* @param $route
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function send_request( $license_key, $route ) {
|
|
||||||
$params = array(
|
|
||||||
'license_key' => $license_key,
|
|
||||||
'url' => esc_url( home_url() ),
|
|
||||||
'is_local' => $this->client->is_local_server(),
|
|
||||||
);
|
|
||||||
|
|
||||||
$response = $this->client->send_request( $params, $route, true );
|
|
||||||
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
return array(
|
|
||||||
'success' => false,
|
|
||||||
'error' => $response->get_error_message()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = json_decode( wp_remote_retrieve_body( $response ), true );
|
|
||||||
|
|
||||||
if ( empty( $response ) || isset( $response['exception'] )) {
|
|
||||||
return array(
|
|
||||||
'success' => false,
|
|
||||||
'error' => 'Unknown error occurred, Please try again.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $response['errors'] ) && isset( $response['errors']['license_key'] ) ) {
|
|
||||||
$response = array(
|
|
||||||
'success' => false,
|
|
||||||
'error' => $response['errors']['license_key'][0]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add settings page for license
|
|
||||||
*
|
|
||||||
* @param array $args
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function add_settings_page( $args = array() ) {
|
|
||||||
$defaults = array(
|
|
||||||
'type' => 'menu', // Can be: menu, options, submenu
|
|
||||||
'page_title' => 'Manage License',
|
|
||||||
'menu_title' => 'Manage License',
|
|
||||||
'capability' => 'manage_options',
|
|
||||||
'menu_slug' => $this->client->slug . '-manage-license',
|
|
||||||
'icon_url' => '',
|
|
||||||
'position' => null,
|
|
||||||
'parent_slug' => '',
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->menu_args = wp_parse_args( $args, $defaults );
|
|
||||||
|
|
||||||
add_action( 'admin_menu', array( $this, 'admin_menu' ), 99 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Admin Menu hook
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function admin_menu() {
|
|
||||||
switch ( $this->menu_args['type'] ) {
|
|
||||||
case 'menu':
|
|
||||||
$this->create_menu_page();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'submenu':
|
|
||||||
$this->create_submenu_page();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'options':
|
|
||||||
$this->create_options_page();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* License menu output
|
|
||||||
*/
|
|
||||||
public function menu_output() {
|
|
||||||
|
|
||||||
if ( isset( $_POST['submit'] ) ) {
|
|
||||||
$this->license_form_submit( $_POST );
|
|
||||||
}
|
|
||||||
|
|
||||||
$license = get_option( $this->option_key, null );
|
|
||||||
$action = ( $license && isset( $license['status'] ) && 'activate' == $license['status'] ) ? 'deactive' : 'active';
|
|
||||||
$this->licenses_style();
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="wrap appsero-license-settings-wrapper">
|
|
||||||
<h1>License Settings</h1>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$this->show_license_page_notices();
|
|
||||||
do_action( 'before_appsero_license_section' );
|
|
||||||
?>
|
|
||||||
|
|
||||||
<div class="appsero-license-settings appsero-license-section">
|
|
||||||
<?php $this->show_license_page_card_header(); ?>
|
|
||||||
|
|
||||||
<div class="appsero-license-details">
|
|
||||||
<p>Activate <strong><?php echo $this->client->name; ?></strong> by your license key to get professional support and automatic update from your WordPress dashboard.</p>
|
|
||||||
<form method="post" action="<?php $this->formActionUrl(); ?>" novalidate="novalidate" spellcheck="false">
|
|
||||||
<input type="hidden" name="_action" value="<?php echo $action; ?>">
|
|
||||||
<input type="hidden" name="_nonce" value="<?php echo wp_create_nonce( $this->client->name ); ?>">
|
|
||||||
<div class="license-input-fields">
|
|
||||||
<div class="license-input-key">
|
|
||||||
<svg enable-background="new 0 0 512 512" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="m463.75 48.251c-64.336-64.336-169.01-64.335-233.35 1e-3 -43.945 43.945-59.209 108.71-40.181 167.46l-185.82 185.82c-2.813 2.813-4.395 6.621-4.395 10.606v84.858c0 8.291 6.709 15 15 15h84.858c3.984 0 7.793-1.582 10.605-4.395l21.211-21.226c3.237-3.237 4.819-7.778 4.292-12.334l-2.637-22.793 31.582-2.974c7.178-0.674 12.847-6.343 13.521-13.521l2.974-31.582 22.793 2.651c4.233 0.571 8.496-0.85 11.704-3.691 3.193-2.856 5.024-6.929 5.024-11.206v-27.929h27.422c3.984 0 7.793-1.582 10.605-4.395l38.467-37.958c58.74 19.043 122.38 4.929 166.33-39.046 64.336-64.335 64.336-169.01 0-233.35zm-42.435 106.07c-17.549 17.549-46.084 17.549-63.633 0s-17.549-46.084 0-63.633 46.084-17.549 63.633 0 17.548 46.084 0 63.633z"/>
|
|
||||||
</svg>
|
|
||||||
<input type="text" value="<?php echo $this->get_input_license_value( $action, $license ); ?>"
|
|
||||||
placeholder="Enter your license key to activate" name="license_key"
|
|
||||||
<?php echo ( 'deactive' == $action ) ? 'readonly="readonly"' : ''; ?>
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<button type="submit" name="submit" class="<?php echo 'deactive' == $action ? 'deactive-button' : ''; ?>">
|
|
||||||
<?php echo $action == 'active' ? 'Activate License' : 'Deactivate License' ; ?>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
if ( 'deactive' == $action && isset( $license['remaining'] ) ) {
|
|
||||||
$this->show_active_license_info( $license );
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
</div> <!-- /.appsero-license-settings -->
|
|
||||||
|
|
||||||
<?php do_action( 'after_appsero_license_section' ); ?>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* License form submit
|
|
||||||
*/
|
|
||||||
public function license_form_submit( $form ) {
|
|
||||||
if ( ! isset( $form['_nonce'], $form['_action'] ) ) {
|
|
||||||
$this->error = "Please add all information";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! wp_verify_nonce( $form['_nonce'], $this->client->name ) ) {
|
|
||||||
$this->error = "You don't have permission to manage license.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( $form['_action'] ) {
|
|
||||||
case 'active':
|
|
||||||
$this->active_client_license( $form );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'deactive':
|
|
||||||
$this->deactive_client_license( $form );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check license status on schedule
|
|
||||||
*/
|
|
||||||
public function check_license_status() {
|
|
||||||
$license = get_option( $this->option_key, null );
|
|
||||||
|
|
||||||
if ( isset( $license['key'] ) && ! empty( $license['key'] ) ) {
|
|
||||||
$response = $this->check( $license['key'] );
|
|
||||||
|
|
||||||
if ( isset( $response['success'] ) && $response['success'] ) {
|
|
||||||
$license['status'] = 'activate';
|
|
||||||
$license['remaining'] = $response['remaining'];
|
|
||||||
$license['activation_limit'] = $response['activation_limit'];
|
|
||||||
$license['expiry_days'] = $response['expiry_days'];
|
|
||||||
$license['title'] = $response['title'];
|
|
||||||
$license['source_id'] = $response['source_identifier'];
|
|
||||||
$license['recurring'] = $response['recurring'];
|
|
||||||
} else {
|
|
||||||
$license['status'] = 'deactivate';
|
|
||||||
$license['expiry_days'] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_option( $this->option_key, $license, false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check this is a valid license
|
|
||||||
*/
|
|
||||||
public function is_valid() {
|
|
||||||
if ( null !== $this->is_valid_licnese ) {
|
|
||||||
return $this->is_valid_licnese;
|
|
||||||
}
|
|
||||||
|
|
||||||
$license = get_option( $this->option_key, null );
|
|
||||||
if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
|
|
||||||
$this->is_valid_licnese = true;
|
|
||||||
} else {
|
|
||||||
$this->is_valid_licnese = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->is_valid_licnese;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check this is a valid license
|
|
||||||
*/
|
|
||||||
public function is_valid_by( $option, $value ) {
|
|
||||||
$license = get_option( $this->option_key, null );
|
|
||||||
|
|
||||||
if ( ! empty( $license['key'] ) && isset( $license['status'] ) && $license['status'] == 'activate' ) {
|
|
||||||
if ( isset( $license[ $option ] ) && $license[ $option ] == $value ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styles for licenses page
|
|
||||||
*/
|
|
||||||
private function licenses_style() {
|
|
||||||
?>
|
|
||||||
<style type="text/css">
|
|
||||||
.appsero-license-section {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 1100px;
|
|
||||||
min-height: 1px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.appsero-license-settings {
|
|
||||||
background-color: #fff;
|
|
||||||
box-shadow: 0px 3px 10px rgba(16, 16, 16, 0.05);
|
|
||||||
}
|
|
||||||
.appsero-license-settings * {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.appsero-license-title {
|
|
||||||
background-color: #F8FAFB;
|
|
||||||
border-bottom: 2px solid #EAEAEA;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 10px 20px;
|
|
||||||
}
|
|
||||||
.appsero-license-title svg {
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
fill: #0082BF;
|
|
||||||
}
|
|
||||||
.appsero-license-title span {
|
|
||||||
font-size: 17px;
|
|
||||||
color: #444444;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
.appsero-license-details {
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
.appsero-license-details p {
|
|
||||||
font-size: 15px;
|
|
||||||
margin: 0 0 20px 0;
|
|
||||||
}
|
|
||||||
.license-input-key {
|
|
||||||
position: relative;
|
|
||||||
flex: 0 0 72%;
|
|
||||||
max-width: 72%;
|
|
||||||
}
|
|
||||||
.license-input-key input {
|
|
||||||
background-color: #F9F9F9;
|
|
||||||
padding: 10px 15px 10px 48px;
|
|
||||||
border: 1px solid #E8E5E5;
|
|
||||||
border-radius: 3px;
|
|
||||||
height: 45px;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #71777D;
|
|
||||||
width: 100%;
|
|
||||||
box-shadow: 0 0 0 transparent;
|
|
||||||
}
|
|
||||||
.license-input-key input:focus {
|
|
||||||
outline: 0 none;
|
|
||||||
border: 1px solid #E8E5E5;
|
|
||||||
box-shadow: 0 0 0 transparent;
|
|
||||||
}
|
|
||||||
.license-input-key svg {
|
|
||||||
width: 22px;
|
|
||||||
height: 22px;
|
|
||||||
fill: #0082BF;
|
|
||||||
position: absolute;
|
|
||||||
left: 14px;
|
|
||||||
top: 13px;
|
|
||||||
}
|
|
||||||
.license-input-fields {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
max-width: 850px;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.license-input-fields button {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 17px;
|
|
||||||
padding: 8px;
|
|
||||||
height: 46px;
|
|
||||||
background-color: #0082BF;
|
|
||||||
border-radius: 3px;
|
|
||||||
cursor: pointer;
|
|
||||||
flex: 0 0 25%;
|
|
||||||
max-width: 25%;
|
|
||||||
border: 1px solid #0082BF;
|
|
||||||
}
|
|
||||||
.license-input-fields button.deactive-button {
|
|
||||||
background-color: #E40055;
|
|
||||||
border-color: #E40055;
|
|
||||||
}
|
|
||||||
.license-input-fields button:focus {
|
|
||||||
outline: 0 none;
|
|
||||||
}
|
|
||||||
.active-license-info {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.single-license-info {
|
|
||||||
min-width: 220px;
|
|
||||||
flex: 0 0 30%;
|
|
||||||
}
|
|
||||||
.single-license-info h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
margin: 0 0 12px 0;
|
|
||||||
}
|
|
||||||
.single-license-info p {
|
|
||||||
margin: 0;
|
|
||||||
color: #00C000;
|
|
||||||
}
|
|
||||||
.single-license-info p.occupied {
|
|
||||||
color: #E40055;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show active license information
|
|
||||||
*/
|
|
||||||
private function show_active_license_info( $license ) {
|
|
||||||
?>
|
|
||||||
<div class="active-license-info">
|
|
||||||
<div class="single-license-info">
|
|
||||||
<h3>Activation Remaining</h3>
|
|
||||||
<?php if ( empty( $license['activation_limit'] ) ): ?>
|
|
||||||
<p>Unlimited</p>
|
|
||||||
<?php else: ?>
|
|
||||||
<p class="<?php echo $license['remaining'] ? '' : 'occupied'; ?>">
|
|
||||||
<?php echo $license['remaining']; ?> out of <?php echo $license['activation_limit']; ?>
|
|
||||||
</p>
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
||||||
<div class="single-license-info">
|
|
||||||
<h3>Expires in</h3>
|
|
||||||
<?php
|
|
||||||
if ( $license['recurring'] && false !== $license['expiry_days'] ) {
|
|
||||||
$occupied = $license['expiry_days'] > 10 ? '' : 'occupied';
|
|
||||||
echo '<p class="' . $occupied . '">' . $license['expiry_days'] . ' days</p>';
|
|
||||||
} else {
|
|
||||||
echo '<p>Never</p>';
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show license settings page notices
|
|
||||||
*/
|
|
||||||
private function show_license_page_notices() {
|
|
||||||
if ( ! empty( $this->error ) ) :
|
|
||||||
?>
|
|
||||||
<div class="notice notice-error is-dismissible appsero-license-section">
|
|
||||||
<p><?php echo $this->error; ?></p>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
if ( ! empty( $this->success ) ) :
|
|
||||||
?>
|
|
||||||
<div class="notice notice-success is-dismissible appsero-license-section">
|
|
||||||
<p><?php echo $this->success; ?></p>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
endif;
|
|
||||||
echo '<br />';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Card header
|
|
||||||
*/
|
|
||||||
private function show_license_page_card_header() {
|
|
||||||
?>
|
|
||||||
<div class="appsero-license-title">
|
|
||||||
<svg enable-background="new 0 0 299.995 299.995" version="1.1" viewBox="0 0 300 300" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="m150 161.48c-8.613 0-15.598 6.982-15.598 15.598 0 5.776 3.149 10.807 7.817 13.505v17.341h15.562v-17.341c4.668-2.697 7.817-7.729 7.817-13.505 0-8.616-6.984-15.598-15.598-15.598z"/>
|
|
||||||
<path d="m150 85.849c-13.111 0-23.775 10.665-23.775 23.775v25.319h47.548v-25.319c-1e-3 -13.108-10.665-23.775-23.773-23.775z"/>
|
|
||||||
<path d="m150 1e-3c-82.839 0-150 67.158-150 150 0 82.837 67.156 150 150 150s150-67.161 150-150c0-82.839-67.161-150-150-150zm46.09 227.12h-92.173c-9.734 0-17.626-7.892-17.626-17.629v-56.919c0-8.491 6.007-15.582 14.003-17.25v-25.697c0-27.409 22.3-49.711 49.711-49.711 27.409 0 49.709 22.3 49.709 49.711v25.697c7.993 1.673 14 8.759 14 17.25v56.919h2e-3c0 9.736-7.892 17.629-17.626 17.629z"/>
|
|
||||||
</svg>
|
|
||||||
<span>Activate License</span>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Active client license
|
|
||||||
*/
|
|
||||||
private function active_client_license( $form ) {
|
|
||||||
if ( empty( $form['license_key'] ) ) {
|
|
||||||
$this->error = 'The license key field is required.';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$license_key = sanitize_text_field( $form['license_key'] );
|
|
||||||
$response = $this->activate( $license_key );
|
|
||||||
|
|
||||||
if ( ! $response['success'] ) {
|
|
||||||
$this->error = $response['error'] ? $response['error'] : 'Unknown error occurred.';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'key' => $license_key,
|
|
||||||
'status' => 'activate',
|
|
||||||
'remaining' => $response['remaining'],
|
|
||||||
'activation_limit' => $response['activation_limit'],
|
|
||||||
'expiry_days' => $response['expiry_days'],
|
|
||||||
'title' => $response['title'],
|
|
||||||
'source_id' => $response['source_identifier'],
|
|
||||||
'recurring' => $response['recurring'],
|
|
||||||
);
|
|
||||||
|
|
||||||
update_option( $this->option_key, $data, false );
|
|
||||||
|
|
||||||
$this->success = 'License activated successfully.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deactive client license
|
|
||||||
*/
|
|
||||||
private function deactive_client_license( $form ) {
|
|
||||||
$license = get_option( $this->option_key, null );
|
|
||||||
|
|
||||||
if ( empty( $license['key'] ) ) {
|
|
||||||
$this->error = 'License key not found.';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = $this->deactivate( $license['key'] );
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'key' => '',
|
|
||||||
'status' => 'deactivate',
|
|
||||||
);
|
|
||||||
|
|
||||||
update_option( $this->option_key, $data, false );
|
|
||||||
|
|
||||||
if ( ! $response['success'] ) {
|
|
||||||
$this->error = $response['error'] ? $response['error'] : 'Unknown error occurred.';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->success = 'License deactivated successfully.';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add license menu page
|
|
||||||
*/
|
|
||||||
private function create_menu_page() {
|
|
||||||
call_user_func(
|
|
||||||
'add_' . 'menu' . '_page',
|
|
||||||
$this->menu_args['page_title'],
|
|
||||||
$this->menu_args['menu_title'],
|
|
||||||
$this->menu_args['capability'],
|
|
||||||
$this->menu_args['menu_slug'],
|
|
||||||
array( $this, 'menu_output' ),
|
|
||||||
$this->menu_args['icon_url'],
|
|
||||||
$this->menu_args['position']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add submenu page
|
|
||||||
*/
|
|
||||||
private function create_submenu_page() {
|
|
||||||
call_user_func(
|
|
||||||
'add_' . 'submenu' . '_page',
|
|
||||||
$this->menu_args['parent_slug'],
|
|
||||||
$this->menu_args['page_title'],
|
|
||||||
$this->menu_args['menu_title'],
|
|
||||||
$this->menu_args['capability'],
|
|
||||||
$this->menu_args['menu_slug'],
|
|
||||||
array( $this, 'menu_output' ),
|
|
||||||
$this->menu_args['position']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add submenu page
|
|
||||||
*/
|
|
||||||
private function create_options_page() {
|
|
||||||
call_user_func(
|
|
||||||
'add_' . 'options' . '_page',
|
|
||||||
$this->menu_args['page_title'],
|
|
||||||
$this->menu_args['menu_title'],
|
|
||||||
$this->menu_args['capability'],
|
|
||||||
$this->menu_args['menu_slug'],
|
|
||||||
array( $this, 'menu_output' ),
|
|
||||||
$this->menu_args['position']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedule daily sicense checker event
|
|
||||||
*/
|
|
||||||
public function schedule_cron_event() {
|
|
||||||
if ( ! wp_next_scheduled( $this->schedule_hook ) ) {
|
|
||||||
wp_schedule_event( time(), 'daily', $this->schedule_hook );
|
|
||||||
|
|
||||||
wp_schedule_single_event( time() + 20, $this->schedule_hook );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear any scheduled hook
|
|
||||||
*/
|
|
||||||
public function clear_scheduler() {
|
|
||||||
wp_clear_scheduled_hook( $this->schedule_hook );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable/Disable schedule
|
|
||||||
*/
|
|
||||||
private function run_schedule() {
|
|
||||||
switch ( $this->client->type ) {
|
|
||||||
case 'plugin':
|
|
||||||
register_activation_hook( $this->client->file, array( $this, 'schedule_cron_event' ) );
|
|
||||||
register_deactivation_hook( $this->client->file, array( $this, 'clear_scheduler' ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'theme':
|
|
||||||
add_action( 'after_switch_theme', array( $this, 'schedule_cron_event' ) );
|
|
||||||
add_action( 'switch_theme', array( $this, 'clear_scheduler' ) );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Form action URL
|
|
||||||
*/
|
|
||||||
private function formActionUrl() {
|
|
||||||
echo add_query_arg(
|
|
||||||
array( 'page' => $_GET['page'] ),
|
|
||||||
admin_url( basename( $_SERVER['SCRIPT_NAME'] ) )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get input license key
|
|
||||||
* @param $action
|
|
||||||
* @return $license
|
|
||||||
*/
|
|
||||||
private function get_input_license_value( $action, $license ) {
|
|
||||||
if ( 'active' == $action ) {
|
|
||||||
return isset( $license['key'] ) ? $license['key'] : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'deactive' == $action ) {
|
|
||||||
$key_length = strlen( $license['key'] );
|
|
||||||
|
|
||||||
return str_pad(
|
|
||||||
substr( $license['key'], 0, $key_length / 2 ), $key_length, '*'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,247 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace Appsero;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appsero Updater
|
|
||||||
*
|
|
||||||
* This class will show new updates project
|
|
||||||
*/
|
|
||||||
class Updater {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appsero\Client
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
*/
|
|
||||||
protected $client;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the class
|
|
||||||
*
|
|
||||||
* @param Appsero\Client
|
|
||||||
*/
|
|
||||||
public function __construct( Client $client ) {
|
|
||||||
|
|
||||||
$this->client = $client;
|
|
||||||
$this->cache_key = 'appsero_' . md5( $this->client->slug ) . '_version_info';
|
|
||||||
|
|
||||||
// Run hooks.
|
|
||||||
if ( $this->client->type == 'plugin' ) {
|
|
||||||
$this->run_plugin_hooks();
|
|
||||||
} elseif ( $this->client->type == 'theme' ) {
|
|
||||||
$this->run_theme_hooks();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up WordPress filter to hooks to get update.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function run_plugin_hooks() {
|
|
||||||
add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_plugin_update' ) );
|
|
||||||
add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up WordPress filter to hooks to get update.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function run_theme_hooks() {
|
|
||||||
add_filter( 'pre_set_site_transient_update_themes', array( $this, 'check_theme_update' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check for Update for this specific project
|
|
||||||
*/
|
|
||||||
public function check_plugin_update( $transient_data ) {
|
|
||||||
global $pagenow;
|
|
||||||
|
|
||||||
if ( ! is_object( $transient_data ) ) {
|
|
||||||
$transient_data = new \stdClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'plugins.php' == $pagenow && is_multisite() ) {
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->basename ] ) ) {
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
$version_info = $this->get_cached_version_info();
|
|
||||||
|
|
||||||
if ( false === $version_info ) {
|
|
||||||
$version_info = $this->get_project_latest_version();
|
|
||||||
$this->set_cached_version_info( $version_info );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
|
|
||||||
|
|
||||||
if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
|
|
||||||
unset( $version_info->sections );
|
|
||||||
$transient_data->response[ $this->client->basename ] = $version_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transient_data->last_checked = time();
|
|
||||||
$transient_data->checked[ $this->client->basename ] = $this->client->project_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get version info from database
|
|
||||||
*
|
|
||||||
* @return Object or Boolean
|
|
||||||
*/
|
|
||||||
private function get_cached_version_info() {
|
|
||||||
|
|
||||||
$value = get_transient( $this->cache_key );
|
|
||||||
|
|
||||||
if( ! $value && ! isset( $value->name ) ) {
|
|
||||||
return false; // Cache is expired
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need to turn the icons into an array
|
|
||||||
if ( isset( $value->icons ) ) {
|
|
||||||
$value->icons = (array) $value->icons;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need to turn the banners into an array
|
|
||||||
if ( isset( $value->banners ) ) {
|
|
||||||
$value->banners = (array) $value->banners;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $value->sections ) ) {
|
|
||||||
$value->sections = (array) $value->sections;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set version info to database
|
|
||||||
*/
|
|
||||||
private function set_cached_version_info( $value ) {
|
|
||||||
if ( ! $value ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_transient( $this->cache_key, $value, 3 * HOUR_IN_SECONDS );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get plugin info from Appsero
|
|
||||||
*/
|
|
||||||
private function get_project_latest_version() {
|
|
||||||
|
|
||||||
$license_option_key = 'appsero_' . md5( $this->client->slug ) . '_manage_license';
|
|
||||||
$license = get_option( $license_option_key, null );
|
|
||||||
|
|
||||||
$params = array(
|
|
||||||
'version' => $this->client->project_version,
|
|
||||||
'name' => $this->client->name,
|
|
||||||
'slug' => $this->client->slug,
|
|
||||||
'basename' => $this->client->basename,
|
|
||||||
'license_key' => ! empty( $license ) && isset( $license['key'] ) ? $license['key'] : '',
|
|
||||||
);
|
|
||||||
|
|
||||||
$route = 'update/' . $this->client->hash . '/check';
|
|
||||||
|
|
||||||
$response = $this->client->send_request( $params, $route, true );
|
|
||||||
|
|
||||||
if ( is_wp_error( $response ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = json_decode( wp_remote_retrieve_body( $response ) );
|
|
||||||
|
|
||||||
if ( ! isset( $response->slug ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $response->icons ) ) {
|
|
||||||
$response->icons = (array) $response->icons;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $response->banners ) ) {
|
|
||||||
$response->banners = (array) $response->banners;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( isset( $response->sections ) ) {
|
|
||||||
$response->sections = (array) $response->sections;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates information on the "View version x.x details" page with custom data.
|
|
||||||
*
|
|
||||||
* @param mixed $data
|
|
||||||
* @param string $action
|
|
||||||
* @param object $args
|
|
||||||
*
|
|
||||||
* @return object $data
|
|
||||||
*/
|
|
||||||
public function plugins_api_filter( $data, $action = '', $args = null ) {
|
|
||||||
|
|
||||||
if ( $action != 'plugin_information' ) {
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! isset( $args->slug ) || ( $args->slug != $this->client->slug ) ) {
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
$version_info = $this->get_cached_version_info();
|
|
||||||
|
|
||||||
if ( false === $version_info ) {
|
|
||||||
$version_info = $this->get_project_latest_version();
|
|
||||||
$this->set_cached_version_info( $version_info );
|
|
||||||
}
|
|
||||||
|
|
||||||
return $version_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check theme upate
|
|
||||||
*/
|
|
||||||
public function check_theme_update( $transient_data ) {
|
|
||||||
global $pagenow;
|
|
||||||
|
|
||||||
if ( ! is_object( $transient_data ) ) {
|
|
||||||
$transient_data = new \stdClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'themes.php' == $pagenow && is_multisite() ) {
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ! empty( $transient_data->response ) && ! empty( $transient_data->response[ $this->client->slug ] ) ) {
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
$version_info = $this->get_cached_version_info();
|
|
||||||
|
|
||||||
if ( false === $version_info ) {
|
|
||||||
$version_info = $this->get_project_latest_version();
|
|
||||||
$this->set_cached_version_info( $version_info );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
|
|
||||||
|
|
||||||
if ( version_compare( $this->client->project_version, $version_info->new_version, '<' ) ) {
|
|
||||||
$transient_data->response[ $this->client->slug ] = (array) $version_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transient_data->last_checked = time();
|
|
||||||
$transient_data->checked[ $this->client->slug ] = $this->client->project_version;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $transient_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 756 B |
@ -1,173 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Handles options for subscribe2
|
|
||||||
// DO NOT EDIT THIS FILE AS IT IS SET BY THE OPTIONS PAGE
|
|
||||||
|
|
||||||
global $mysubscribe2;
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['autosub'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['autosub'] = 'no';
|
|
||||||
} // option to autosubscribe registered users to new categories
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['newreg_override'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['newreg_override'] = 'no';
|
|
||||||
} // option to autosubscribe registered users to new categories
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['wpregdef'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['wpregdef'] = 'no';
|
|
||||||
} // option to check registration form box by default
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['autoformat'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['autoformat'] = 'post';
|
|
||||||
} // option for default auto-subscription email format
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['show_autosub'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['show_autosub'] = 'yes';
|
|
||||||
} // option to display auto-subscription option to registered users
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['autosub_def'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['autosub_def'] = 'no';
|
|
||||||
} // option for user default auto-subscription to new categories
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['comment_subs'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['comment_subs'] = 'no';
|
|
||||||
} // option for commenters to subscribe as public subscribers
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['comment_def'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['comment_def'] = 'no';
|
|
||||||
} // option for comments box to be checked by default
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['one_click_profile'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['one_click_profile'] = 'no';
|
|
||||||
} // option for displaying 'one-click' option on profile page
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['bcclimit'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['bcclimit'] = 1;
|
|
||||||
} // option for default bcc limit on email notifications
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['admin_email'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['admin_email'] = 'subs';
|
|
||||||
} // option for sending new subscriber notifications to admins
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['tracking'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['tracking'] = '';
|
|
||||||
} // option for tracking
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['s2page'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['s2page'] = 0;
|
|
||||||
} // option for default WordPress page for Subscribe2 to use
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['s2_unsub_page'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['s2_unsub_page'] = 0;
|
|
||||||
} // option for default Subscribe2 unsubscribe page
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['stylesheet'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['stylesheet'] = 'yes';
|
|
||||||
} // option to include link to theme stylesheet from HTML notifications
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['embed'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['embed'] = 'no';
|
|
||||||
} // option to embed stylesheet and images into HTML emails
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['pages'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['pages'] = 'no';
|
|
||||||
} // option for sending notifications for WordPress pages
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['password'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['password'] = 'no';
|
|
||||||
} // option for sending notifications for posts that are password protected
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['stickies'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['stickies'] = 'no';
|
|
||||||
} // option for including sticky posts in digest notifications
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['private'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['private'] = 'no';
|
|
||||||
} // option for sending notifications for posts that are private
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['email_freq'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['email_freq'] = 'never';
|
|
||||||
} // option for sending emails per-post or as a digest email on a cron schedule
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['cron_order'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['cron_order'] = 'desc';
|
|
||||||
} // option for ordering of posts in digest email
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['compulsory'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['compulsory'] = '';
|
|
||||||
} // option for compulsory categories
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['exclude'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['exclude'] = '';
|
|
||||||
} // option for excluded categories
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['sender'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['sender'] = 'blogname';
|
|
||||||
} // option for email notification sender
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['reg_override'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['reg_override'] = '1';
|
|
||||||
} // option for excluded categories to be overriden for registered users
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['show_meta'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['show_meta'] = '0';
|
|
||||||
} // option to display link to subscribe2 page from 'meta'
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['show_button'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['show_button'] = '1';
|
|
||||||
} // option to show Subscribe2 button on Write page
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['ajax'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['ajax'] = '0';
|
|
||||||
} // option to enable an AJAX style form
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['widget'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['widget'] = '1';
|
|
||||||
} // option to enable Subscribe2 Widget
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['counterwidget'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['counterwidget'] = '0';
|
|
||||||
} // option to enable Subscribe2 Counter Widget
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['s2meta_default'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['s2meta_default'] = '0';
|
|
||||||
} // option for Subscribe2 over ride postmeta to be checked by default
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['barred'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['barred'] = '';
|
|
||||||
} // option containing domains barred from public registration
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['exclude_formats'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['exclude_formats'] = '';
|
|
||||||
} // option for excluding post formats as supported by the current theme
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['mailtext'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['mailtext'] = __( "{BLOGNAME} has posted a new item, '{TITLE}'\n\n{POST}\n\nYou may view the latest post at\n{PERMALINK}\n\nYou received this e-mail because you asked to be notified when new updates are posted.\nBest regards,\n{MYNAME}\n{EMAIL}", 'subscribe2' );
|
|
||||||
} // Default notification email text
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['notification_subject'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['notification_subject'] = '[{BLOGNAME}] {TITLE}';
|
|
||||||
} // Default notification email subject
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['confirm_email'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['confirm_email'] = __( "{BLOGNAME} has received a request to {ACTION} for this email address. To complete your request please click on the link below:\n\n{LINK}\n\nIf you did not request this, please feel free to disregard this notice!\n\nThank you,\n{MYNAME}.", 'subscribe2' );
|
|
||||||
} // Default confirmation email text
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['confirm_subject'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['confirm_subject'] = '[{BLOGNAME}] ' . __( 'Please confirm your request', 'subscribe2' );
|
|
||||||
} // Default confirmation email subject
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['remind_email'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['remind_email'] = __( "This email address was subscribed for notifications at {BLOGNAME} ({BLOGLINK}) but the subscription remains incomplete.\n\nIf you wish to complete your subscription please click on the link below:\n\n{LINK}\n\nIf you do not wish to complete your subscription please ignore this email and your address will be removed from our database.\n\nRegards,\n{MYNAME}", 'subscribe2' );
|
|
||||||
} // Default reminder email text
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['remind_subject'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['remind_subject'] = '[{BLOGNAME}] ' . __( 'Subscription Reminder', 'subscribe2' );
|
|
||||||
} // Default reminder email subject
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['ajax'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['ajax'] = '';
|
|
||||||
} // Default frontend form setting
|
|
||||||
|
|
||||||
if ( ! isset( $mysubscribe2->subscribe2_options['js_ip_updater'] ) ) {
|
|
||||||
$mysubscribe2->subscribe2_options['js_ip_updater'] = '';
|
|
||||||
} // Default setting for using javascript to update form ip address
|
|
@ -1,107 +0,0 @@
|
|||||||
/* global s2AjaxScriptStrings */
|
|
||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - added position and minimum width and height attributes to .dialog
|
|
||||||
// Version 1.2 - added nonce use for form submission
|
|
||||||
// Version 1.3 - eslinted
|
|
||||||
|
|
||||||
var s2jQuery = jQuery.noConflict();
|
|
||||||
s2jQuery( document ).ready(
|
|
||||||
function() {
|
|
||||||
var dialog = s2jQuery( '<div></div>' );
|
|
||||||
var ajaxurl = s2AjaxScriptStrings.ajaxurl;
|
|
||||||
s2jQuery( 'a.s2popup' ).click(
|
|
||||||
function( event ) {
|
|
||||||
var data = {
|
|
||||||
'action': 'subscribe2_form',
|
|
||||||
'data': s2jQuery( 'a.s2popup' ).attr( 'id' )
|
|
||||||
};
|
|
||||||
event.preventDefault();
|
|
||||||
jQuery.post(
|
|
||||||
ajaxurl,
|
|
||||||
data,
|
|
||||||
function( response ) {
|
|
||||||
dialog.html( response );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
dialog.dialog(
|
|
||||||
{
|
|
||||||
modal: true,
|
|
||||||
zIndex: 10000,
|
|
||||||
minWidth: 350,
|
|
||||||
minHeight: 300,
|
|
||||||
title: s2AjaxScriptStrings.title,
|
|
||||||
closeText: ""
|
|
||||||
}
|
|
||||||
);
|
|
||||||
dialog.dialog( 'open' );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
s2jQuery( document ).on(
|
|
||||||
'submit',
|
|
||||||
'#s2ajaxform',
|
|
||||||
function( event ) {
|
|
||||||
var email = s2jQuery( '#s2ajaxform input[name=email]' ).val();
|
|
||||||
var ip = s2jQuery( '#s2ajaxform input[name=ip]' ).val();
|
|
||||||
var firstname = s2jQuery( '#s2ajaxform input[name=firstname]' ).val();
|
|
||||||
var lastname = s2jQuery( '#s2ajaxform input[name=lastname]' ).val();
|
|
||||||
var uri = s2jQuery( '#s2ajaxform input[name=uri]' ).val();
|
|
||||||
var btn = s2jQuery( this ).find( 'input[type=submit][clicked=true]' );
|
|
||||||
var data;
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
if ( 'undefined' === typeof firstname ) {
|
|
||||||
firstname = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'undefined' === typeof lastname ) {
|
|
||||||
lastname = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( 'undefined' === typeof uri ) {
|
|
||||||
uri = 'http://';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( btn.length && s2jQuery( '#s2ajaxform' ).has( btn ) ) {
|
|
||||||
data = {
|
|
||||||
'action': 'subscribe2_submit',
|
|
||||||
'nonce': s2AjaxScriptStrings.nonce,
|
|
||||||
'data': {
|
|
||||||
'email': email,
|
|
||||||
'ip': ip,
|
|
||||||
'firstname': firstname,
|
|
||||||
'lastname': lastname,
|
|
||||||
'uri': uri,
|
|
||||||
'button': btn.attr( 'name' )
|
|
||||||
}
|
|
||||||
};
|
|
||||||
jQuery.post(
|
|
||||||
ajaxurl,
|
|
||||||
data,
|
|
||||||
function( response ) {
|
|
||||||
dialog.html( response );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Allows detection of which button was clicked
|
|
||||||
s2jQuery( document ).on(
|
|
||||||
'click',
|
|
||||||
'#s2ajaxform input[type=submit]',
|
|
||||||
function() {
|
|
||||||
s2jQuery( '#s2ajaxform input[type=submit]' ).removeAttr( 'clicked' );
|
|
||||||
s2jQuery( this ).attr( 'clicked', 'true' );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// when form is closed return to default
|
|
||||||
s2jQuery( document ).on(
|
|
||||||
'dialogclose',
|
|
||||||
function() {
|
|
||||||
dialog.html( dialog );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
@ -1 +0,0 @@
|
|||||||
var s2jQuery=jQuery.noConflict();s2jQuery(document).ready(function(){var t=s2jQuery("<div></div>"),a=s2AjaxScriptStrings.ajaxurl;s2jQuery("a.s2popup").click(function(e){var i={action:"subscribe2_form",data:s2jQuery("a.s2popup").attr("id")};e.preventDefault(),jQuery.post(a,i,function(a){t.html(a)}),t.dialog({modal:!0,zIndex:1e4,minWidth:350,minHeight:300,title:s2AjaxScriptStrings.title}),t.dialog("open")}),s2jQuery(document).on("submit","#s2ajaxform",function(e){var i,n=s2jQuery("#s2ajaxform input[name=email]").val(),r=s2jQuery("#s2ajaxform input[name=ip]").val(),u=s2jQuery("#s2ajaxform input[name=firstname]").val(),s=s2jQuery("#s2ajaxform input[name=lastname]").val(),o=s2jQuery("#s2ajaxform input[name=uri]").val(),m=s2jQuery(this).find("input[type=submit][clicked=true]");e.preventDefault(),void 0===u&&(u=""),void 0===s&&(s=""),void 0===o&&(o="http://"),m.length&&s2jQuery("#s2ajaxform").has(m)&&(i={action:"subscribe2_submit",nonce:s2AjaxScriptStrings.nonce,data:{email:n,ip:r,firstname:u,lastname:s,uri:o,button:m.attr("name")}},jQuery.post(a,i,function(a){t.html(a)}))}),s2jQuery(document).on("click","#s2ajaxform input[type=submit]",function(){s2jQuery("#s2ajaxform input[type=submit]").removeAttr("clicked"),s2jQuery(this).attr("clicked","true")}),s2jQuery(document).on("dialogclose",function(){t.html(t)})});
|
|
@ -1,4 +0,0 @@
|
|||||||
/* global QTags */
|
|
||||||
// Version 2.0 - original version for WordPress versions 3.3 and greater
|
|
||||||
|
|
||||||
QTags.addButton( 'Subscribe2', 'Subscribe2', '[subscribe2]' );
|
|
@ -1 +0,0 @@
|
|||||||
QTags.addButton("Subscribe2","Subscribe2","[subscribe2]");
|
|
Binary file not shown.
Before Width: | Height: | Size: 406 B |
@ -1,52 +0,0 @@
|
|||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - Updated with function fixes and for WordPress 3.2 / jQuery 1.6
|
|
||||||
// Version 1.2 - Update to work when DISABLED is specified for changes in version 8.5
|
|
||||||
// Version 1.3 - Update for Subscribe2 9.0 to remove unecessary code now WordPress 3.3 is minimum requirement
|
|
||||||
// Version 1.4 - eslinted
|
|
||||||
|
|
||||||
jQuery( document ).ready(
|
|
||||||
function() {
|
|
||||||
|
|
||||||
// function to check or uncheck all when 'checkall' box it toggled
|
|
||||||
jQuery( 'input[name="checkall"]' ).click(
|
|
||||||
function() {
|
|
||||||
var checkedStatus = this.checked;
|
|
||||||
jQuery( 'input[class="' + this.value + '"]' ).each(
|
|
||||||
function() {
|
|
||||||
if ( false === jQuery( this ).prop( 'disabled' ) ) {
|
|
||||||
this.checked = checkedStatus;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// function to check or uncheck 'checkall' box when individual boxes are toggled
|
|
||||||
jQuery( 'input[class^="checkall"]' ).click(
|
|
||||||
function() {
|
|
||||||
var checkedStatus = true;
|
|
||||||
jQuery( 'input[class="' + this.className + '"]' ).each(
|
|
||||||
function() {
|
|
||||||
if ( ( ! this.checked ) ) {
|
|
||||||
checkedStatus = false;
|
|
||||||
}
|
|
||||||
jQuery( 'input[value="' + this.className + '"]' )
|
|
||||||
.prop( 'checked', checkedStatus );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// function to check or uncheck 'checkall' box when page is loaded
|
|
||||||
jQuery( 'input[name^="checkall"]' ).each(function(value, item) {
|
|
||||||
var checkedStatus = true;
|
|
||||||
jQuery('input[class='+item.value).each(function () {
|
|
||||||
if ( ( ! this.checked ) ) {
|
|
||||||
checkedStatus = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
jQuery(this).prop( 'checked', checkedStatus );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
@ -1 +0,0 @@
|
|||||||
jQuery(document).ready(function(){jQuery('input[name="checkall"]').click(function(){var c=this.checked;jQuery('input[class="'+this.value+'"]').each(function(){!1===jQuery(this).prop("disabled")&&(this.checked=c)})}),jQuery('input[class^="checkall"]').click(function(){var c=!0;jQuery('input[class="'+this.className+'"]').each(function(){c=!0===this.checked&&!0===c,jQuery('input[value="'+this.className+'"]').prop("checked",c)})}),jQuery('input[class^="checkall"]').each(function(){var c=!0;c=!0===this.checked&&!0===c,jQuery('input[value="'+this.className+'"]').prop("checked",c)})});
|
|
@ -1,55 +0,0 @@
|
|||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - Update for Subscribe2 9.0 to remove unecessary code now WordPress 3.3 is minimum requirement
|
|
||||||
// Version 1.2 - Initialise the colour fields on page load so they are the correct colour
|
|
||||||
// Version 1.3 - eslinted
|
|
||||||
|
|
||||||
jQuery( document ).ready(
|
|
||||||
function() {
|
|
||||||
jQuery( document ).on(
|
|
||||||
'focus',
|
|
||||||
'.colorpickerField',
|
|
||||||
function() {
|
|
||||||
var picker,
|
|
||||||
field = this.id.substr( 0, 20 );
|
|
||||||
|
|
||||||
if ( jQuery( this ).is( '.s2_initialised' ) || -1 !== this.id.search( '__i__' ) ) {
|
|
||||||
return; // exit early, already initialized or not activated
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery( this ).addClass( 's2_initialised' );
|
|
||||||
|
|
||||||
jQuery( '.s2_colorpicker' ).each(
|
|
||||||
function() {
|
|
||||||
if ( -1 !== this.id.search( field ) ) {
|
|
||||||
picker = this.id;
|
|
||||||
return false; // stop looping
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jQuery( this ).on(
|
|
||||||
'focusin',
|
|
||||||
function() {
|
|
||||||
jQuery( '.s2_colorpicker' ).slideUp();
|
|
||||||
jQuery.farbtastic( '#' + picker ).linkTo( this );
|
|
||||||
jQuery( '#' + picker ).slideDown();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jQuery( this ).on(
|
|
||||||
'focusout',
|
|
||||||
function() {
|
|
||||||
jQuery( '#' + picker ).slideUp();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
jQuery( this ).trigger( 'focus' );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
jQuery( '.colorpickerField' ).each(
|
|
||||||
function() {
|
|
||||||
jQuery.farbtastic( '#' + this.id ).linkTo( this );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
@ -1 +0,0 @@
|
|||||||
jQuery(document).ready(function(){jQuery(document).on("focus",".colorpickerField",function(){var i,e=this.id.substr(0,20);jQuery(this).is(".s2_initialised")||-1!==this.id.search("__i__")||(jQuery(this).addClass("s2_initialised"),jQuery(".s2_colorpicker").each(function(){if(-1!==this.id.search(e))return i=this.id,!1}),jQuery(this).on("focusin",function(){jQuery(".s2_colorpicker").slideUp(),jQuery.farbtastic("#"+i).linkTo(this),jQuery("#"+i).slideDown()}),jQuery(this).on("focusout",function(){jQuery("#"+i).slideUp()}),jQuery(this).trigger("focus"))}),jQuery(".colorpickerField").each(function(){jQuery.farbtastic("#"+this.id).linkTo(this)})});
|
|
@ -1,12 +0,0 @@
|
|||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - eslinted
|
|
||||||
|
|
||||||
jQuery( document ).ready(
|
|
||||||
function() {
|
|
||||||
jQuery( '#s2datepicker' ).datepicker(
|
|
||||||
{
|
|
||||||
dateFormat: 'MM d, yy'
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
@ -1 +0,0 @@
|
|||||||
jQuery(document).ready(function(){jQuery("#s2datepicker").datepicker({dateFormat:"MM d, yy"})});
|
|
@ -1,17 +0,0 @@
|
|||||||
/* global s2DismissScriptStrings */
|
|
||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - eslinted
|
|
||||||
|
|
||||||
jQuery( document ).on(
|
|
||||||
'click',
|
|
||||||
'#sender_message .notice-dismiss',
|
|
||||||
function() {
|
|
||||||
var ajaxurl = s2DismissScriptStrings.ajaxurl;
|
|
||||||
var data = {
|
|
||||||
'action': 's2_dismiss_notice',
|
|
||||||
'nonce': s2DismissScriptStrings.nonce
|
|
||||||
|
|
||||||
};
|
|
||||||
jQuery.post( ajaxurl, data );
|
|
||||||
}
|
|
||||||
);
|
|
@ -1 +0,0 @@
|
|||||||
jQuery(document).on("click","#sender_message .notice-dismiss",function(){var s=s2DismissScriptStrings.ajaxurl,i={action:"s2_dismiss_notice",nonce:s2DismissScriptStrings.nonce};jQuery.post(s,i)});
|
|
@ -1,65 +0,0 @@
|
|||||||
/* exported s2Show, s2Hide, s2Update, s2Revert, s2CronUpdate, s2CronRevert */
|
|
||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - updated for Subscribe2 8.6
|
|
||||||
// Version 1.2 - updated for Subscribe2 9.0
|
|
||||||
// Version 1.3 - eslinted
|
|
||||||
|
|
||||||
// hide our span before page loads
|
|
||||||
jQuery( document ).ready(
|
|
||||||
function() {
|
|
||||||
jQuery( '#s2bcclimit_2' ).hide();
|
|
||||||
jQuery( '#s2entries_2' ).hide();
|
|
||||||
jQuery( '#s2cron_2' ).hide();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
//show span on clicking the edit link
|
|
||||||
function s2Show( id ) {
|
|
||||||
jQuery( '#s2' + id + '_2' ).show();
|
|
||||||
jQuery( '#s2' + id + '_1' ).hide();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// hide span on clicking the hide link
|
|
||||||
function s2Hide( id ) {
|
|
||||||
jQuery( '#s2' + id + '_1' ).show();
|
|
||||||
jQuery( '#s2' + id + '_2' ).hide();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function s2Update( id ) {
|
|
||||||
var input = jQuery( 'input[name="' + id + '"]' ).val();
|
|
||||||
jQuery( '#s2' + id ).html( input );
|
|
||||||
s2Hide( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
function s2Revert( id ) {
|
|
||||||
var option = jQuery( '#js' + id ).val();
|
|
||||||
jQuery( 'input[name="' + id + '"]' ).val( option );
|
|
||||||
jQuery( '#s2' + id ).html( option );
|
|
||||||
s2Hide( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
function s2CronUpdate( id ) {
|
|
||||||
var date, time;
|
|
||||||
date = jQuery( 'input[name="' + id + 'date"]' ).val();
|
|
||||||
jQuery( '#s2' + id + 'date' ).html( date );
|
|
||||||
time = jQuery( 'select[name="' + id + 'time"] option:selected' ).html();
|
|
||||||
jQuery( '#s2' + id + 'time' ).html( time );
|
|
||||||
s2Hide( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
function s2CronRevert( id ) {
|
|
||||||
var date, time;
|
|
||||||
date = jQuery( '#js' + id + 'date' ).val();
|
|
||||||
jQuery( 'input[name="' + id + 'date"]' ).val( date );
|
|
||||||
jQuery( '#s2' + id + 'date' ).html( date );
|
|
||||||
time = jQuery( '#js' + id + 'time' ).val();
|
|
||||||
jQuery( '[name=' + id + 'time] option' ).filter(
|
|
||||||
function() {
|
|
||||||
return ( this.text === time );
|
|
||||||
}
|
|
||||||
).prop( 'selected', true ).parent().focus();
|
|
||||||
jQuery( '#s2' + id + 'time' ).html( time );
|
|
||||||
s2Hide( id );
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
function s2Show(e){return jQuery("#s2"+e+"_2").show(),jQuery("#s2"+e+"_1").hide(),!1}function s2Hide(e){return jQuery("#s2"+e+"_1").show(),jQuery("#s2"+e+"_2").hide(),!1}function s2Update(e){var t=jQuery('input[name="'+e+'"]').val();jQuery("#s2"+e).html(t),s2Hide(e)}function s2Revert(e){var t=jQuery("#js"+e).val();jQuery('input[name="'+e+'"]').val(t),jQuery("#s2"+e).html(t),s2Hide(e)}function s2CronUpdate(e){var t,r;t=jQuery('input[name="'+e+'date"]').val(),jQuery("#s2"+e+"date").html(t),r=jQuery('select[name="'+e+'time"] option:selected').html(),jQuery("#s2"+e+"time").html(r),s2Hide(e)}function s2CronRevert(e){var t,r;t=jQuery("#js"+e+"date").val(),jQuery('input[name="'+e+'date"]').val(t),jQuery("#s2"+e+"date").html(t),r=jQuery("#js"+e+"time").val(),jQuery("[name="+e+"time] option").filter(function(){return this.text===r}).prop("selected",!0).parent().focus(),jQuery("#s2"+e+"time").html(r),s2Hide(e)}jQuery(document).ready(function(){jQuery("#s2bcclimit_2").hide(),jQuery("#s2entries_2").hide(),jQuery("#s2cron_2").hide()});
|
|
@ -1,16 +0,0 @@
|
|||||||
/* exported getip */
|
|
||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - eslinted and fixed for Widget form name change
|
|
||||||
|
|
||||||
function getip( json ) {
|
|
||||||
var ip, i, l;
|
|
||||||
if ( true === document.body.contains( document.forms.s2form ) || true === document.body.contains( document.forms.s2formwidget ) ) {
|
|
||||||
ip = document.getElementsByName( 'ip' );
|
|
||||||
l = ip.length;
|
|
||||||
for ( i = 0; i < l; i++ ) {
|
|
||||||
if ( 's2form' === ip[i].parentElement.name ) {
|
|
||||||
ip[i].value = json.ip;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
function getip(e){var n,o,t;if(!0===document.body.contains(document.forms.s2form)||!0===document.body.contains(document.forms.s2formwidget))for(t=(n=document.getElementsByName("ip")).length,o=0;o<t;o++)"s2form"===n[o].parentElement.name&&(n[o].value=e.ip)}
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
@ -1,58 +0,0 @@
|
|||||||
/* global s2ScriptStrings */
|
|
||||||
/* exported s2BulkActionCheck, submitHandler, bmCheck, s2ScriptStrings */
|
|
||||||
// Version 1.0 - original version
|
|
||||||
// Version 1.1 - context specific delete warnings for registered or public subscribers
|
|
||||||
// Version 1.2 - single and plural string confirmation messages
|
|
||||||
// Version 1.3 - fix suppressed form processing for Toggle action, JavaScript binding only if elements exist & more effecient handling when no users selected
|
|
||||||
// Version 1.4 - improve Bulk Management user experience and functions
|
|
||||||
// Version 1.5 - eslinted
|
|
||||||
|
|
||||||
function s2BulkActionCheck() {
|
|
||||||
if ( null !== document.getElementById( 'doaction' ) ) {
|
|
||||||
document.getElementById( 'doaction' ).onclick = submitHandler;
|
|
||||||
document.getElementById( 'doaction2' ).onclick = submitHandler;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function submitHandler() {
|
|
||||||
var location, action1, action2, agree, selected;
|
|
||||||
location = document.getElementById( 's2_location' );
|
|
||||||
action1 = document.getElementById( 'bulk-action-selector-top' );
|
|
||||||
action2 = document.getElementById( 'bulk-action-selector-bottom' );
|
|
||||||
agree = false;
|
|
||||||
selected = document.querySelectorAll( 'input[name="subscriber[]"]:checked' ).length;
|
|
||||||
if ( 0 === selected ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if ( 'delete' === action1.value || 'delete' === action2.value ) {
|
|
||||||
if ( 'registered' === location.value ) {
|
|
||||||
if ( 1 < selected ) {
|
|
||||||
agree = window.confirm( s2ScriptStrings.registered_confirm_plural );
|
|
||||||
} else {
|
|
||||||
agree = window.confirm( s2ScriptStrings.registered_confirm_single );
|
|
||||||
}
|
|
||||||
} else if ( 'public' === location.value ) {
|
|
||||||
if ( 1 < selected ) {
|
|
||||||
agree = window.confirm( s2ScriptStrings.public_confirm_plural );
|
|
||||||
} else {
|
|
||||||
agree = window.confirm( s2ScriptStrings.public_confirm_single );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ( 'toggle' === action1.value || 'toggle' === action2.value ) {
|
|
||||||
agree = true;
|
|
||||||
}
|
|
||||||
return agree;
|
|
||||||
}
|
|
||||||
function bmCheck() {
|
|
||||||
var agree, selected;
|
|
||||||
agree = false;
|
|
||||||
selected = document.querySelectorAll( 'input[name="subscriber[]"]:checked' ).length;
|
|
||||||
if ( 0 === selected ) {
|
|
||||||
agree = window.confirm( s2ScriptStrings.bulk_manage_all );
|
|
||||||
} else if ( 1 < selected ) {
|
|
||||||
agree = window.confirm( s2ScriptStrings.bulk_manage_single );
|
|
||||||
} else {
|
|
||||||
agree = window.confirm( s2ScriptStrings.bulk_manage_plural );
|
|
||||||
}
|
|
||||||
return agree;
|
|
||||||
}
|
|
||||||
window.onload = s2BulkActionCheck;
|
|
@ -1 +0,0 @@
|
|||||||
function s2BulkActionCheck(){null!==document.getElementById("doaction")&&(document.getElementById("doaction").onclick=submitHandler,document.getElementById("doaction2").onclick=submitHandler)}function submitHandler(){var e,n,t,i,c;return e=document.getElementById("s2_location"),n=document.getElementById("bulk-action-selector-top"),t=document.getElementById("bulk-action-selector-bottom"),i=!1,0===(c=document.querySelectorAll('input[name="subscriber[]"]:checked').length)||("delete"===n.value||"delete"===t.value?"registered"===e.value?i=1<c?window.confirm(s2ScriptStrings.registered_confirm_plural):window.confirm(s2ScriptStrings.registered_confirm_single):"public"===e.value&&(i=1<c?window.confirm(s2ScriptStrings.public_confirm_plural):window.confirm(s2ScriptStrings.public_confirm_single)):"toggle"!==n.value&&"toggle"!==t.value||(i=!0),i)}function bmCheck(){var e;return!1,0===(e=document.querySelectorAll('input[name="subscriber[]"]:checked').length)?window.confirm(s2ScriptStrings.bulk_manage_all):1<e?window.confirm(s2ScriptStrings.bulk_manage_single):window.confirm(s2ScriptStrings.bulk_manage_plural)}window.onload=s2BulkActionCheck;
|
|
@ -1,92 +0,0 @@
|
|||||||
ul.s2_blogs
|
|
||||||
{
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
width: 99%;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li
|
|
||||||
{
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
width: 47%;
|
|
||||||
margin: 3px;
|
|
||||||
padding: .5em;
|
|
||||||
|
|
||||||
white-space: nowrap;
|
|
||||||
|
|
||||||
border: 1px solid #e0e0e0;
|
|
||||||
background-color: #e3e3e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li:hover
|
|
||||||
{
|
|
||||||
border-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li .name
|
|
||||||
{
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li .buttons
|
|
||||||
{
|
|
||||||
font-size: .8em;
|
|
||||||
|
|
||||||
display: block;
|
|
||||||
float: right;
|
|
||||||
|
|
||||||
margin-left: -6px;
|
|
||||||
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li .buttons a
|
|
||||||
{
|
|
||||||
display: block;
|
|
||||||
float: left;
|
|
||||||
|
|
||||||
margin: 0 0 0 1em;
|
|
||||||
padding: .1em .5em;
|
|
||||||
|
|
||||||
color: white;
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li .buttons a:hover
|
|
||||||
{
|
|
||||||
color: #666;
|
|
||||||
background-color: whitesmoke;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs div.additional_info
|
|
||||||
{
|
|
||||||
font-style: italic;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
z-index: 9;
|
|
||||||
bottom: 2.4em;
|
|
||||||
left: -2px;
|
|
||||||
|
|
||||||
display: none;
|
|
||||||
|
|
||||||
width: 75%;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
padding: .5em 1em;
|
|
||||||
|
|
||||||
color: #fff;
|
|
||||||
border: 1px solid white;
|
|
||||||
border-bottom: medium none;
|
|
||||||
-moz-border-radius-topleft: .5em;
|
|
||||||
-moz-border-radius-topright: .5em;
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
ul.s2_blogs li:hover div.additional_info
|
|
||||||
{
|
|
||||||
display: block;
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
ul.s2_blogs{float:left;width:99%}ul.s2_blogs li{position:relative;display:block;float:left;width:47%;margin:3px;padding:.5em;white-space:nowrap;border:1px solid #e0e0e0;background-color:#e3e3e3}ul.s2_blogs li:hover{border-color:#666}ul.s2_blogs li .name{display:block;float:left}ul.s2_blogs li .buttons{font-size:.8em;display:block;float:right;margin-left:-6px;white-space:nowrap}ul.s2_blogs li .buttons a{display:block;float:left;margin:0 0 0 1em;padding:.1em .5em;color:#fff;background-color:#666}ul.s2_blogs li .buttons a:hover{color:#666;background-color:#f5f5f5}ul.s2_blogs div.additional_info{font-style:italic;position:absolute;z-index:9;bottom:2.4em;left:-2px;display:none;width:75%;margin-bottom:2px;padding:.5em 1em;color:#fff;border:1px solid #fff;border-bottom:medium none;-moz-border-radius-topleft:.5em;-moz-border-radius-topright:.5em;background-color:#666}ul.s2_blogs li:hover div.additional_info{display:block}
|
|
Binary file not shown.
Before Width: | Height: | Size: 49 B |
@ -1,674 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
@ -1,98 +0,0 @@
|
|||||||
=== Subscribe2 - Form, Email Subscribers & Newsletters ===
|
|
||||||
Contributors: tareq1988, nizamuddinbabu, wemail
|
|
||||||
Donate link: https://getwemail.io
|
|
||||||
Tags: posts, subscription, email, subscribe, notify, notification, newsletter, post notification, email marketing, optin, form
|
|
||||||
Requires at least: 4.0
|
|
||||||
Tested up to: 5.8
|
|
||||||
Stable tag: 10.36
|
|
||||||
Requires PHP: 5.4
|
|
||||||
License: GPLv3
|
|
||||||
License URI: https://www.gnu.org/licenses/gpl-3.0.html
|
|
||||||
|
|
||||||
Sends a list of subscribers an email notification when you publish new posts.
|
|
||||||
|
|
||||||
== Description ==
|
|
||||||
|
|
||||||
= Summary =
|
|
||||||
|
|
||||||
Subscribe2 provides a comprehensive subscription management and email notification system for WordPress blogs that sends email notifications to a list of subscribers when you publish new content to your blog.
|
|
||||||
|
|
||||||
A full description of features is below.
|
|
||||||
|
|
||||||
= Email =
|
|
||||||
|
|
||||||
Email notifications can be sent on a per-post basis or periodically in a Digest email. Additionally, certain categories can be excluded from inclusion in the notification and posts can be excluded on an individual basis by setting a custom field.
|
|
||||||
|
|
||||||
= Subscriptions =
|
|
||||||
|
|
||||||
Subscription requests allows users to publicly subscribe (**Public Subscribers**) by submitting their email address in an easy to use form or to register with your blog (**Registered Users**) which enables greater flexibility over the email content for per-post notifications for the subscriber. Admins are given control over the presentation of the email notifications, can bulk manage subscriptions for users and manually send email notices to subscribers.
|
|
||||||
|
|
||||||
The format of the email can also be customised for per-post notifications, Subscribe2 can generate emails for each of the following formats:
|
|
||||||
|
|
||||||
* plaintext excerpt.
|
|
||||||
* plaintext full post (Registered Users only).
|
|
||||||
* HTML excerpt (Registered Users only).
|
|
||||||
* HTML full post (Registered Users only).
|
|
||||||
|
|
||||||
If you want to grow your subscriber lists, send automated campaigns to huge subscriber lists, you should upgrade to [weMail](https://getwemail.io).
|
|
||||||
|
|
||||||
|
|
||||||
= Privacy Policy =
|
|
||||||
Subscribe2 uses [Appsero](https://appsero.com) SDK to collect some telemetry data upon user's confirmation. This helps us to troubleshoot problems faster & make product improvements. Learn more about how [Appsero collects and uses this data](https://appsero.com/privacy-policy/).
|
|
||||||
|
|
||||||
== Installation ==
|
|
||||||
|
|
||||||
= AUTOMATIC INSTALLATION =
|
|
||||||
|
|
||||||
1. Log in to your WordPress blog and visit Plugins -> Add New.
|
|
||||||
2. Search for Subscribe2, click "Install Now" and then Activate the Plugin
|
|
||||||
3. Visit the "Subscribe2 -> Settings" menu.
|
|
||||||
4. Configure the options to taste, including the email template and any categories which should be excluded from notification
|
|
||||||
5. Visit the "Subscribe2 -> Subscribers" menu.
|
|
||||||
6. Manually subscribe people as you see fit.
|
|
||||||
7. Create a [WordPress Page](http://codex.wordpress.org/Pages) to display the subscription form. When creating the page, you may click the "S2" button on the QuickBar to automatically insert the Subscribe2 token. Or, if you prefer, you may manually insert the Subscribe2 shortcode or token: [subscribe2] or the HTML invisible `<!--subscribe2-->` ***Ensure the token is on a line by itself and that it has a blank line above and below.***
|
|
||||||
This token will automatically be replaced by dynamic subscription information and will display all forms and messages as necessary.
|
|
||||||
8. In the WordPress "Settings" area for Subscribe2 select the page name in the "Appearance" section that of the WordPress page created in step 7.
|
|
||||||
|
|
||||||
= MANUAL INSTALLATION =
|
|
||||||
|
|
||||||
1. Copy the entire /subscribe2/ directory into your /wp-content/plugins/ directory.
|
|
||||||
2. Activate the plugin.
|
|
||||||
3. Visit the "Subscribe2 -> Settings" menu.
|
|
||||||
4. Configure the options to taste, including the email template and any categories which should be excluded from notification
|
|
||||||
5. Visit the "Subscribe2 -> Subscribers" menu.
|
|
||||||
6. Manually subscribe people as you see fit.
|
|
||||||
7. Create a [WordPress Page](http://codex.wordpress.org/Pages) to display the subscription form. When creating the page, you may click the "S2" button on the QuickBar to automatically insert the Subscribe2 token. Or, if you prefer, you may manually insert the Subscribe2 shortcode or token: [subscribe2] or the HTML invisible `<!--subscribe2-->` ***Ensure the token is on a line by itself and that it has a blank line above and below.***
|
|
||||||
This token will automatically be replaced by dynamic subscription information and will display all forms and messages as necessary.
|
|
||||||
8. In the WordPress "Settings" area for Subscribe2 select the page name in the "Appearance" section that of the WordPress page created in step 7.
|
|
||||||
|
|
||||||
== Frequently Asked Questions ==
|
|
||||||
|
|
||||||
[Visit FAQ site](https://subscribe2.wordpress.com/support/faqs/)
|
|
||||||
|
|
||||||
== Changelog ==
|
|
||||||
|
|
||||||
= 10.36 (30th September, 2021) =
|
|
||||||
|
|
||||||
* WordPress 5.8 compatibility
|
|
||||||
* Fix form preview on widgets
|
|
||||||
* Fix pop up form
|
|
||||||
* Fix send schedule email options
|
|
||||||
* Fix one click subscription
|
|
||||||
* Fix some PHP warnings
|
|
||||||
|
|
||||||
= 10.35 (15th March, 2021) =
|
|
||||||
|
|
||||||
* Fix {UNSUBLINK} shortcode
|
|
||||||
* WordPress 5.7 compatibility
|
|
||||||
|
|
||||||
= 10.34 (24th August, 2020) =
|
|
||||||
|
|
||||||
* Fix gutenberg script loading issue
|
|
||||||
|
|
||||||
= 10.33 (4th June, 2020) =
|
|
||||||
|
|
||||||
* Bump tested upto version 4.4
|
|
||||||
* Minimum PHP version set to 5.4
|
|
||||||
|
|
||||||
See complete [changelog](https://github.com/weMail/Subscribe2/blob/develop/changelog.txt).
|
|
@ -1,98 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
Plugin Name: Subscribe2
|
|
||||||
Plugin URI: https://getwemail.io
|
|
||||||
Description: Notifies an email list when new entries are posted.
|
|
||||||
Version: 10.36
|
|
||||||
Author: weMail
|
|
||||||
Author URI: https://getwemail.io
|
|
||||||
Licence: GPLv3
|
|
||||||
Text Domain: subscribe2
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Copyright (C) 2020 weDevs (info@getwemail.io)
|
|
||||||
Based on the Original Subscribe2 plugin by
|
|
||||||
Copyright (C) 2005 Scott Merrill (skippy@skippy.net)
|
|
||||||
|
|
||||||
This file is part of Subscribe2.
|
|
||||||
|
|
||||||
Subscribe2 is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
Subscribe2 is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with Subscribe2. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( version_compare( $GLOBALS['wp_version'], '4.4', '<' ) || ! function_exists( 'add_action' ) ) {
|
|
||||||
if ( ! function_exists( 'add_action' ) ) {
|
|
||||||
$exit_msg = __( "I'm just a plugin, please don't call me directly", 'subscribe2' );
|
|
||||||
} else {
|
|
||||||
// Translators: Subscribe2 needs WordPress 4.4 or above, exit if not on a compatible version
|
|
||||||
$exit_msg = sprintf( __( 'This version of Subscribe2 requires WordPress 4.4 or greater. Please update %1$s or use an older version of %2$s.', 'subscribe2' ), '<a href="http://codex.wordpress.org/Updating_WordPress">WordPress</a>', '<a href="https://subscribe2.wordpress.com/subscribe2-html/">Subscribe2</a>' );
|
|
||||||
}
|
|
||||||
exit( esc_html( $exit_msg ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop Subscribe2 being activated site wide on Multisite installs
|
|
||||||
if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
|
|
||||||
require_once ABSPATH . '/wp-admin/includes/plugin.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_plugin_active_for_network( plugin_basename( __FILE__ ) ) ) {
|
|
||||||
deactivate_plugins( plugin_basename( __FILE__ ) );
|
|
||||||
$exit_msg = __( 'Subscribe2 HTML cannot be activated as a network plugin. Please activate it on a site level', 'subscribe2' );
|
|
||||||
exit( esc_html( $exit_msg ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// our version number. Don't touch this or any line below
|
|
||||||
// unless you know exactly what you are doing
|
|
||||||
define( 'S2VERSION', '10.36' );
|
|
||||||
define( 'S2PLUGIN', __FILE__ );
|
|
||||||
define( 'S2PATH', trailingslashit( dirname( __FILE__ ) ) );
|
|
||||||
define( 'S2DIR', trailingslashit( dirname( plugin_basename( __FILE__ ) ) ) );
|
|
||||||
define( 'S2URL', plugin_dir_url( dirname( __FILE__ ) ) . S2DIR );
|
|
||||||
|
|
||||||
// Set maximum execution time to 5 minutes
|
|
||||||
if ( function_exists( 'set_time_limit' ) ) {
|
|
||||||
set_time_limit( 300 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
global $mysubscribe2;
|
|
||||||
|
|
||||||
require_once S2PATH . 'classes/class-s2-core.php';
|
|
||||||
|
|
||||||
if ( is_admin() ) {
|
|
||||||
require_once S2PATH . 'classes/class-s2-admin.php';
|
|
||||||
$mysubscribe2 = new S2_Admin();
|
|
||||||
} else {
|
|
||||||
require_once S2PATH . 'classes/class-s2-frontend.php';
|
|
||||||
$mysubscribe2 = new S2_Frontend();
|
|
||||||
}
|
|
||||||
|
|
||||||
add_action( 'plugins_loaded', array( $mysubscribe2, 's2init' ) );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the plugin tracker
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function subscribe2_init_appsero() {
|
|
||||||
|
|
||||||
if ( ! class_exists( 'Appsero\Client' ) ) {
|
|
||||||
require_once S2PATH . 'include/appsero/src/Client.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
$client = new Appsero\Client( '6c1e710d-aab6-4d4b-b29d-aad2ff773f4c', 'Subscribe2', __FILE__ );
|
|
||||||
$client->insights()->init();
|
|
||||||
}
|
|
||||||
|
|
||||||
subscribe2_init_appsero();
|
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +0,0 @@
|
|||||||
.mceSubscribe2
|
|
||||||
{
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
height: 12px;
|
|
||||||
margin-top: 15px;
|
|
||||||
|
|
||||||
border: 0;
|
|
||||||
border-top: 1px;
|
|
||||||
background: url(../../include/s2-marker.png) center top no-repeat #fff;
|
|
||||||
}
|
|
@ -1,108 +0,0 @@
|
|||||||
/* global tinymce */
|
|
||||||
|
|
||||||
( function() {
|
|
||||||
tinymce.create(
|
|
||||||
'tinymce.plugins.Subscribe2Plugin',
|
|
||||||
{
|
|
||||||
init: function( ed, url ) {
|
|
||||||
var i = 0,
|
|
||||||
pb = '<p><img src="' + url + '/../include/spacer.gif" class="mceSubscribe2 mceItemNoResize" /></p>',
|
|
||||||
cls = 'mceSubscribe2',
|
|
||||||
shortcode = '[subscribe2]',
|
|
||||||
pbreplaced = [],
|
|
||||||
pbreplacedcount,
|
|
||||||
pbRE = new RegExp( /(\[|<!--)subscribe2.*?(\]|-->)/g ),
|
|
||||||
replacer = function( str ) {
|
|
||||||
if ( -1 !== str.indexOf( 'class="mceSubscribe2' ) ) {
|
|
||||||
str = pbreplaced[i];
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Register commands
|
|
||||||
ed.addCommand(
|
|
||||||
'mceSubscribe2',
|
|
||||||
function() {
|
|
||||||
ed.execCommand( 'mceInsertContent', 0, pb );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Register buttons
|
|
||||||
ed.addButton(
|
|
||||||
'subscribe2',
|
|
||||||
{
|
|
||||||
title: 'Insert Subscribe2 Token',
|
|
||||||
image: url + '/../include/s2-button.png',
|
|
||||||
cmd: cls
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// load the CSS and enable it on the right class
|
|
||||||
ed.on(
|
|
||||||
'init',
|
|
||||||
function() {
|
|
||||||
ed.dom.loadCSS( url + '/css/content.css' );
|
|
||||||
|
|
||||||
if ( ed.theme.onResolveName ) {
|
|
||||||
ed.theme.onResolveName.add(
|
|
||||||
function( th, o ) {
|
|
||||||
if ( 'IMG' === o.node.nodeName && ed.dom.hasClass( o.node, cls ) ) {
|
|
||||||
o.name = 'subscribe2';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// create an array of replaced shortcodes so we have additional parameters
|
|
||||||
// then swap in the graphic
|
|
||||||
ed.on(
|
|
||||||
'BeforeSetContent',
|
|
||||||
function( ed ) {
|
|
||||||
pbreplaced = ed.content.match( pbRE );
|
|
||||||
ed.content = ed.content.replace( pbRE, pb );
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// swap back the array of shortcodes to preserve parameters
|
|
||||||
// replace any other instances with the default shortcode
|
|
||||||
ed.on(
|
|
||||||
'PostProcess',
|
|
||||||
function( ed ) {
|
|
||||||
if ( ed.get ) {
|
|
||||||
if ( null !== pbreplaced ) {
|
|
||||||
pbreplacedcount = pbreplaced.length;
|
|
||||||
for ( i = 0; i < pbreplacedcount; i++ ) {
|
|
||||||
ed.content = ed.content.replace( /<img[^>]+>/, replacer );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ed.content = ed.content.replace(
|
|
||||||
/<img[^>]+>/g,
|
|
||||||
function( im ) {
|
|
||||||
if ( -1 !== im.indexOf( 'class="mceSubscribe2' ) ) {
|
|
||||||
im = shortcode;
|
|
||||||
}
|
|
||||||
return im;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
getInfo: function() {
|
|
||||||
return {
|
|
||||||
longname: 'Insert Subscribe2 Token',
|
|
||||||
author: 'Matthew Robinson',
|
|
||||||
authorurl: 'http://subscribe2.wordpress.com',
|
|
||||||
infourl: 'http://subscribe2.wordpress.com',
|
|
||||||
version: tinymce.majorVersion + '.' + tinymce.minorVersion
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Register plugin
|
|
||||||
tinymce.PluginManager.add( 'subscribe2', tinymce.plugins.Subscribe2Plugin );
|
|
||||||
}() );
|
|
@ -1 +0,0 @@
|
|||||||
tinymce.create("tinymce.plugins.Subscribe2Plugin",{init:function(e,n){var t,c=0,i='<p><img src="'+n+'/../include/spacer.gif" class="mceSubscribe2 mceItemNoResize" /></p>',o="mceSubscribe2",s=[],r=new RegExp(/(\[|<!--)subscribe2.*?(\]|-->)/g),u=function(e){return-1!==e.indexOf('class="mceSubscribe2')&&(e=s[c]),e};e.addCommand("mceSubscribe2",function(){e.execCommand("mceInsertContent",0,i)}),e.addButton("subscribe2",{title:"Insert Subscribe2 Token",image:n+"/../include/s2-button.png",cmd:o}),e.on("init",function(){e.dom.loadCSS(n+"/css/content.css"),e.theme.onResolveName&&e.theme.onResolveName.add(function(n,t){"IMG"===t.node.nodeName&&e.dom.hasClass(t.node,o)&&(t.name="subscribe2")})}),e.on("BeforeSetContent",function(e){s=e.content.match(r),e.content=e.content.replace(r,i)}),e.on("PostProcess",function(e){if(e.get){if(null!==s)for(t=s.length,c=0;c<t;c++)e.content=e.content.replace(/<img[^>]+>/,u);e.content=e.content.replace(/<img[^>]+>/g,function(e){return-1!==e.indexOf('class="mceSubscribe2')&&(e="[subscribe2]"),e})}})},getInfo:function(){return{longname:"Insert Subscribe2 Token",author:"Matthew Robinson",authorurl:"http://subscribe2.wordpress.com",infourl:"http://subscribe2.wordpress.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}}),tinymce.PluginManager.add("subscribe2",tinymce.plugins.Subscribe2Plugin);
|
|
@ -1,221 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
trait Shortcode {
|
|
||||||
/* ===== template and filter functions ===== */
|
|
||||||
/**
|
|
||||||
* Display our form; also handles (un)subscribe requests
|
|
||||||
*/
|
|
||||||
public function widget_shortcode( $atts ) {
|
|
||||||
$args = shortcode_atts(
|
|
||||||
array(
|
|
||||||
'hide' => '',
|
|
||||||
'id' => '',
|
|
||||||
'nojs' => 'false',
|
|
||||||
'noantispam' => 'false',
|
|
||||||
'link' => '',
|
|
||||||
'size' => 20,
|
|
||||||
'wrap' => 'true',
|
|
||||||
'widget' => 'false',
|
|
||||||
),
|
|
||||||
$atts
|
|
||||||
);
|
|
||||||
|
|
||||||
// if link is true return a link to the page with the ajax class
|
|
||||||
if ( '1' === $this->subscribe2_options['ajax'] && '' !== $args['link'] && ! is_user_logged_in() ) {
|
|
||||||
$id = '';
|
|
||||||
foreach ( $args as $arg_name => $arg_value ) {
|
|
||||||
if ( ! empty( $arg_value ) && 'link' !== $arg_name && 'id' !== $arg_name ) {
|
|
||||||
if ( 'nojs' === $arg_name ) {
|
|
||||||
$arg_value = 'true';
|
|
||||||
}
|
|
||||||
( '' === $id ) ? $id .= $arg_name . '-' . $arg_value : $id .= ':' . $arg_name . '-' . $arg_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->s2form = '<a href="#" class="s2popup" id="' . esc_attr( $id ) . '">' . esc_html( $args['link'] ) . '</a>' . "\r\n";
|
|
||||||
return $this->s2form;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply filters to button text
|
|
||||||
$unsubscribe_button_value = apply_filters( 's2_unsubscribe_button', __( 'Unsubscribe', 'subscribe2' ) );
|
|
||||||
$subscribe_button_value = apply_filters( 's2_subscribe_button', __( 'Subscribe', 'subscribe2' ) );
|
|
||||||
|
|
||||||
// if a button is hidden, show only other
|
|
||||||
$hide = strtolower( $args['hide'] );
|
|
||||||
if ( 'subscribe' === $hide ) {
|
|
||||||
$this->input_form_action = '<input type="submit" name="unsubscribe" value="' . esc_attr( $unsubscribe_button_value ) . '" />';
|
|
||||||
} elseif ( 'unsubscribe' === $hide ) {
|
|
||||||
$this->input_form_action = '<input type="submit" name="subscribe" value="' . esc_attr( $subscribe_button_value ) . '" />';
|
|
||||||
} else {
|
|
||||||
// both form input actions
|
|
||||||
$this->input_form_action = '<input type="submit" name="subscribe" value="' . esc_attr( $subscribe_button_value ) . '" /> <input type="submit" name="unsubscribe" value="' . esc_attr( $unsubscribe_button_value ) . '" />';
|
|
||||||
}
|
|
||||||
|
|
||||||
// if ID is provided, get permalink
|
|
||||||
$action = '';
|
|
||||||
if ( is_numeric( $args['id'] ) ) {
|
|
||||||
$action = ' action="' . get_permalink( $args['id'] ) . '"';
|
|
||||||
} elseif ( 'home' === $args['id'] ) {
|
|
||||||
$action = ' action="' . get_site_url() . '"';
|
|
||||||
} elseif ( 'self' === $args['id'] ) {
|
|
||||||
// Correct for Static front page redirect behaviour
|
|
||||||
if ( 'page' === get_option( 'show_on_front' ) && is_front_page() ) {
|
|
||||||
$post = get_post( get_option( 'page_on_front' ) );
|
|
||||||
$action = ' action="' . get_option( 'home' ) . '/' . $post->post_name . '/"';
|
|
||||||
} else {
|
|
||||||
$action = '';
|
|
||||||
}
|
|
||||||
} elseif ( $this->subscribe2_options['s2page'] > 0 ) {
|
|
||||||
$action = ' action="' . get_permalink( $this->subscribe2_options['s2page'] ) . '"';
|
|
||||||
}
|
|
||||||
|
|
||||||
// allow remote setting of email in form
|
|
||||||
if ( isset( $_REQUEST['email'] ) ) {
|
|
||||||
$email = $this->sanitize_email( $_REQUEST['email'] );
|
|
||||||
}
|
|
||||||
if ( isset( $_REQUEST['email'] ) && false !== $this->validate_email( $email ) ) {
|
|
||||||
$value = $email;
|
|
||||||
} elseif ( 'true' === strtolower( $args['nojs'] ) ) {
|
|
||||||
$value = '';
|
|
||||||
} else {
|
|
||||||
$value = __( 'Enter email address...', 'subscribe2' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// if wrap is true add paragraph html tags
|
|
||||||
$wrap_text = '';
|
|
||||||
if ( 'true' === strtolower( $args['wrap'] ) ) {
|
|
||||||
$wrap_text = '</p><p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// deploy some anti-spam measures
|
|
||||||
$antispam_text = '';
|
|
||||||
if ( 'true' !== strtolower( $args['noantispam'] ) ) {
|
|
||||||
$antispam_text = '<span style="display:none !important">';
|
|
||||||
$antispam_text .= '<label for="firstname">Leave This Blank:</label><input type="text" id="firstname" name="firstname" />';
|
|
||||||
$antispam_text .= '<label for="lastname">Leave This Blank Too:</label><input type="text" id="lastname" name="lastname" />';
|
|
||||||
$antispam_text .= '<label for="uri">Do Not Change This:</label><input type="text" id="uri" name="uri" value="http://" />';
|
|
||||||
$antispam_text .= '</span>';
|
|
||||||
}
|
|
||||||
|
|
||||||
// get remote IP address
|
|
||||||
$remote_ip = $this->get_remote_ip();
|
|
||||||
|
|
||||||
// form name
|
|
||||||
if ( 'true' === $args['widget'] ) {
|
|
||||||
$form_name = 's2formwidget';
|
|
||||||
} else {
|
|
||||||
$form_name = 's2form';
|
|
||||||
}
|
|
||||||
|
|
||||||
// build default form
|
|
||||||
if ( 'true' === strtolower( $args['nojs'] ) ) {
|
|
||||||
$this->form = '<form name="' . $form_name . '" method="post"' . $action . '><input type="hidden" name="ip" value="' . esc_attr( $_SERVER['REMOTE_ADDR'] ) . '" />' . $antispam_text . '<p><label for="s2email">' . __( 'Your email:', 'subscribe2' ) . '</label><br><input type="email" name="email" id="s2email" value="' . $value . '" size="' . $args['size'] . '" />' . $wrap_text . $this->input_form_action . '</p></form>';
|
|
||||||
} else {
|
|
||||||
$this->form = '<form name="' . $form_name . '" method="post"' . $action . '><input type="hidden" name="ip" value="' . esc_attr( $_SERVER['REMOTE_ADDR'] ) . '" />' . $antispam_text . '<p><label for="s2email">' . __( 'Your email:', 'subscribe2' ) . '</label><br><input type="email" name="email" id="s2email" value="' . $value . '" size="' . $args['size'] . '" onfocus="if (this.value === \'' . $value . '\') {this.value = \'\';}" onblur="if (this.value === \'\') {this.value = \'' . $value . '\';}" />' . $wrap_text . $this->input_form_action . '</p></form>' . "\r\n";
|
|
||||||
}
|
|
||||||
$this->s2form = apply_filters( 's2_form', $this->form, $args );
|
|
||||||
|
|
||||||
if ( isset( $_POST['subscribe'] ) || isset( $_POST['unsubscribe'] ) ) {
|
|
||||||
// anti spam sign up measure
|
|
||||||
if ( ( isset( $_POST['firstname'] ) && '' !== $_POST['firstname'] ) || ( isset( $_POST['lastname'] ) && '' !== $_POST['lastname'] ) || ( isset( $_POST['uri'] ) && 'http://' !== $_POST['uri'] ) ) {
|
|
||||||
// looks like some invisible-to-user fields were changed; falsely report success
|
|
||||||
return $this->confirmation_sent;
|
|
||||||
}
|
|
||||||
$validation = apply_filters( 's2_form_submission', true );
|
|
||||||
if ( true !== $validation ) {
|
|
||||||
return apply_filters( 's2_form_failed_validation', $this->s2form );
|
|
||||||
}
|
|
||||||
global $wpdb;
|
|
||||||
$this->email = $this->sanitize_email( $_POST['email'] );
|
|
||||||
if ( false === $this->validate_email( $this->email ) ) {
|
|
||||||
$this->s2form = $this->s2form . $this->not_an_email;
|
|
||||||
} elseif ( $this->is_barred( $this->email ) ) {
|
|
||||||
$this->s2form = $this->s2form . $this->barred_domain;
|
|
||||||
} else {
|
|
||||||
$this->ip = $_POST['ip'];
|
|
||||||
if ( is_int( $this->lockout ) && $this->lockout > 0 ) {
|
|
||||||
$date = gmdate( 'H:i:s.u', $this->lockout );
|
|
||||||
$ips = $wpdb->get_col( $wpdb->prepare( "SELECT ip FROM $wpdb->subscribe2 WHERE date = CURDATE() AND time > SUBTIME(CURTIME(), %s)", $date ) );
|
|
||||||
if ( in_array( $this->ip, $ips, true ) ) {
|
|
||||||
return __( 'Slow down, you move too fast.', 'subscribe2' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// does the supplied email belong to a registered user?
|
|
||||||
$check = $wpdb->get_var( $wpdb->prepare( "SELECT user_email FROM $wpdb->users WHERE user_email = %s", $this->email ) );
|
|
||||||
if ( null !== $check ) {
|
|
||||||
// this is a registered email
|
|
||||||
$this->s2form = $this->please_log_in;
|
|
||||||
} else {
|
|
||||||
// this is not a registered email
|
|
||||||
// what should we do?
|
|
||||||
if ( isset( $_POST['subscribe'] ) ) {
|
|
||||||
// someone is trying to subscribe
|
|
||||||
// lets see if they've tried to subscribe previously
|
|
||||||
if ( '1' !== $this->is_public( $this->email ) ) {
|
|
||||||
// the user is unknown or inactive
|
|
||||||
$this->add( $this->email );
|
|
||||||
$status = $this->send_confirm( 'add' );
|
|
||||||
// set a variable to denote that we've already run, and shouldn't run again
|
|
||||||
$this->filtered = 1;
|
|
||||||
if ( $status ) {
|
|
||||||
$this->s2form = $this->confirmation_sent;
|
|
||||||
} else {
|
|
||||||
$this->s2form = $this->error;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// they're already subscribed
|
|
||||||
$this->s2form = $this->already_subscribed;
|
|
||||||
}
|
|
||||||
$this->action = 'subscribe';
|
|
||||||
} elseif ( isset( $_POST['unsubscribe'] ) ) {
|
|
||||||
// is this email a subscriber?
|
|
||||||
if ( false === $this->is_public( $this->email ) ) {
|
|
||||||
$this->s2form = $this->s2form . $this->not_subscribed;
|
|
||||||
} else {
|
|
||||||
$status = $this->send_confirm( 'del' );
|
|
||||||
// set a variable to denote that we've already run, and shouldn't run again
|
|
||||||
$this->filtered = 1;
|
|
||||||
if ( $status ) {
|
|
||||||
$this->s2form = $this->confirmation_sent;
|
|
||||||
} else {
|
|
||||||
$this->s2form = $this->error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->action = 'unsubscribe';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this->s2form;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Collect and return the IP address of the remote client machine
|
|
||||||
*/
|
|
||||||
public function get_remote_ip() {
|
|
||||||
$remote_ip = false;
|
|
||||||
|
|
||||||
// In order of preference, with the best ones for this purpose first
|
|
||||||
$address_headers = array(
|
|
||||||
'HTTP_CLIENT_IP',
|
|
||||||
'HTTP_X_FORWARDED_FOR',
|
|
||||||
'HTTP_X_FORWARDED',
|
|
||||||
'HTTP_X_CLUSTER_CLIENT_IP',
|
|
||||||
'HTTP_FORWARDED_FOR',
|
|
||||||
'HTTP_FORWARDED',
|
|
||||||
'REMOTE_ADDR',
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $address_headers as $header ) {
|
|
||||||
if ( array_key_exists( $header, $_SERVER ) ) {
|
|
||||||
// HTTP_X_FORWARDED_FOR can contain a chain of comma-separated
|
|
||||||
// addresses. The first one is the original client. It can't be
|
|
||||||
// trusted for authenticity, but we don't need to for this purpose.
|
|
||||||
$address_chain = explode( ',', $_SERVER[ $header ] );
|
|
||||||
$remote_ip = trim( $address_chain[0] );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $remote_ip;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
<?php
|
|
||||||
if ( ! defined( 'ABSPATH' ) && ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
|
||||||
// Make sure not to call this file directly
|
|
||||||
exit();
|
|
||||||
} else {
|
|
||||||
// Is Subscribe2 HTML active
|
|
||||||
if ( is_plugin_active( 'subscribe2_html/subscribe2.php' ) ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is this WordPressMU or not?
|
|
||||||
if ( isset( $wpmu_version ) || strpos( $wp_version, 'wordpress-mu' ) ) {
|
|
||||||
$s2_mu = true;
|
|
||||||
}
|
|
||||||
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
|
|
||||||
$s2_mu = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $s2_mu ) {
|
|
||||||
global $wpdb;
|
|
||||||
$blogs = $wpdb->get_col( "SELECT blog_id FROM {$wpdb->blogs}" );
|
|
||||||
foreach ( $blogs as $blog ) {
|
|
||||||
switch_to_blog( $blog );
|
|
||||||
s2_uninstall();
|
|
||||||
restore_current_blog();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s2_uninstall();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function s2_uninstall() {
|
|
||||||
global $wpdb;
|
|
||||||
// delete entry from wp_options table
|
|
||||||
delete_option( 'subscribe2_options' );
|
|
||||||
// delete legacy entry from wp-options table
|
|
||||||
delete_option( 's2_future_posts' );
|
|
||||||
// remove and scheduled events
|
|
||||||
wp_clear_scheduled_hook( 's2_digest_cron' );
|
|
||||||
// delete usermeta data for registered users
|
|
||||||
// use LIKE and % wildcard as meta_key names are prepended on WPMU
|
|
||||||
// and s2_cat is appended with category ID integer
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_cat%'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_subscribed'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_format'" );
|
|
||||||
$wpdb->query( "DELETE from $wpdb->usermeta WHERE meta_key LIKE '%s2_autosub'" );
|
|
||||||
// delete any postmeta data that supressed notifications
|
|
||||||
$wpdb->query( "DELETE from $wpdb->postmeta WHERE meta_key = 's2mail'" );
|
|
||||||
|
|
||||||
// drop the subscribe2 table
|
|
||||||
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}subscribe2" );
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user