Вы не совсем правильно используете
pre_get_posts
. Вот пример правильной подмены post_type в таксономии:
add_action( 'pre_get_posts', 'custom_pages_cases', 1 );
if ( ! function_exists( 'custom_pages_cases' ) ) {
function custom_pages_cases( $query ) {
// Выходим, если это админ-панель или не основной запрос
if( is_admin() || ! $query->is_main_query() )
return;
if( $query->is_post_type_archive('instructor') || $query->is_tax('instructors') ) {
$query->set( 'post_type', 'trainer' );
}
}
}
Но и это не то, что вам нужно. Вам надо сделать нормальный вывод новых постов и таксономий и настроить редирект со старых на новые с помощью
wp_redirect()
add_action( 'template_redirect', 'rider_redirect_canonical' );
function rider_redirect_canonical() {
if ( is_single() && ( 'instructor' === get_post_type() ) ) {
$post_slug = get_post_field('post_name');
// получаем id записи в другом post_type по текущему слагу
$args = array( 'name' => $post_slug, 'post_type' => 'trainer', 'post_status' => 'publish', 'numberposts' => 1 );
$post_id = get_posts($args)[0]->ID ?: '0';
if ( $post_id != '0' ) {
wp_redirect( get_permalink($post_id), 301 );
exit();
}
}
}
Последний пример написан без тестов, но работать должен