Remember old post slugs and automatically redirect to the new slug. fixes #3202

git-svn-id: http://svn.automattic.com/wordpress/trunk@4556 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
markjaquith 2006-11-30 08:48:56 +00:00
parent 9af8606115
commit 42529f4516
5 changed files with 87 additions and 1 deletions

View File

@ -2069,6 +2069,43 @@ function wp_reset_vars( $vars ) {
}
}
function wp_check_for_changed_slugs($post_id) {
if ( !strlen($_POST['wp-old-slug']) )
return $post_id;
$post = &get_post($post_id);
// we're only concerned with published posts
if ( $post->post_status != 'publish' || $post->post_type != 'post' )
return $post_id;
// only bother if the slug has changed
if ( $post->post_name == $_POST['wp-old-slug'] )
return $post_id;
$old_slugs = get_post_meta($post_id, '_wp_old_slug');
// if we haven't added this old slug before, add it now
if ( !count($old_slugs) || !in_array($_POST['wp-old-slug'], $old_slugs) )
add_post_meta($post_id, '_wp_old_slug', $_POST['wp-old-slug']);
// if the new slug was used previously, delete it from the list
if ( in_array($post->post_name, $old_slugs) )
delete_post_meta($post_id, '_wp_old_slug', $post->post_name);
return $post_id;
}
function wp_remember_old_slug() {
global $post;
$name = wp_specialchars($post->post_name); // just in case
if ( strlen($name) )
echo '<input type="hidden" id="wp-old-slug" name="wp-old-slug" value="' . $name . '" />';
}
// If siteurl or home changed, reset cookies and flush rewrite rules.
function update_home_siteurl( $old_value, $value ) {
global $wp_rewrite, $user_login, $user_pass_md5;

View File

@ -175,6 +175,9 @@ function upgrade_all() {
if ( $wp_current_db_version < 3845 )
upgrade_210();
if ( $wp_current_db_version < 4351 )
upgrade_old_slugs();
$wp_rewrite->flush_rules();
update_option('db_version', $wp_db_version);
@ -544,6 +547,13 @@ function upgrade_210() {
}
}
function upgrade_old_slugs() {
// upgrade people who were using the Redirect Old Slugs plugin
global $wpdb;
$wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'");
}
// The functions we use to actually do stuff
// General

View File

@ -146,6 +146,11 @@ add_filter('option_blog_charset', 'wp_specialchars');
add_filter('mce_plugins', '_mce_load_rtl_plugin');
add_filter('mce_buttons', '_mce_add_direction_buttons');
// Redirect Old Slugs
add_action('template_redirect', 'wp_old_slug_redirect');
add_action('edit_post', 'wp_check_for_changed_slugs');
add_action('edit_form_advanced', 'wp_remember_old_slug');
// Actions
add_action('wp_head', 'rsd_link');
add_action('wp_head', 'locale_stylesheet');

View File

@ -1116,6 +1116,40 @@ class WP_Query {
}
}
// Redirect old slugs
function wp_old_slug_redirect () {
global $wp_query;
if ( is_404() && '' != $wp_query->query_vars['name'] ) :
global $wpdb;
$query = "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND meta_key = '_wp_old_slug' AND meta_value='" . $wp_query->query_vars['name'] . "'";
// if year, monthnum, or day have been specified, make our query more precise
// just in case there are multiple identical _wp_old_slug values
if ( '' != $wp_query->query_vars['year'] )
$query .= " AND YEAR(post_date) = '{$wp_query->query_vars['year']}'";
if ( '' != $wp_query->query_vars['monthnum'] )
$query .= " AND MONTH(post_date) = '{$wp_query->query_vars['monthnum']}'";
if ( '' != $wp_query->query_vars['day'] )
$query .= " AND DAYOFMONTH(post_date) = '{$wp_query->query_vars['day']}'";
$id = (int) $wpdb->get_var($query);
if ( !$id )
return;
$link = get_permalink($id);
if ( !$link )
return;
wp_redirect($link, '301'); // Permanent redirect
exit;
endif;
}
//
// Private helper functions
//

View File

@ -3,6 +3,6 @@
// This holds the version number in a separate file so we can bump it without cluttering the SVN
$wp_version = '2.1-alpha3';
$wp_db_version = 4350;
$wp_db_version = 4351;
?>