設定>パーマリンク設定でカスタム構造を/%postname%/
から/news/%category%/%postname%/
に変更した時に投稿ページが404になるので、下記をfunctions.phpに記述。slugの値を探してリダイレクトしてる。
固定ページもリダイレクトされないようにするのが地味に大変だった。ついでにカテゴリーページにつく/category/
を削除する記述も追記してる。
カテゴリーページの下層に、そのカテゴリーの投稿ページを置くことで、カテゴリーページのSEOを強くするのが目的。
/*
redirect single post
*/
add_action( 'template_redirect', 'redirect_single_post_url' );
function redirect_single_post_url() { if( is_404() ){ global $wp; //x $url = get_permalink(); // 空文字列だ $url = home_url( $wp->request ); $url_arr = explode('/', $url); // delete empty array values $url_arr=array_filter($url_arr, function($value) { return !is_null($value) && $value !== ''; }); //slug set last array value $post_slug = array_pop($url_arr); $args = array( 'name' => $post_slug, 'post_type' => 'post', 'post_status' => 'publish', 'numberposts' => 1 ); $my_posts = get_posts($args); if( $my_posts ) { $post_id = $my_posts[0]->ID; echo $url_new = get_permalink($post_id); wp_safe_redirect( $url_new, 301 ); }else{ wp_safe_redirect( home_url( '/' ), 301 ); } exit(); }
}
/* no category setting (don't work wpml and yoast not category setting)
*/
function remcat_function($link) {
return str_replace("/category/", "/", $link);
}
add_filter('user_trailingslashit', 'remcat_function');
function remcat_flush_rules() {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
add_action('init', 'remcat_flush_rules');
function remcat_rewrite($wp_rewrite) {
$new_rules = array('(.+)/page/(.+)/?' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2));
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'remcat_rewrite');