在我们之前的文章《register_post_type后的permalink固定链接和register_meta_box_cb问题》中,我们已经提到过新的post_type注册后链接不能访问的处理办法。但post_type文章的固定链接形式其实只能是/post_type/post_name的形式,而不能成为post_type/post_id形式,可是我们常常希望某种特殊文章只用post_id来作为访问地址,例如产品、书籍等。
这个问题再wordpress的讨论版中已经被讨论过,请看这里看看他们都在怎么讨论。经过总结,实现这一方法在这篇文章已经解决。
最后的代码如下:
add_action('init', 'post-type_rewrite'); function post-type_rewrite() { global $wp_rewrite; $queryarg = 'post_type=post-type&p='; $wp_rewrite->add_rewrite_tag('%post_id%', '([^/]+)', $queryarg); $wp_rewrite->add_permastruct('post-type', '/post-type/%post_id%', false); } add_filter('post_type_link', 'post-type_permalink', 1, 3); function post-type_permalink($post_link, $id = 0, $leavename, $sample) { global $wp_rewrite; $post = &get_post($id); if ( is_wp_error( $post ) )return $post; $newlink = $wp_rewrite->get_extra_permastruct('bodumanzaru'); $newlink = str_replace("%post_id%", $post->ID, $newlink); $newlink = home_url(user_trailingslashit($newlink)); return $newlink; }
不过可惜的是,这段代码基本可以解决只有一个post_type的情况,而如果规定了几个post_type的话,就会导致每一个post_type的开头都是post-type,但实际我们希望每个post_type都可以自己定义自己的URL。现在有一个问题是,我只希望product采用post_id作为访问路径,那么,我们将后面的函数写成下面这个样子。
add_filter('post_type_link','my_product_permalink'); function my_site_permalink($post_link, $id = 0, $leavename = false, $sample = false) { global $wp_rewrite; $post = &get_post($id); if($post->post_type == 'product'){ if ( is_wp_error( $post ) )return $post; $newlink = $wp_rewrite->get_extra_permastruct('product'); $newlink = str_replace("%post_id%",$post->ID,$newlink); $newlink = home_url(user_trailingslashit($newlink)); return $newlink; }else{ return $post_link; } }
即在里面添加了一个if($post->post_type == 'product')的判断,而如果需要规定其他post_type的URL规则,则可以再增加if判断字句。总之,这种问题总归是要解决的。
本站专注研究WordPress,你可以看看以前的文章,即可了解我的开发路程
博主果然是技术党哈!