Перенаправление URL архивной страницы произвольного типа записи на URL страницы
Я хочу, чтобы моя 'архивная страница произвольного типа записи' указывала на обычную Страницу.
Ситуация следующая:
У меня есть Страница
в WordPress с постоянной ссылкой http://myurl.com/galleries
. Эта страница показывает список записей с произвольным типом = vmgallery
. У меня есть пользовательская логика для этой страницы, которая работает нормально.
С другой стороны, эта страница работает как "архивная страница произвольного типа записи", потому что она отображает все записи для данного произвольного типа vmgallery. В настоящее время, если пользователь переходит по адресу http://myurl.com/vmgallery/, WordPress загружает архивную страницу (archive.php), но вместо этого я хочу, чтобы загружалась страница http://myurl.com/galleries
.
Как этого достичь?
У вас есть несколько вариантов.
1. Определение slug архива типа записи при регистрации типа записи
Установив 'has_archive' => 'galleries'
, вы можете определить собственный slug архива для типа записи.
Ознакомьтесь с документацией.
Затем вы можете удалить вашу страницу "galleries" и добавить & настроить файл archive-post_type.php
2. Отключение стандартного архива для типа записи
Отключите архив, установив 'has_archive' => false
, затем оставьте страницу для архива типа записи.
3. Перенаправление запросов архива на вашу страницу
Вы можете настроить постоянное перенаправление запросов стандартного архива на вашу страницу.
function archive_to_custom_archive() {
if( is_post_type_archive( 'post_slug' ) ) {
wp_redirect( home_url( '/galleries/' ), 301 );
exit();
}
}
add_action( 'template_redirect', 'archive_to_custom_archive' );
Я бы сказал, что первый вариант хорош!

Не могли бы вы подсказать, какой вариант будет лучше, если у меня также есть "пользовательская таксономия для этого пользовательского типа записей" (название пользовательской таксономии — 'gallery_categories', пример категории галереи — "auto"). И я хочу, чтобы http://myurl.com/galleries/auto работало так же, как http://myurl.com/galleries. Я хочу, чтобы у них был почти одинаковый код (код должен проверять, является ли это 'galleries' или 'galleries'/xxx, и действовать практически одинаково с небольшими различиями)?

Архив пользовательского типа записей и архив пользовательской таксономии — это разные вещи. Первый вариант всегда хорош, но он не будет работать как http://myurl.com/galleries/auto
Вы не сможете получить результаты для термина auto
. Для этого вам понадобится пользовательский шаблон страницы и перезапись URL, чтобы обрабатывать запрос как http://example.com/page-name/?mytax=auto

Отлично. У меня сработал только третий вариант, потому что мой случай касался перенаправления запроса архива на определённый пост этого типа записи. Поэтому я добавил home_url( '/galleries/some-post-slug' ) внутри метода wp_redirect(), и это сработало. Спасибо

Ниже приведен код для удаления ссылки на архивную страницу, не затрагивая URL отдельной записи. Также вы можете создать страницу с указанным слагом архива.
function dg_custom_post_type_args( $args, $post_type ) {
if ( $post_type === "custom post type" ) {
$args['rewrite'] = array(
'with_front' => false,
'slug' => 'slug here'
);
}
return $args;
}
add_filter( 'register_post_type_args', 'dg_custom_post_type_args', 20, 2 );

Этот код решил мою проблему.
function redirect_cpt_archive() {
if( is_post_type_archive( 'galleries' ) ) {
wp_redirect( home_url( '/galleries/post-url/' ), 301 );
exit();
}
}
add_action( 'template_redirect', 'redirect_cpt_archive' );
В вашем типе записи (custom post type) в файле functions.php
необходимо обновить параметр 'has_archive' => true
.
