将帖子重定向到Wordpress中的根类别

时间:2018-07-23 12:19:44

标签: php wordpress .htaccess redirect

我的博客文章可以分为多个类别,因此可以从

访问

mywebsite.com/root-category/children-category-A/blog-post

mywebsite.com/root-category/children-category-B/blog-post

我需要一个重定向规则(在htaccess中或使用wp_redirect()函数),该规则始终将博客文章重定向到

mywebsite.com/root-category/blog-post

我的尝试

$category_parent_check = get_the_category(); 
$category_parent_id = $category_parent_check[0]->category_parent;
if ( $category_parent_id != 0 ) {
    $category_parent = get_term( $category_parent_id, 'category' );
    $css_slug = $category_parent->slug;
} else {
    $css_slug = $category_parent_check[0]->slug;
}

if ($css_slug == "root-category") {
  wp_redirect(get_site_url() . "/root-category" . wp_make_link_relative( get_page_link())); exit;
}

我是在single.php中完成此操作的,但我没有想到$css_slug == "root-category"永远都是正确的,并且会导致无休止的重定向。

那我该如何实现呢?

编辑

我的htaccess

<Files xmlrpc.php>
 Order Deny,Allow
 Deny from all
 </Files>
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^root-category/[^/]+/(.+)$ $1/$2 [L,NC,R=301,NE]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

3 个答案:

答案 0 :(得分:1)

由于您希望使用R标志进行完全重定向,因此在主.htaccess 正下方 RewriteEngine On行的单个重定向规则中执行此操作要容易得多:

RewriteEngine On

RewriteRule ^(root-category)/[^/]+/(.+)$ /$1/$2 [L,NC,R=301,NE]

# remaining rules go below this line

请确保在新的浏览器中对此进行测试,以避免旧的缓存。

答案 1 :(得分:0)

请在您的function.php中使用以下代码,因此我认为它将从永久链接中删除子类别。

add_filter( 'post_link', 'my_filter_post_link' );

function my_get_all_child_categories( $category_id ) {

  $subcategories = array();

  $category = get_category( $category_id );
  if ( $category->parent ) {
    $subcategories[] = $category->slug . '/';
    $results = my_get_all_child_categories( $category->parent );
    $subcategories = array_merge( $subcategories, $results );
  }

  return $subcategories;
}

function my_filter_post_link( $permalink, $post, $leavename ) {

  if ( 'post' != get_post_type( $post ) )
    return $permalink;

  switch ( $post->post_type ) {
    case 'post':

      $categories = get_the_category( $post->ID );
      $subcategories = array();

      foreach ( $categories as $category ) {
        $results = my_get_all_child_categories( $category->term_id );
        $subcategories = array_merge( $subcategories, $results );
      }

      $permalink = str_replace( $subcategories, '', $permalink );

      break;
  }

  return $permalink;
}

答案 2 :(得分:0)

通过WordPress管理员,您可以更改博客的单个页面网址:

转到

Settings >> Permalinks 

选择自定义结构单选,然后在文本框中输入此重写规则

/%category%/%postname%/ 

希望它能对您有所帮助。