最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

URL Rewriting if it is a single postredirecting post - post type

programmeradmin1浏览0评论

I have a unique kind of question that I've been wrapping my brain around. Google is penalizing us with duplicate content because you can access our single blog posts both by going to:


as well as :


The option we really want is:


and if a user or googlebot happens to goto:

 

redirect them to:


I know this is a particular situation, but we have many custom post types in our system. So our structure looks like this.




Ideally, what I would like to do is find some kind of filter that logically checks if the post_type is post and redirect:

 

to


I tried modifying the register_post_type for the post object, and adding with_front => false and adding blog to the slug, but that doesn't work.

I was able to add /blog/%postname%/ to the permalink structure, and I was successfully able to have a decent structure going that was working, but I got stuck on the taxonomies. When I went to a taxonomy page, I had to goto:


and:

 

was giving me a 404. So even if I can find a way to make the taxonomies work to where I can do:


that would be awesome! As another side note, I also added with_front to the register_taxonomy, but that was not doing anything either. I even hard flushed the rewrites on all the changes I did.

I know this is a lot, but my brain cannot go any further.. lol

TIA!

Any insight on this?

I have a unique kind of question that I've been wrapping my brain around. Google is penalizing us with duplicate content because you can access our single blog posts both by going to:

http://www.domain/blog/the-post-slug

as well as :

http://www.domain/the-post-slug

The option we really want is:

http://www.domain/blog/the-post-slug

and if a user or googlebot happens to goto:

http://www.domain/the-post-slug 

redirect them to:

http://www.domain/blog/the-post-slug

I know this is a particular situation, but we have many custom post types in our system. So our structure looks like this.

http://www.domain/food/pizza
http://www.domain/ice-cream/strawberry
http://www.domain/fireworks/bottle-rockets

Ideally, what I would like to do is find some kind of filter that logically checks if the post_type is post and redirect:

http://www.domain/the-post-slug 

to

http://www.domain/blog/post-slug

I tried modifying the register_post_type for the post object, and adding with_front => false and adding blog to the slug, but that doesn't work.

I was able to add /blog/%postname%/ to the permalink structure, and I was successfully able to have a decent structure going that was working, but I got stuck on the taxonomies. When I went to a taxonomy page, I had to goto:

http://www.domain/blog/the-taxonomy/flavors

and:

http://www.domain/the-taxonomy/flavors 

was giving me a 404. So even if I can find a way to make the taxonomies work to where I can do:

http://www.domain/the-taxonomy/flavors

that would be awesome! As another side note, I also added with_front to the register_taxonomy, but that was not doing anything either. I even hard flushed the rewrites on all the changes I did.

I know this is a lot, but my brain cannot go any further.. lol

TIA!

Any insight on this?

Share Improve this question asked Nov 8, 2013 at 22:01 Aaron OlinAaron Olin 1811 silver badge3 bronze badges 1
  • 'rewrite' => array( 'with_front' => false ) is your answer, add your taxonomy registration code to your question if it's not working for you. – Milo Commented Nov 8, 2013 at 22:22
Add a comment  | 

1 Answer 1

Reset to default 3

First of all set your permalink structure to /%postname%.

After that add a rewrite rule to rewrite all request like example/blog/postname to the appropriate query:

add_action('init', 'blog_front');

function blog_front() {
  add_rewrite_rule('^blog/([^/]+)/?','index.php?name=$matches[1]','top');
}

Now you have to prevent the duplicate url, sending a 301 redirect when example/postname is requested:

add_action('template_redirect', 'say_hello_to_google');

function say_hello_to_google() {
  if ( is_main_query() && is_single() && ( empty( get_post_type() ) || (get_post_type() === 'post') ) ) {
    if ( strpos( trim( add_query_arg( array() ), '/' ), 'blog' ) !== 0 ) {
      global $post;
      $url = str_replace( $post->post_name, 'blog/' . $post->post_name, get_permalink( $post ) );
      wp_safe_redirect( $url, 301 );
      exit(); 
    }
  }
}

Finally you have to create permalink for your post with 'blog/' in front:

add_filter('the_permalink', 'post_permalink_w_blog');

function post_permalink_w_blog( $link ) {
  global $post;
  if ( $post->post_type === 'post' ) {
    $link = str_replace( $post->post_name, 'blog/' . $post->post_name, get_permalink( $post ) );
  }
  return $link; 
}

Last thing to is flush rewrite rules and... test.


Edit

As @Milo pointed out in comments, all of this can be avoided by setting permalink structure to /blog/%postname% and then use the param 'rewrite' having 'with_front' to false for all CPTs and all taxonomies.

'rewrite' => array( 'with_front' => false )

The problem is that most times, in a average WP install with a lot of CPT and taxonomies, there are chances that some of them are registred via 3rd party plugins... in that case if that plugins register the CPTs/taxonomies not using 'with_front' => false it's a problem and the solution posted above is the last chance.

In addiction I have to say that standard categories and tags are registered with 'with_front' = true, so using this alternative method also standard category and tag must be re-registered with with_front param setted to false.

发布评论

评论列表(0)

  1. 暂无评论