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 %prev %next
";
$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
%prev %next
";
}
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'");
}
}
?>