Создание страницы 'single' для Произвольного Типа Записей
Хорошо, я установил плагин Custom Post Type UI и создал произвольный тип записей. Затем я добавил в него новую запись. В моей теме есть такой код:
<?php
$loop = new WP_Query( array(
'post_type' => 'case studies', /* измените эту строку */
'posts_per_page' => 15 ) );
?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" >
<?php the_post_thumbnail('thumbnail'); ?>
</a>
<?php endwhile; ?>
Во-первых, когда я кликаю на миниатюру, в браузере появляется ошибка о том, что происходит циклическое перенаправление, а во-вторых, я хотел бы точно знать, какие файлы мне нужно создать для просмотра отдельной записи этого произвольного типа записей. И что нужно поместить в этот файл.

Используйте single-{posttype}.php
для шаблона одиночной записи. Также, если вы регистрируете свой тип записи с аргументом has_archive
, установленным в true
, то можете использовать archive-{posttype}.php
для шаблона архива, что позволит избежать дополнительного запроса, так как глобальный объект $wp_query
уже будет содержать записи вашего пользовательского типа.
Кстати, у вас есть пробел в аргументе post_type
, что может вызвать проблемы.
Ознакомьтесь с Иерархией шаблонов и рассмотрите возможность регистрации ваших CPT с помощью кода в плагине, вместо использования плагина для создания CPT.

Нет необходимости, так как WordPress будет использовать шаблон страницы по умолчанию, однако вы можете создать собственный файл single-cpt.php, где cpt — это название вашего зарегистрированного типа записи.
<?php
get_header(); ?>
<div id="main-content" class="main-content">
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php
// Начало цикла.
while ( have_posts() ) : the_post();
// Подключение шаблона содержимого страницы.
get_template_part( 'content', 'page' );
endwhile;
?>
</div><!-- #content -->
</div><!-- #primary -->
</div><!-- #main-content -->
<?php
get_sidebar();
get_footer();

В папку дочерней темы, где cpt — это название вашего пользовательского типа записи.

Вы можете просто вставить этот код в ваш файл single.php (внутри цикла) и выводить нужные поля внутри условного оператора.
if($post_type == 'case_studies') { // возможно, вам нужно будет убрать пробелы (машинное имя)
echo '<h1>'.get_the_title().' flavors</h1>';
// ID записи
$post_id = get_the_ID();
get_post_meta($post_id, 'custom_field_name', true);
<a href="<?php the_permalink() ?>"><?php the_post_thumbnail(); ?></a>
<?php endwhile; ?>
}
Другой вариант - создать шаблон страницы. Скопируйте ваш файл single.php и переименуйте его в case_studies.php ... вверху внутри php-тегов добавьте:
<?php
/*
Template Name: Brand Output 04/12
*/
?>
а затем добавьте тот же условный оператор внутри цикла single.php, как в примере выше...

Это работает, но это очень плохая практика, ближайшее, что вам стоит использовать — это get_template_part('stuff',$post->post_type);

Потому что это грязный код с кучей условных операторов if else и дублированием кода. Лучше создать шаблонный файл типа 'content.php' и использовать get_template_part('content',$post_type);
, а затем переопределять его для каждого типа записи с помощью файлов типа content-case_studies.php
.

Таким образом ваш single.php остаётся читаемым. Даже в этом случае лучше делать это правильно и использовать single-case_studies.php

Пользовательский тип записи в WordPress. Четыре основных шага.
Шаг 1: Расположение файла: theme/function.php в вашей теме. Вставьте код в function.php (регистрация пользовательского типа записи)
<?php
add_action( 'init', 'custom_post_type_func' );
function custom_post_type_func() {
//posttypename = services
$labels = array(
'name' => _x( 'Услуги', 'services' ),
'singular_name' => _x( 'Услуга', 'services' ),
'add_new' => _x( 'Добавить новую', 'services' ),
'add_new_item' => _x( 'Добавить новую услугу', 'services' ),
'edit_item' => _x( 'Редактировать услугу', 'services' ),
'new_item' => _x( 'Новая услуга', 'services' ),
'view_item' => _x( 'Просмотреть услугу', 'services' ),
'search_items' => _x( 'Искать услуги', 'services' ),
'not_found' => _x( 'Услуги не найдены', 'services' ),
'not_found_in_trash' => _x( 'Услуги не найдены в корзине', 'services' ),
'parent_item_colon' => _x( 'Родительская услуга:', 'services' ),
'menu_name' => _x( 'Услуги', 'services' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Привет, это мой пользовательский тип записи.',
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'page-attributes' ),
'taxonomies' => array( 'category', 'post_tag', 'page-category' ),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => true,
'capability_type' => 'post'
);
register_post_type( 'services', $args );
}
?>
Шаг 2: Как отобразить пользовательский тип записи WordPress в шаблоне страницы?
Вы можете отобразить в любом месте шаблона страницы следующим образом:
<?php $args = array( 'post_type' => 'services', 'posts_per_page' => 20 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post(); ?>
<div class="services-items">
<?php the_title();
if ( has_post_thumbnail( $post->ID ) ) {
echo '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( $post->post_title ) . '">';
echo get_the_post_thumbnail( $post->ID, 'thumbnail' );
echo '</a>'; }
?>
</div>
<?php endwhile; ?>
Шаг 3: Создайте новый шаблон для отображения отдельной записи, например:
single-{имя пользовательского типа записи}.php
или
single-services.php
Шаг 4: Вставьте код в файл single-services.php
<?php /* Цикл */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="main-post-div">
<div class="single-page-post-heading">
<h1><?php the_title(); ?></h1>
</div>
<div class="content-here">
<?php the_content(); ?>
</div>
<div class="comment-section-here"
<?php //comments_template(); ?>
</div>
</div>
<?php endwhile; ?>
Это пример пользовательского типа записи со страницей отдельной записи.
