Создание страницы 'single' для Произвольного Типа Записей

27 апр. 2012 г., 00:25:03
Просмотры: 157K
Голосов: 9

Хорошо, я установил плагин 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; ?> 

Во-первых, когда я кликаю на миниатюру, в браузере появляется ошибка о том, что происходит циклическое перенаправление, а во-вторых, я хотел бы точно знать, какие файлы мне нужно создать для просмотра отдельной записи этого произвольного типа записей. И что нужно поместить в этот файл.

2
Комментарии

чувак, мой сайт не открывается в single.php. Помогите, пожалуйста.

Washington Luiz Washington Luiz
23 мар. 2021 г. 16:29:11

@WashingtonLuiz Я преобразовал ваш ответ в комментарий, не публикуйте новые вопросы в разделе решений. К сожалению, эту проблему нужно дополнительно отлаживать, и она не подходит для раздела ответов. Я рекомендую задать ваш вопрос на Форуме WordPress.

Tom J Nowell Tom J Nowell
23 мар. 2021 г. 17:00:05
Все ответы на вопрос 4
0
21

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

Кстати, у вас есть пробел в аргументе post_type, что может вызвать проблемы.

Ознакомьтесь с Иерархией шаблонов и рассмотрите возможность регистрации ваших CPT с помощью кода в плагине, вместо использования плагина для создания CPT.

27 апр. 2012 г. 00:48:56
3

Нет необходимости, так как 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();
10 апр. 2015 г. 12:46:48
Комментарии

и куда поместить файл single-cpt.php?

Eliut Islas Eliut Islas
9 окт. 2020 г. 23:14:49

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

Brad Dalton Brad Dalton
19 апр. 2021 г. 15:58:43

Что делать, если у меня нет доступа к папке темы и мне нужно управлять всем через плагин?

Mohal Mohal
25 нояб. 2021 г. 18:55:13
5

Вы можете просто вставить этот код в ваш файл 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, как в примере выше...

27 апр. 2012 г. 00:46:52
Комментарии

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

Tom J Nowell Tom J Nowell
27 апр. 2012 г. 01:01:20

Можешь объяснить, почему это плохая практика?

Starfs Starfs
27 апр. 2012 г. 15:34:28

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

Tom J Nowell Tom J Nowell
27 апр. 2012 г. 18:01:08

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

Tom J Nowell Tom J Nowell
27 апр. 2012 г. 18:02:00

Круто. Я изменил код в своей теме, чтобы использовать этот новый метод для вывода пользовательских типов записей. Спасибо за информацию

Starfs Starfs
30 апр. 2012 г. 21:00:13
0

Пользовательский тип записи в 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; ?>

Это пример пользовательского типа записи со страницей отдельной записи.

10 апр. 2015 г. 09:20:56