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 = '/(?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'] ); } } }