Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
anisogamete
/
wp-content
/
plugins
/
social-warfare
/
lib
/
utilities
:
SWP_Database_Migration.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /** * The Database updater for Social Warfare 3.0.0. * * This willl either migrate previous options to social_warfare_settings, * or create the new default settings. * * @since 3.0.0 | 08 MAY 2018 | Created * @since 3.0.6 | 14 MAY 2018 | Added local $last_migrated property. * @since 3.1.0 | 13 JUN 2018 | Replaced array bracket notation. * */ class SWP_Database_Migration { /** * This property represents the version during which we last made changes * and therefore want the database migrator to have run up to this version. * * @var string * */ public $last_migrated = '3.0.5'; /** * Checks to see if we are on the most up-to-date database schema. * * If not, runs the migration and updators. * * @since 3.0.0 | 01 MAY 2018 | Created the function * @param void * @return void * */ public function __construct() { /** * We're commenting out the functionality in this file as it has been * over a year and a half since this was needed and 99.9% of sites * should already have been migrated by now. * */ // global $post; // add_action( 'plugins_loaded', array( $this, 'init' ), 100 ); } /** * This function initializes and calls up all the migration methods. * * @since 3.0.0 | 08 MAY 2018 | Created * @param void * @return void * */ public function init() { // Check for and migrate the settings page data. if ( !$this->database_is_migrated() ) { $this->migrate(); } // Initialize the database for new installs. if ( !$this->has_3_0_0_settings() ) { $this->initialize_database(); } // Check for and migrate the post meta fields. if ( !$this->post_meta_is_migrated() ) { $this->update_post_meta(); $this->update_hidden_post_meta(); $this->update_last_migrated(); } $this->debug_parameters(); } /** * Removes sensitive data from otherwise arbitrary data. * * @since 3.5.2 | 28 FEB 2019 | Created. * @param array $options The information to filter. * @return array $options The same but without licenses or tokens. * */ public static function filter_options( $options ) { foreach( $options as $key => $value) { if (strpos( $key, 'license' ) > 0) { unset( $options[$key] ); } if (strpos( $key, 'token' ) > 0) { unset( $options[$key] ); } if (strpos( $key, 'login' ) > 0) { unset( $options[$key] ); } } return $options; } public function print_post_meta() { global $post; if ( !is_object( $post ) ) : wp_die( "There is no post object for this url." ); endif; $meta = get_post_meta( $post->ID ); if ( !$meta ) { $meta = array(); } else { $keys = array(); $swp_meta = array(); foreach ( $meta as $key => $value ) { if ( ( strpos( $key, 'swp_' ) === 0 || ( strpos( $key, '_shares' ) > 0 ) && strpos( $key, '_') === 0 ) ) { //* Everything comes in as an array, pull out the first value. $meta[$key] = $value[0]; } else { //* Only print Social Warfare meta keys. unset( $meta[$key] ); } } ksort( $meta ); } $post_fields = array('author', 'date_gmt', 'title', 'excerpt', 'status', 'type'); foreach( $post_fields as $field ) { $key = "post_$field"; $meta["post_$field"] = $post->$key; } $meta['\$post->ID'] = $post->ID; $meta['post_permalink'] = get_permalink( $post->ID ) ; echo "<pre>", var_export( $meta ), "</pre>"; wp_die(); } /** * * This is a patch. * * Sets the value of all Pages' post_meta `swp_float_location` to 'default'. * * @since 3.4.2 | 12 DEC 2018 | Created * * @param string $post_type The type of posts you want to rest. * @return void * */ public function reset_post_meta_float_location( $post_type ) { global $wpdb; $posts = get_posts(array( 'numberposts' => -1, 'meta_key' => 'swp_float_location', 'meta_value' => 'on', 'post_type' => $post_type )); $count = 0; foreach ($posts as $post) { $changed = update_post_meta( $post->ID, 'swp_float_location', 'default' ); if ($changed) { $count++; } } if ($count) { echo "Success! $count ${post_type}s updated."; } else { echo "No matching posts were found to update."; } wp_die(); } /** * A method to allow for easier debugging of database migration functions. * * The following URL parameters may be used for debugging purposes: * ?swp_debug=get_user_options | Outputs an array of user settings. * ?swp_debug=migrate_db | Runs settings page db migrator. * ?swp_debug=initialize_db | Runs the database initializer. * ?swp_debug=migrate_post_meta | Migrates the post meta fields. * ?swp_debug=get_last_migrated | Outputs the last_updated version number. * ?swp_debug=update_last_migrated | Updates the last_updated version number. * * @since 3.1.0 | 13 JUN 2018 | Created * @param void * @return void */ public function debug_parameters() { global $post, $swp_user_options; // Output an array of user options if called via a debugging parameter. if ( true === SWP_Utility::debug('get_user_options') ) : $options = get_option( 'social_warfare_settings', array() ); $options = SWP_Database_Migration::filter_options( $options ); ksort( $options ); echo "<pre>", var_export( $options ), "</pre>"; wp_die(); endif; // /** // * Output text representation of array of user options if called via a debugging parameter. // * Text is formatted for use with `eval`. // * // * @since 3.5.0 | 14 DEC 2018 | Created. // */ // if ( true === SWP_Utility::debug('get_user_options_raw') ) { // $options = get_option( 'social_warfare_settings', array() ); // die(var_export('return ' . $options . ';')); // } if ( true === SWP_Utility::debug('get_filtered_options') ) : global $swp_user_options; echo "<pre>"; var_export( SWP_Database_Migration::filter_options( $swp_user_options ) ); echo "</pre>"; wp_die(); endif; if ( true == SWP_Utility::debug('get_post_meta') ) : add_action( 'template_redirect', array( $this, 'print_post_meta' ) ); endif; /** * v3.4.1 brought to our attention that the default value for * post meta `swp_float_location` is 'on' instead of 'deafult'. * *This debug paramter has an optional paramter, `post_type`, which defaults to 'page'. * * @since 3.4.2 */ if ( true == SWP_Utility::debug('reset_float_location') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : 'page'; $this->reset_post_meta_float_location( $post_type ); } // Migrate settings page if explicitly being called via a debugging parameter. if ( true === SWP_Utility::debug('migrate_db') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $this->migrate(); } // Initialize database if explicitly being called via a debugging parameter. if ( true === SWP_Utility::debug('initialize_db') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $this->initialize_db(); } // Update post meta if explicitly being called via a debugging parameter. if ( true === SWP_Utility::debug('migrate_post_meta') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $this->update_post_meta(); $this->update_hidden_post_meta(); } // Output the last_migrated status if called via a debugging parameter. if ( true === SWP_Utility::debug('get_last_migrated') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $this->get_last_migrated( true ); } // Update the last migrated status if called via a debugging parameter. if ( true === SWP_Utility::debug('update_last_migrated') ) { if (!current_user_can( 'manage_options' )) { wp_die('You do not have authorization to view this page.'); } $this->update_last_migrated(); } if ( true === SWP_Utility::debug( ( 'delete_plugin_data' ) ) ) { $password = isset($_GET['swp_confirmation']) ? urldecode($_GET['swp_confirmation']) : ''; $user = wp_get_current_user(); if ( !current_user_can( 'manage_options' ) || false == wp_check_password( $password, $user->user_pass, $user->ID) ) { wp_die('You do not have authorization to view this page.'); } global $wpdb; /** * Looks for any post_meta keys that begin with `swp_` OR begin * with `_` AND end with `_shares`. Note that the underscores are * escaped, else they would be interpreted as wildcards. * */ $query = "DELETE FROM {$wpdb->prefix}postmeta WHERE meta_key LIKE '\_%\_shares' OR meta_key LIKE 'swp\_%'"; $message = ''; $results = $wpdb->get_results( $query, ARRAY_N ); if ( $results ) { $message .= 'Deleted plugin postmeta.<br/>'; } $deleted = delete_option('social_warfare_settings'); if ( $deleted ) { $message .= 'Deleted plugin settings.<br/>'; } $deleted = delete_option('swp_registered_options'); if ( $deleted ) { $message .= 'Deleted plugin metadata.<br/>'; } if ( $message ) { $message .= 'All available Social Warfare and Social Warfare - Pro data has been deleted.'; wp_die( $message ); } wp_die('Sorry, there was an error processing the request. If you continue to get this message and need to delete all plugin data, please contact support at https://warfareplugins.com/submit-ticket'); } } /** * Checks to see if Social Warfare < 3.0.0 options exist. * * If these options exist in the databse, we need to move them * from "socialWarfareOptions" to "social_warfare_settings", * then * * @since 3.0.0 | 01 MAY 2018 | Created the function * @param void * @return bool True if migrated, else false. * */ public function database_is_migrated() { $option = get_option( 'social_warfare_settings' , false); return false !== $option; } /** * Checks to see if we have 3.0.0 settings installed or not. * * @since 3.0.0 | 01 MAY 2018 | Created the function * @param void * @return bool True if the 3.0.0 array exists, otherwise false. * */ protected function has_3_0_0_settings() { //* Check to see if the 3.0.0 settings exist. $settings = get_option( 'social_warfare_settings', false ); return is_array( $settings ); } /** * Tries to get an option that uses the old post_meta keynames. * * @since 3.0.0 | 01 MAY 2018 | Created the function * @param void * @return bool True if the old option still exists; false otherwise. * */ public function post_meta_is_migrated() { if( $this->last_migrated !== $this->get_last_migrated() ) { return false; } //* Fetch posts with 2.3.5 metadata. $old_metadata = get_posts( array( 'meta_key' => 'nc_postLocation', 'numberposts' => 1 ) ); return count( $old_metadata ) === 0; } /** * A method for updating the post meta fields. * * @since 3.0.0 | 08 MAY 2018 | Created * @since 3.1.0 | 13 JUN 2018 | Replaced array bracket notations. * @param void * @return void * */ public function update_hidden_post_meta() { global $wpdb; try { set_time_limit(300); } catch (Exception $e) { if ( function_exists( 'error_log' ) ) : error_log($e->getMessage()); endif; } $hidden_map = array( '_googlePlus_shares' => '_google_plus_shares', '_linkedIn_shares' => '_linkedin_shares', 'bitly_link_googlePlus' => '_bitly_link_google_plus', 'bitly_link_linkedIn' => '_bitly_link_linked_in' ); $query = " UPDATE " . $wpdb->prefix . "postmeta SET meta_key = %s WHERE meta_key = %s "; foreach ( $hidden_map as $old_key => $new_key ) { //* Make replacements for the first kind of prefix. $q = $wpdb->prepare( $query, $new_key, $old_key ); $wpdb->query( $q ); } } /** * Replaces 2.3.5 camelCased keys with 3.0.0 standardized snake_cased keys. * * @since 3.0.0 | 01 MAY 2018 | Created the function * @since 3.0.6 | 14 MAY 2018 | Added time limit to prevent very large datasets from timing out. * @param void * @return void * */ public function update_post_meta() { global $wpdb; set_time_limit(300); //* Notice there is no prefix on any of the indices. //* Old code has prefixed these with either "nc_" or "swp_". //* For simplicity's sake, we'll just check each for both. $metadata_map = array( 'ogImage' => 'swp_og_image', 'ogTitle' => 'swp_og_title', 'pinterestImage' => 'swp_pinterest_image', 'customTweet' => 'swp_custom_tweet', 'postLocation' => 'swp_post_location', 'floatLocation' => 'swp_float_location', 'pinterestDescription' => 'swp_pinterest_description', 'twitterID' => 'swp_twitter_id', 'ogDescription' => 'swp_og_description', 'cache_timestamp' => 'swp_cache_timestamp', 'pin_browser_extension' => 'swp_pin_browser_extension', 'pin_browser_extension_location' => 'swp_pin_browser_extension_location', 'pin_browser_extension_url' => 'swp_pin_browser_extension_url', 'totes' => 'total_shares' ); $prefix1 = "nc_"; $prefix2 = "swp_"; $query = " UPDATE " . $wpdb->prefix . "postmeta SET meta_key = %s WHERE meta_key = %s "; foreach ( $metadata_map as $old_key => $new_key ) { //* Make replacements for the first kind of prefix. $q1 = $wpdb->prepare( $query, $new_key, $prefix1 . $old_key ); $results = $wpdb->query( $q1 ); //* And make replacements for the second kind of prefix. $q2 = $wpdb->prepare( $query, $new_key, $prefix2 . $old_key ); $results = $wpdb->query( $q2 ); } } /** * Seeds the database with Social Warfare 3.0.0 default values. * * @since 3.0.0 | 01 MAY 2018 | Created the function * @param void * @return void * */ public function initialize_database() { $defaults = array( 'location_archive_categories' => 'below', 'location_home' => 'none', 'location_post' => 'below', 'location_page' => 'below', 'float_location_post' => 'on', 'float_location_page' => 'off', 'total_shares' => true, 'network_shares' => true, 'twitter_id' => false, 'swp_twitter_card' => true, 'button_shape' => 'flatFresh', 'default_colors' => 'full_color', 'single_colors' => 'full_color', 'hover_colors' => 'full_color', 'float_default_colors' => 'full_color', 'float_single_colors' => 'full_color', 'float_hover_colors' => 'fullColor', 'float_style_source' => true, 'float_size' => 1, 'float_alignment' => 'center', 'button_size' => 1, 'button_alignment' => 'fullWidth', 'transition' => 'slide', 'float_screen_width' => 1100, 'ctt_theme' => 'style1', 'ctt_css' => "", 'twitter_shares' => false, 'floating_panel' => true, 'float_location' => 'bottom', 'float_background_color' => '#ffffff', 'float_button_shape' => 'default', 'float_vertical' => 'center', 'float_button_count' => 5, 'custom_color' => '#000000', 'custom_color_outlines' => '#000000', 'float_custom_color' => '#000000', 'float_custom_color_outlines' => '#000000', 'recover_shares' => false, 'recovery_format' => 'unchanged', 'recovery_protocol' => 'unchanged', 'recovery_prefix' => 'unchanged', 'decimals' => 0, 'decimal_separator' => 'period', 'totals_alignment' => 'total_sharesalt', 'google_analytics' => false, 'bitly_authentication' => false, 'minimum_shares' => 0, 'full_content' => false, 'frame_buster' => false, 'analytics_medium' => 'social', 'analytics_campaign' => 'SocialWarfare', 'swp_click_tracking' => false, 'order_of_icons_method' => 'manual', 'og_post' => 'article', 'og_page' => 'article', 'pinterest_image_location' => 'hidden', 'pin_browser_extension' => false, 'pinterest_fallback' => 'all', 'pinit_toggle' => false, 'pinit_location_horizontal' => 'center', 'pinit_location_vertical' => 'top', 'pinit_min_width' => '200', 'pinit_min_height' => '200', 'pinit_image_source' => 'image', 'pinit_image_description' => 'alt_text', 'utm_on_pins' => false, 'pin_browser_extension' => false, 'pin_browser_extension_location' => 'hidden', 'pinterest_fallback' => 'all', 'float_mobile' => 'bottom', 'force_new_shares' => false, 'cache_method' => 'advanced', 'order_of_icons' => array( 'twitter' => 'twitter', 'linkedIn' => 'linkedin', 'pinterest' => 'pinterest', 'facebook' => 'facebook', 'google_plus' => 'google_plus', ), ); update_option( 'social_warfare_settings', $defaults ); } /** * Map prevous key/value pairs to new keys. * * This also deletes the previous keys once the migration is done. * @since 3.0.0 | 01 MAY 2018 | Created the function * @since 3.1.0 | 13 JUN 2018 | Replaced array bracket notation. * @param void * @return void * */ private function migrate() { $options = get_option( 'socialWarfareOptions', array() ); if ( $options === array() ) : //* The old options do not exist. return; endif; $map = array( //* Options names 'locationSite' => 'location_archive_categories', 'locationHome' => 'location_home', 'totesEach' => 'network_shares', 'totes' => 'total_shares', 'minTotes' => 'minimum_shares', 'visualTheme' => 'button_shape', 'buttonSize' => 'button_size', 'dColorSet' => 'default_colors', 'oColorSet' => 'hover_colors', 'iColorSet' => 'single_colors', 'swDecimals' => 'decimals', 'swp_decimal_separator' => 'decimal_separator', 'swTotesFormat' => 'totals_alignment', 'float' => 'floating_panel', 'floatOption' => 'float_location', 'swp_float_scr_sz' => 'float_screen_width', 'sideReveal' => 'transition', 'floatStyle' => 'float_button_shape', 'floatStyleSource' => 'float_style_source', 'sideDColorSet' => 'float_default_colors', 'sideOColorSet' => 'float_hover_colors', 'sideIColorSet' => 'float_single_colors', 'swp_twitter_card' => 'twitter_cards', 'twitterID' => 'twitter_id', 'pinterestID' => 'pinterest_id', 'facebookPublisherUrl' => 'facebook_publisher_url', 'facebookAppID' => 'facebook_app_id', 'sniplyBuster' => 'frame_buster', 'linkShortening' => 'bitly_authentication', 'cacheMethod' => 'cache_method', 'googleAnalytics' => 'google_analytics', 'analyticsMedium' => 'analytics_medium', 'analyticsCampaign' => 'analytics_campaign', 'advanced_pinterest_image' => 'pin_browser_extension', 'advanced_pinterest_image_location' => 'pinterest_image_location', 'pin_browser_extension_location' => 'pin_browser_extension_location', 'advanced_pinterest_fallback' => 'pinterest_fallback', 'recovery_custom_format' => 'recovery_permalink', 'cttTheme' => 'ctt_theme', 'cttCSS' => 'ctt_css', 'sideCustomColor' => 'single_custom_color', 'floatBgColor' => 'float_background_color', 'orderOfIconsSelect' => 'order_of_icons_method', 'newOrderOfIcons' => 'order_of_icons', ); $value_map = array( 'flatFresh' => 'flat_fresh', 'threeDee' => 'three_dee', 'fullColor' => 'full_color', 'lightGray' => 'light_gray', 'mediumGray' => 'medium_gray', 'darkGray' => 'dark_gray', 'lgOutlines' => 'light_gray_outlines', 'mdOutlines' => 'medium_gray_outlines', 'dgOutlines' => 'dark_gray_outlines', 'colorOutlines' => 'color_outlines', 'customColor' => 'custom_color', 'ccOutlines' => 'custom_color_outlines', 'totesAlt' => 'totals_right', 'totesAltLeft' => 'totals_left', 'buttonFloat' => 'button_alignment', 'post' => 'location_post', 'page' => 'location_page', 'float_vertical'=> 'float_alignment', 'fullWidth' => 'full_width', 'floatLeftMobile' => 'float_mobile', ); $migrations = array(); foreach( $options as $old => $value ) { //* The order of icons used to be stored in an array at 'active'. if ( is_array( $value) && array_key_exists( 'active', $value) ) : $new_value = $value; //* Filter out the booleans and integers. elseif ( is_string( $value ) ): $new_value = array_key_exists($value, $value_map) ? $value_map[$value] : $value; else : $new_value = $value; endif; //* Specific case: newOrderOfIcons mapping. if ( 'newOrderOfIcons' === $old ) : if ( array_key_exists( 'googlePlus', $new_value ) ) : unset( $new_value['googlePlus'] ); $new_value[] = 'google_plus'; endif; if (array_key_exists( 'linkedIn', $new_value) ) : unset( $new_value['linkedIn'] ); $new_value[] = 'linkedin'; endif; endif; //* Specific case: customColor mapping. if ( $old === 'customColor' ) : $migrations['custom_color'] = $new_value; $migrations['custom_color_outlines'] = $new_value; // If the float style source is set to inherit the style from the static buttons. if ( $options['floatStyleSource'] == true ) : $migrations['float_custom_color'] = $new_value; $migrations['float_custom_color_outlines'] = $new_value; endif; endif; // Only if the source is set to not inherit them from the static buttons. if ( $old === 'sideCustomColor' ) : $migrations['float_custom_color'] = $new_value; $migrations['float_custom_color_outlines'] = $new_value; endif; if ( array_key_exists( $old, $map) ) : //* We specified an update to the key. $new = $map[$old]; $migrations[$new] = $new_value; else : //* The previous key was fine, keep it. $migrations[$old] = $new_value; endif; } //* Manually adding these in as short term solution. if ( !isset( $migrations['float_size'] ) ) : $migrations['float_size'] = '1'; endif; if ( !isset( $migrations['float_location'] ) ) : $migrations['float_location'] = 'bottom'; endif; if ( !isset( $migrations['float_alignment'] ) ) : $migrations['float_alignment'] = 'center'; endif; $custom_colors = array( 'custom_color', 'custom_color_outlines', 'float_custom_color', 'float_custom_color_outlines' ); foreach( $custom_colors as $color ) { if ( !isset($migrations[$color] ) ) : $migrations[$color] = "#333333"; endif; } $removals = array( 'dashboardShares', 'rawNumbers', 'notShowing', 'visualEditorBug', 'loopFix', 'locationrevision', 'locationattachment', ); foreach ( $removals as $trash ) : if ( ( $migrations[$trash] ) ) : unset($migrations[$trash]); endif; endforeach; update_option( 'social_warfare_settings', $migrations ); //* Play it safe for now. //* Leave socialWarfareOptions in the database. // delete_option( 'socialWarfareOptions' ); } /** * Get Last Migrated * * This method gets the version number during which the last migration was * run. This allows us to increment a version if we need a part of this class * to run again. * * @since 3.0.0 | Created | 08 MAY 2018 * @param boolean $echo True echoes the data; False returns it. * @return mixed (str) Version number if found, (bool) false if not found. * */ public function get_last_migrated( $echo = false ) { $options = get_option( 'social_warfare_settings' ); if ( array_key_exists( 'last_migrated', $options ) ) : if ( true === $echo ) : var_dump( $options['last_migrated'] ); endif; return $options['last_migrated']; endif; if ( true === $echo ) : echo "No previous migration version has been set."; endif; return false; } /** * A method to update the last migrated version number. * * @since 3.0.0 | Created | 08 MAY 2018 * @param null * @return void * */ public function update_last_migrated() { $options = get_option( 'social_warfare_settings' ); $options['last_migrated'] = $this->last_migrated; update_option( 'social_warfare_settings', $options ); } }