2017-08-26 42 views
2

我有一个Custom Post Type称为书,并且链接是:mywebsite.com/book/mybookname如何在重写URL以排除子弹后删除旧的自定义帖子类型固定链接?

我想改变这一点,以便链接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'); 

如何删除旧的网址是什么?

+0

不知道这事,但你为什么要使用书本 - 西班牙语单词>时,根据您的其他代码你正在使用您的文章类型英文单词LIBRO? – fjoe

+0

你把你试过的代码放在哪里?我想应该增加更多的条件,比如要知道这是网站的管理员或公共部分,页面的类型等。顺便说一句,它是如何打破一切的?错误代码? – Kaddath

+0

fjoe:它是一个西班牙语网站,我在这里使用了书籍,因为我认为如果说英语的人可以很容易地获得帮助,我更容易获得帮助,所以我编辑了它。 Kaddath,我试过的代码是在books_theme_parse_request($ query)中。虐待编辑我的帖子,使其更清晰。它会让它刹车,因为在任何地方显示的书都会变成404错误。我只想要与原始网址的书单是404 – Aschab

回答

2

这不应该是首先发生,所以你不应该试图通过编程来修复它 - 相反,你应该在源代码修复它。尝试找出原因并加以解决。否则,你可以引入其他问题。

一些可能的解决方案,根据不同的病因:

  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固定链接
    当您更新蛞蝓,旧的永久链接仍保存在数据库中。这可能会导致问题,如果你想使用你曾经用过的slu for例子。

    如何做到这一点:
    旧的固定链接存储在表postmeta_wp_old_slugmeta_key。要清除所有的老蛞蝓的,在你的WP数据库运行此查询:
    DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';

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

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

0

基于您的评论你需要接着就是知道如果URL包含/书...请参阅下面的附加剪断-它:

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'); 

当人们提到reference

一关于管理员使用的警告

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

相关问题