query( "UPDATE {$wpdb->postmeta} SET meta_key='_series_name' WHERE meta_key='series_name'"); $wpdb->query( "UPDATE {$wpdb->postmeta} SET meta_key='_series_order' WHERE meta_key='series_order'"); } /** * Initializes/upgrades the In Series options */ function initialize_options() { $in_series_opts = get_option('in_series'); $value = InSeriesInit::get_default_options(); if(empty($in_series_opts)) { $desc = __('Determines how In Series stores and displays series data', 'in_series'); add_option('in_series', $value, $desc); } else { InSeriesInit::do_2_2_to_3_0_option_convert(); // Refresh the options $in_series_opts = get_option('in_series'); // Merge any missing (new, and with no backwards-mapping) options foreach($value as $key => $item) { if(empty($in_series_opts["$key"])) { $in_series_opts["$key"] = $item; } } update_option("in_series", $in_series_opts); } } /** * Returns the default options for the current version. */ function get_default_options() { // %title - Post title // %series - Series name // %url - A permalink url to the appropriate post // %prev - The previous link // %next - The next link // %toc - The table of contents // %content - The contents of the post // %entries - Recurring entries $value = array(); $prev_text = __("Previous in series", "in_series"); $next_text = __("Next in series", "in_series"); $toc_header = __("Table of contents for %series", "in_series"); $value['in_series_version'] = '3.0'; $value['format_next'] = "{$next_text}"; $value['format_prev'] = "{$prev_text}"; $value['format_toc_block'] = "

{$toc_header}

    %entries
"; $value['format_toc_entry'] = "
  • %title
  • "; $value['format_toc_active_entry'] = "
  • %title
  • "; $value['format_post'] = "
    %toc
    %content "; $value['format_series_list_block'] = "
    "; $value['format_series_list_entry'] = "
  • %series
  • "; $value['meta_links'] = true; return $value; } /** * Convert the 2.2 option information to the new 3.0 format. */ function do_2_2_to_3_0_option_convert() { $in_series_opts = get_option('in_series'); // We can handle only version 2.2 data. if(empty($in_series_opts) || $in_series_opts['in_series_version'] != '2.2') { return; } //$value['in_series_version'] = '2.2'; $in_series_opts['in_series_version'] = '3.0'; //$value['meta_links'] = empty($series); //(no conversion needed) //$value['title_prefix'] = false; //(no conversion needed) //$value['toc'] = empty($series); if(!$in_series_opts['toc']) { $in_series_opts['format_toc_block'] = ""; } unset($in_series_opts['toc']); //$value['single_view_links'] = empty($series); //(no conversion) unset($in_series_opts['single_view_links']); //$value['multi_view_links'] = empty($series); //(no conversion) unset($in_series_opts['multi_veiw_links']); //$value['toc_title'] = __('Article Series - %series', 'in_series'); $in_series_opts['format_toc_block'] = "

    {$in_series_opts['toc_title']}

      %entries
    "; unset($in_series_opts['toc_title']); //$value['toc_position'] = 'bottom'; if($in_series_opts['toc_position'] == 'bottom') { $in_series_opts['format_post'] = "%content
    %toc
    "; } unset($in_series_opts['toc_position']); //$value['prev_text'] = __('Previous in series', 'in_series'); $in_series_opts['format_prev'] = "{$in_series_opts['prev_text']}"; unset($in_series_opts['prev_text']); //$value['next_text'] = __('Next in series', 'in_series'); $in_series_opts['format_next'] = "{$in_series_opts['next_text']}"; unset($in_series_opts['next_text']); update_option('in_series', $in_series_opts); } /** * Create the new tables for the 3.0.6 version of the series metadata. */ function initialize_3_0_6_database() { global $wpdb; $series_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_series"); $entries_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_entries"); $auth_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_auth"); if(!InSeriesInternal::has_table($series_table_name)) { $wpdb->query(" CREATE TABLE {$series_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, owner_id BIGINT(20) UNSIGNED NOT NULL, series_name VARCHAR(250), INDEX (series_name(25)) )"); } if(!InSeriesInternal::has_table($entries_table_name)) { $wpdb->query(" CREATE TABLE {$entries_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL, post_id BIGINT(20) UNSIGNED NOT NULL, next_post_id BIGINT(20) UNSIGNED, prev_post_id BIGINT(20) UNSIGNED, CONSTRAINT PRIMARY KEY (series_id,post_id), INDEX (post_id) )"); } if(!InSeriesInternal::has_table($auth_table_name)) { $wpdb->query(" CREATE TABLE {$auth_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL, author_id BIGINT(20) UNSIGNED NOT NULL, CONSTRAINT PRIMARY KEY (series_id,author_id) )"); } } /** * Convert the old 3.0 series metadata to the new 3.0.6 format. */ function do_3_0_to_3_0_6_metadata_convert() { global $wpdb; $old_series_table_name = InSeriesInternal::get_table_name("in_series_3_0_series"); $old_entries_table_name = InSeriesInternal::get_table_name("in_series_3_0_entries"); $old_auth_table_name = InSeriesInternal::get_table_name("in_series_3_0_auth"); $series_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_series"); $entries_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_entries"); $auth_table_name = InSeriesInternal::get_table_name("in_series_3_0_6_auth"); if(InSeriesInternal::has_table($old_series_table_name)) { $wpdb->query(" INSERT INTO {$series_table_name} (series_id,owner_id,series_name) SELECT series_id,owner_id,series_name FROM {$old_series_table_name}"); $wpdb->query(" DROP TABLE {$old_series_table_name}"); } if(InSeriesInternal::has_table($old_entries_table_name)) { $wpdb->query(" INSERT INTO {$entries_table_name} (series_id,post_id,next_post_id,prev_post_id) SELECT series_id,post_id,next_post_id,prev_post_id FROM {$old_entries_table_name}"); $wpdb->query(" DROP TABLE {$old_entries_table_name}"); } if(InSeriesInternal::has_table($old_auth_table_name)) { $wpdb->query(" INSERT INTO {$auth_table_name} (series_id,author_id) SELECT series_id,author_id FROM {$old_auth_table_name}"); $wpdb->query(" DROP TABLE {$old_auth_table_name}"); } } /** * Create the new tables for the 3.0 version of the series metadata. */ function initialize_3_0_database() { global $wpdb; $series_table_name = InSeriesInternal::get_table_name("in_series_3_0_series"); $entries_table_name = InSeriesInternal::get_table_name("in_series_3_0_entries"); $auth_table_name = InSeriesInternal::get_table_name("in_series_3_0_auth"); if(!InSeriesInternal::has_table($series_table_name)) { $wpdb->query(" CREATE TABLE {$series_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, owner_id BIGINT(20) UNSIGNED NOT NULL, series_name VARCHAR(250) )"); } if(!InSeriesInternal::has_table($entries_table_name)) { $wpdb->query(" CREATE TABLE {$entries_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL, post_id BIGINT(20) UNSIGNED NOT NULL, next_post_id BIGINT(20) UNSIGNED, prev_post_id BIGINT(20) UNSIGNED )"); } if(!InSeriesInternal::has_table($auth_table_name)) { $wpdb->query(" CREATE TABLE {$auth_table_name} ( series_id BIGINT(20) UNSIGNED NOT NULL, author_id BIGINT(20) UNSIGNED NOT NULL )"); } } /** * Convert the old 2.1/2.2 series metadata to the new 3.0 format. */ function do_2_x_to_3_0_metadata_convert() { global $wpdb; $series_table = InSeriesInternal::get_series_table_name(); $entries_table = InSeriesInternal::get_entry_table_name(); // Get all of the defined series names. $all_series = $wpdb->get_col(" SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key='_series_name' GROUP BY meta_value"); if(empty($all_series)) { return; } // Process each series name foreach($all_series as $series_name) { // Get all the post IDs that are tied to this series name $all_posts_of_series = $wpdb->get_col(" SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_series_name' AND meta_value='{$series_name}'"); // Convert the array of post IDs to a SQL list $all_posts_of_series = implode(",", $all_posts_of_series); // Generate a list of authors who have a series named $series_name $authors = $wpdb->get_col(" SELECT post_author FROM {$wpdb->posts} WHERE ID IN ({$all_posts_of_series}) GROUP BY post_author"); // Process a discrete series (author + series name) foreach($authors as $author) { // Pick out the ordered list of posts that constitute a series $posts = $wpdb->get_col(" SELECT post_id,meta_value FROM {$wpdb->posts} JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id WHERE {$wpdb->postmeta}.meta_key = '_series_order' AND {$wpdb->posts}.post_author = '{$author}' AND {$wpdb->postmeta}.post_id IN ({$all_posts_of_series}) ORDER BY CAST({$wpdb->postmeta}.meta_value AS SIGNED)"); // Create the series $wpdb->query("INSERT INTO {$series_table} VALUES (DEFAULT,'{$author}','{$series_name}')"); $series_id = $wpdb->get_var(" SELECT series_id FROM {$series_table} WHERE series_name='{$series_name}' AND owner_id='{$author}' ORDER BY series_id DESC LIMIT 1"); // Add the entries to the series $prev = "NULL"; $curr = "NULL"; foreach($posts as $next) { if($curr != "NULL") { // ($prev can be NULL) $wpdb->query("INSERT INTO {$entries_table} VALUES ('{$series_id}','{$curr}','{$next}',{$prev})"); } $prev = $curr; $curr = $next; } // ($prev can be NULL) $wpdb->query("INSERT INTO {$entries_table} VALUES ('{$series_id}','{$curr}',NULL,{$prev})"); } } // Conversion complete. Remove the old metadata. $wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE meta_key='_series_order' OR meta_key='_series_name'"); } } ?>