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

时间:2017-08-26 14:53:50

标签: php wordpress

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

如何删除旧网址?

2 个答案:

答案 0 :(得分:3)

这不应该首先发生,所以你不应该尝试以编程方式修复它 - 而是你应该在源头修复它。尝试找出原因并修复它。否则你可能会引入其他问题。

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

  1. 刷新重写缓存
    Wordpress不会将重定向写入.htaccess,它使用rewrite rules来解析URL并找到重定向的匹配项。 这意味着如果您不刷新重写规则,旧链接仍然有效。 参考:SarahCoding's answer to 'Remove Old Permalinks?'

    如何操作: 重新保存您的固定链接将刷新重写规则,但如果那里不起作用是Three Ways to Flush the Rewrite Cache in WordPress

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

    如何操作:
    请参阅How to Clear Your Cache in WordPress

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

    如何操作:
    旧的固定链接存储在表postmeta中,meta_key_wp_old_slug。要清除所有旧slugs,请在WP数据库中运行此查询:
    DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';

    参考Mark Dave Tumanda's answer to 'Remove Old Permalinks?'

  4. 检查重定向插件
    如果您使用任何重定向插件,请检查重定向规则,以防有任何与您的新网址冲突的情况。

答案 1 :(得分:0)

根据您的评论,您只需要知道网址是否包含/预订...请参阅下面的添加片段:

extern "C"
    {
        const char * _importString()
        {
            UIPasteboard *result = [UIPasteboard generalPasteboard];
            NSString * resultString = [result string];
            return strdup([resultString UTF8String]);
        }
    }

正如人们提到reference

关于管理员使用的警告

此过滤器还可用于影响管理员屏幕查询。请务必检查您的修改是否会影响您的帖子编辑屏幕。例如,只检查is_main_query()和is_post_type_archive(' movie')也将更改edit.php?post_type = movie admin屏幕的查询,除非您还检查!is_admin()