我有一个名为Book的Custom Post Type
,链接是:mywebsite.com/book/mybookname
我想更改此设置,以便链接mywebsite.com/mybookname
.
我添加了以下代码来更改链接,它按预期工作:
function books_theme_remove_slug( $post_link, $post, $leavename ) {
if ( 'book' != $post->post_type || 'publish' != $post->post_status ) {
return $post_link;
}
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
return $post_link;
}
add_filter( 'post_type_link', 'books_theme_remove_slug', 10, 3 );
function books_theme_parse_request( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'book', 'page' ) );
}
}
add_action( 'pre_get_posts', 'books_theme_parse_request' );
问题是旧链接(mywebsite.com/book/mybookname
(仍在工作。我想在不破坏当前链接的情况下将该链接转到 404 页面。
我尝试了以下方法,但它破坏了一切:
function books_theme_parse_request( $query ) {
if(isset($query->query['post_type']) && $query->query['post_type'] == 'book'){
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
}
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'book', 'page' ) );
}
}
add_action( 'pre_get_posts', 'books_theme_parse_request' );
如何删除旧网址?
这不应该首先发生,因此您不应该尝试以编程方式修复它 - 相反,您应该在源代码中修复它。尝试确定原因并修复它。否则,您可能会引入其他问题。
一些可能的解决方案,具体取决于原因:
-
刷新你的重写缓存
WordPress不会将重定向写入.htaccess,它使用重写规则来解析url并找到重定向的匹配项。 这意味着,如果您不刷新重写规则,旧链接仍然有效。参考:SarahCoding对"删除旧的永久链接"的回答?
怎么做:
重新保存永久链接将刷新重写规则,但如果这不起作用,有三种方法可以在WordPress
中刷新重写缓存
清除 缓存
如果您安装了缓存插件,则需要清除它们。一些安全插件也使用缓存,例如 Securi。它也可以只是缓存在您的浏览器中。
如何做到:
查看如何在WordPress
中清除缓存删除旧的 WP 永久链接
更新 slug 时,旧的永久链接仍存储在数据库中。例如,如果要使用以前使用的 slug,这可能会导致问题。
怎么做:
旧的永久链接存储在表中,postmeta
meta_key
_wp_old_slug
。要清除所有旧 slug,请在 WP 数据库中运行此查询:DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';
参考马克·戴夫·图曼达对"删除旧的永久链接"的回答?
检查重定向插件如果您使用的是任何重定向插件
,请检查重定向规则,以防其中有任何与您的新 url 冲突的内容。
根据您的评论,您只需要知道网址是否包含/book ...有关添加的截图,请参见下文:
function books_theme_parse_request( $query ) {
global $wp;
$current_url = home_url( $wp->request );
if (strpos($current_url, "/book" == false)) { return; }
if(isset($query->query['post_type']) && $query->query['post_type'] == 'book'){
global $wp_query;
$wp_query->set_404();
status_header( 404 );
get_template_part( 404 ); exit();
}
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'book', 'page' ) );
}
}
add_action( 'pre_get_posts', 'books_theme_parse_request' );
正如人们提到的参考
有关管理员使用情况的警告
此筛选器还可用于影响管理屏幕查询。请务必检查您的修改是否影响您的后期编辑屏幕。例如,仅选中 is_main_query(( 和 is_post_type_archive('movie'( 也会更改 edit.php?post_type=movie 管理屏幕的查询,除非您还检查 !is_admin((