Last active
April 12, 2023 09:37
-
-
Save Bobz-zg/858c008f1d6109132c9b to your computer and use it in GitHub Desktop.
Redirects wordpress posts to new url: site.com/blog/post-name
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Add new rewrite rule | |
*/ | |
function create_new_url_querystring() { | |
add_rewrite_rule( | |
'blog/([^/]*)$', | |
'index.php?name=$matches[1]', | |
'top' | |
); | |
add_rewrite_tag('%blog%','([^/]*)'); | |
} | |
add_action('init', 'create_new_url_querystring', 999 ); | |
/** | |
* Modify post link | |
* This will print /blog/post-name instead of /post-name | |
*/ | |
function append_query_string( $url, $post, $leavename ) { | |
if ( $post->post_type != 'post' ) | |
return $url; | |
if ( false !== strpos( $url, '%postname%' ) ) { | |
$slug = '%postname%'; | |
} | |
elseif ( $post->post_name ) { | |
$slug = $post->post_name; | |
} | |
else { | |
$slug = sanitize_title( $post->post_title ); | |
} | |
$url = home_url( user_trailingslashit( 'blog/'. $slug ) ); | |
return $url; | |
} | |
add_filter( 'post_link', 'append_query_string', 10, 3 ); | |
/** | |
* Redirect all posts to new url | |
* If you get error 'Too many redirects' or 'Redirect loop', then delete everything below | |
*/ | |
function redirect_old_urls() { | |
if ( is_singular('post') ) { | |
global $post; | |
if ( strpos( $_SERVER['REQUEST_URI'], '/blog/') === false) { | |
wp_redirect( home_url( user_trailingslashit( "blog/$post->post_name" ) ), 301 ); | |
exit(); | |
} | |
} | |
} | |
add_filter( 'template_redirect', 'redirect_old_urls' ); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Nice work! I read some people had trouble with post previews when adding this.
I got it working by changing two lines.
on L23 change
if ( $post->post_type != 'post' )
toif ( $post->post_type != 'post' && $post->post_status != 'publish')
and L50 should change from
if ( is_singular('post') )
toif ( is_singular('post') && !is_preview() )