npntrX
@npntrX
человек мира

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

Привет! У меня на сайте 2 кастомных типа постов "cases" и "newcases". У "newcases" новый шаблон и контент (в т.ч. контентные поля) и нужно постепенно заменять старые страницы - новыми. Всего у меня 500 "cases" и только 20 "newcases". Как мне заменить первые 20 так, чтобы остались урлы (/%category%/%postname%/)? Я полагал это решаеться простой подменой цикла, но не работает. Вот краткий код, с чем не получалось это сделать. Может кто сталкивался и может меня направить?
global $post;
$post_id = $post->ID;

if( $post_id == 27 ) {
   $my_query = new WP_Query('p=29');
   } else {
   $my_query = new WP_Query('p='.$post_id);
}


function custom_pages_cases( $query ) {
    global $post;
    if ( ! is_admin() && $query->is_main_query() ) {
        $query->set( 'p', 29 );
        return;
    }
}
add_action( 'pre_get_posts', 'custom_pages_cases', 1 );
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
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();
		}

	}
}


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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы