重写 URL 以排除 slug 后,如何删除旧的自定义帖子类型永久链接?



我有一个名为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' );

如何删除旧网址?

这不应该首先发生,因此您不应该尝试以编程方式修复它 - 相反,您应该在源代码中修复它。尝试确定原因并修复它。否则,您可能会引入其他问题。

一些可能的解决方案,具体取决于原因:

  1. 刷新你的重写缓存
    WordPress不会将重定向写入.htaccess,它使用重写规则来解析url并找到重定向的匹配项。 这意味着,如果您不刷新重写规则,旧链接仍然有效。参考:SarahCoding对"删除旧的永久链接"的回答?

    怎么做:
    重新保存永久链接将刷新重写规则,但如果这不起作用,有三种方法可以在WordPress
     中刷新重写缓存

  2. 清除
  3. 缓存
    如果您安装了缓存插件,则需要清除它们。一些安全插件也使用缓存,例如 Securi。它也可以只是缓存在您的浏览器中。

    如何做到:
    查看如何在WordPress
     
    中清除缓存

  4. 删除旧的 WP 永久链接
    更新 slug 时,旧的永久链接仍存储在数据库中。例如,如果要使用以前使用的 slug,这可能会导致问题。

    怎么做:
    旧的永久链接存储在表中,postmetameta_key_wp_old_slug。要清除所有旧 slug,请在 WP 数据库中运行此查询:
    DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';

    参考马克·戴夫·图曼达对"删除旧的永久链接"的回答?
     

  5. 检查重定向插件
  6. 如果您使用的是任何重定向插件
    ,请检查重定向规则,以防其中有任何与您的新 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((

最新更新