Как удалить постоянную ссылку старого пользовательского типа сообщений после перезаписи URL-адреса, чтобы исключить пул?

У меня есть Custom Post Type называемый Book, а ссылка: 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' ); 

Как удалить старый URL-адрес?

Это не должно происходить в первую очередь, поэтому вы не должны пытаться исправить это программно – вместо этого вы должны исправить это в источнике. Попытайтесь определить причину и исправить ее. В противном случае вы можете ввести другие проблемы в линию.

Некоторые возможные решения, в зависимости от причины:

  1. Очистить кеш повторной записи
    WordPress не пишет перенаправления в .htaccess, он использует правила перезаписи для анализа URL-адреса и поиска соответствия для перенаправления. Это означает, что если вы не обновите свои правила перезаписи, старые ссылки все еще работают. Ссылка: ответ SarahCoding на «Удалить старые постоянные ссылки?»

    Как это сделать:
    Повторное сохранение ваших постоянных ссылок приведет к сбросу правил перезаписи, но если это не сработает, есть три способа сброса кэша перезаписи в WordPress

  2. Очистить кеш
    Если у вас установлены плагины для кеширования, их нужно будет очистить. Некоторые плагины безопасности также используют кеширование, например Securi. Его также можно просто кэшировать в вашем браузере.

    Как это сделать:
    См. Как очистить кеш в WordPress

  3. Удалить старые WP permalinks
    Когда вы обновляете slug, старые константы всегда сохраняются в базе данных. Это может вызвать проблемы, если вы хотите использовать пул, который вы ранее использовали, например.

    Как это сделать:
    Старые постоянные ссылки сохраняются в таблице postmeta с помощью meta_key _wp_old_slug . Чтобы очистить все старые пули, запустите этот запрос в базе данных WP:
    DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';

    Ответ Марка Дейва Туманды на «Удалить старые постоянные ссылки?»

  4. Проверить плагины перенаправления
    Если вы используете какие-либо плагины перенаправления, проверьте правила перенаправления в случае, если есть что-то, что сталкивается с вашими новыми URL-адресами.

Основываясь на вашем комментарии, все, что вам нужно, это знать, содержит ли url / book … см. Ниже для добавленного snip-it:

 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 admin, если вы также не проверите! Is_admin ()