• Как вывести custom_post_type пост вместо другого custom_post_type поста?

    artzolin
    @artzolin Куратор тега WordPress
    php, WordPress разработка сайтов artzolin.ru
    Вы не совсем правильно используете 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();
    		}
    
    	}
    }


    Последний пример написан без тестов, но работать должен
    Ответ написан
    2 комментария