, Nick Young * @license GPL-2.0+ * @copyright 2014 Phil Derksen */ // I put the priority to 20 here so it runs after the gce_feed CPT code and we don't get errors add_action( 'init', 'gce_upgrade', 20 ); /** * Main GCE Upgrade function. Call this and branch of from here depending on what we need to do * * @since 2.0.0 */ function gce_upgrade() { $version = get_option( 'gce_version' ); if( ! empty( $version ) ) { // Clear out cache when upgrading no matter the version gce_upgrade_clear_cache(); // Check if under version 2 and run the v2 upgrade if we are if( version_compare( $version, '2.0.0-beta1', '<' ) && false === get_option( 'gce_upgrade_has_run' ) ) { gce_v2_upgrade(); } // Version 2.0.4 upgrade if( version_compare( $version, '2.0.4', '<' ) ) { gce_v204_upgrade(); } // Version 2.0.6 upgrade if( version_compare( $version, '2.0.6', '<' ) ) { gce_v206_upgrade(); } if( version_compare( $version, '2.1.0', '<' ) ) { gce_v210_upgrade(); } } $new_version = Google_Calendar_Events::get_instance()->get_plugin_version(); update_option( 'gce_version', $new_version ); add_option( 'gce_upgrade_has_run', 1 ); } /* * Run the upgrade to version 2.1.0 */ function gce_v210_upgrade() { $q = new WP_Query( 'post_type=gce_feed' ); if( $q->have_posts() ) { while( $q->have_posts() ) { $q->the_post(); $url = get_post_meta( get_the_ID(), 'gce_feed_url', true ); // https://www.google.com/calendar/feeds/umsb0ekhivs1a2ubtq6vlqvcjk%40group.calendar.google.com/public/basic $url = str_replace( 'https://www.google.com/calendar/feeds/', '', $url ); $url = str_replace( '/public/basic', '', $url ); $url = str_replace( '%40', '@', $url ); update_post_meta( get_the_ID(), 'gce_feed_url', $url ); } } } /* * Run the upgrade to version 2.0.6 * * @since 2.0.4 */ function gce_v206_upgrade() { // Update feeds $q = new WP_Query( 'post_type=gce_feed' ); if( $q->have_posts() ) { while( $q->have_posts() ) { $q->the_post(); update_post_meta( get_the_ID(), 'gce_feed_start', '1' ); update_post_meta( get_the_ID(), 'gce_feed_start_interval', 'months' ); update_post_meta( get_the_ID(), 'gce_feed_end', '2' ); update_post_meta( get_the_ID(), 'gce_feed_end_interval', 'years' ); } } } /* * Run the upgrade to version 2.0.4 * * @since 2.0.4 */ function gce_v204_upgrade() { // Update feeds $q = new WP_Query( 'post_type=gce_feed' ); if( $q->have_posts() ) { while( $q->have_posts() ) { $q->the_post(); update_post_meta( get_the_ID(), 'gce_paging', '1' ); update_post_meta( get_the_ID(), 'gce_list_max_num', '7' ); update_post_meta( get_the_ID(), 'gce_list_max_length', 'days' ); update_post_meta( get_the_ID(), 'gce_list_start_offset_num', '0' ); update_post_meta( get_the_ID(), 'gce_list_start_offset_direction', 'back' ); } } // Update widgets $widget = get_option( 'widget_gce_widget' ); if( is_array( $widget ) && ! empty( $widget ) ) { foreach( $widget as $a => $b ) { if( ! is_array( $b ) ) { continue; } foreach( $b as $k => $v ) { $widget[$a]['paging'] = '1'; $widget[$a]['list_max_num'] = '7'; $widget[$a]['list_max_length'] = 'days'; $widget[$a]['list_start_offset_num'] = '0'; $widget[$a]['list_start_offset_direction'] = 'back'; } } update_option( 'widget_gce_widget', $widget ); } } /* * Run the upgrade to version 2.0.0 * * @since 2.0.0 */ function gce_v2_upgrade() { $old_options = get_option( 'gce_options' ); if( false !== $old_options ) { if( ! empty( $old_options ) ) { foreach( $old_options as $key => $value ) { convert_to_cpt_posts( $value ); } } update_widget_feed_ids(); } } /** * Converts the old database options to the new CPT layout for 2.0.0+ * * @since 2.0.0 */ function convert_to_cpt_posts( $args ) { // Setup our new post $post = array( 'post_name' => $args['title'], 'post_title' => $args['title'], 'post_status' => 'publish', 'post_type' => 'gce_feed' ); if( $args['use_builder'] == true ) { $post['post_content'] = $args['builder']; } $post_id = wp_insert_post( $post ); create_cpt_meta( $post_id, $args ); clear_old_transients( $args['id'] ); } /** * Add the CPT post meta based on options set for the old feeds prior to v2 * * @since 2.0.0 */ function create_cpt_meta( $id, $args ) { // Convert the dropdown values to the new values for "Retrieve Events From" switch( $args['retrieve_from'] ) { case 'now': case 'today': $from = 'today'; break; case 'week': $from = 'start_week'; break; case 'month-start': $from = 'start_month'; break; case 'month-end': $from = 'end_month'; break; case 'date': $from = 'custom_date'; break; default: $from = 'start_time'; break; } // Convert the dropdown values to the new values for "Retrieve Events Until" switch( $args['retrieve_until'] ) { case 'now': case 'today': $until = 'today'; break; case 'week': $until = 'start_week'; break; case 'month-start': $until = 'start_month'; break; case 'month-end': $until = 'end_month'; break; case 'date': $until = 'custom_date'; break; default: $until = 'end_time'; break; } $gce_expand_recurring = ( isset( $args['expand_recurring'] ) ? ( $args['expand_recurring'] == 'true' ? '1' : '0' ) : '1' ); // An array to hold all of our post meta ids and values so that we can loop through and add as post meta easily $post_meta_fields = array( 'gce_feed_url' => $args['url'], 'gce_retrieve_from' => $from, 'gce_retrieve_until' => $until, 'gce_retrieve_max' => $args['max_events'], 'gce_date_format' => $args['date_format'], 'gce_time_format' => $args['time_format'], 'gce_cache' => $args['cache_duration'], 'gce_multi_day_events' => ( $args['multiple_day'] != 'false' ? '1' : '0' ), 'gce_display_mode' => 'grid', 'gce_custom_from' => gce_convert_timestamp( $args['retrieve_from_value'] ), 'gce_custom_until' => gce_convert_timestamp( $args['retrieve_until_value'] ), 'old_gce_id' => $args['id'], 'gce_search_query' => ( isset( $args['query'] ) ? $args['query'] : '' ), 'gce_expand_recurring' => $gce_expand_recurring ); if( $args['use_builder'] == 'false' || $args['use_builder'] == false ) { $display_meta = array( 'gce_display_simple' => 1, 'gce_display_start' => $args['display_start'], 'gce_display_start_text' => $args['display_start_text'], 'gce_display_end' => $args['display_end'], 'gce_display_end_text' => $args['display_end_text'], 'gce_display_separator' => $args['display_separator'], 'gce_display_location' => ( $args['display_location'] == 'on' ? '1' : '0' ), 'gce_display_location_text' => $args['display_location_text'], 'gce_display_description' => ( $args['display_desc'] == 'on' ? '1' : '0' ), 'gce_display_description_text' => $args['display_desc_text'], 'gce_display_description_max' => $args['display_desc_limit'], 'gce_display_link' => ( $args['display_link'] == 'on' ? '1' : '0' ), 'gce_display_link_tab' => ( $args['display_link_target'] == 'on' ? '1' : '0' ), 'gce_display_link_text' => $args['display_link_text'] ); $post_meta_fields = array_merge( $post_meta_fields, $display_meta ); } // Loop through each $post_meta_field and add as an entry foreach( $post_meta_fields as $k => $v ) { update_post_meta( $id, $k, $v ); } } function gce_convert_timestamp( $t ) { // mm/dd/yyyy return date( 'm/d/Y', $t ); } /** * Remove the old transient values from the database * * @since 2.0.0 */ function clear_old_transients( $id ) { delete_transient( 'gce_feed_' . $id ); delete_transient( 'gce_feed_' . $id . '_url' ); } /** * Update widget IDs * * @since 2.0.0 */ function update_widget_feed_ids() { $widget = get_option( 'widget_gce_widget' ); if( is_array( $widget ) && ! empty( $widget ) ) { foreach( $widget as $a => $b ) { if( ! is_array( $b ) ) { continue; } foreach( $b as $k => $v ) { if( $k != 'id' ) { continue; } $id = $v; //$multi = str_replace( ' ', '', $v ); $multi = explode( ',', str_replace( ' ', '', $id ) ); if( is_array( $multi ) ) { $new_ids = ''; foreach( $multi as $m ) { $q = new WP_Query( "post_type=gce_feed&meta_key=old_gce_id&meta_value=$m&order=ASC" ); if( $q->have_posts() ) { $q->the_post(); // Set our ID to the old ID if found $m = get_the_ID(); $new_ids .= $m . ','; } } $widget[$a][$k] = substr( $new_ids, 0, -1 ); } else { $q = new WP_Query( "post_type=gce_feed&meta_key=old_gce_id&meta_value=$id&order=ASC" ); if( $q->have_posts() ) { $q->the_post(); // Set our ID to the old ID if found $id = get_the_ID(); } $widget[$a][$k] = $id; } } } update_option( 'widget_gce_widget', $widget ); } } /** * Update widget IDs * * @since 2.0.6.3 */ function gce_upgrade_clear_cache() { // Update feeds $q = new WP_Query( 'post_type=gce_feed' ); if( $q->have_posts() ) { while( $q->have_posts() ) { $q->the_post(); delete_transient( 'gce_feed_' . get_the_ID() ); } } }