テンプレートをカスタム投稿タイプに割り当てることはできますか?


35

テンプレートファイルをカスタム投稿タイプに割り当てることはできますか?

というカスタムの投稿タイプを作成しましたitems。ページでできるように、アイテムにテンプレートを割り当てたいと思います。


wpbeginner.com/wp-themes/…(これは投稿用ですが、CPT用に変更できます)nathanrice.net/blog/wordpress-single-post-templates(これは投稿用ですが、CPT用に変更できます)実際にはプラグインをお勧めします。
ワイク

回答:


50

WordPressバージョン4.7から、カスタムページテンプレートをページとともに他の投稿タイプに割り当てることができるようになりました。

テンプレート名ファイルのヘッダーに加えてこれを実現するために、テンプレートでサポートされる投稿タイプは、次のようにテンプレート投稿タイプを使用して指定できます。

<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/

詳細については、次のページで入手できます。

https://wptavern.com/wordpress-4-7-brings-custom-page-template-functionality-to-all-post-types https://make.wordpress.org/core/2016/11/03/post -type-templates-in-4-7 /


21

次のようなファイルを作成して、カスタム投稿タイプのテンプレートを作成できます。

single-mycustomposttype.php

コーデックスのテンプレート階層を参照してください。

PS:これはすでに回答済みです。


2
ありがとうございますが、カスタムテンプレートをカスタム投稿タイプに追加できるかどうかを知りたいと思います。たとえば、2つのテンプレートを作成して、各テンプレートをそれぞれの投稿に割り当てることはできますか?私が理解する限り、その特定の投稿タイプを処理するテンプレートファイルを1つだけ指定することができます。
Odyss3us

単一の投稿に異なるテンプレートが必要な場合は、必要なテンプレートごとに複数のカスタム投稿タイプを作成することをお勧めします。これは、必要なテンプレートの数に依存すると思います。各投稿で異なる必要があるテンプレートで何をしますか?
mike23

この回答は現在古くなっています。Vinod Dalviの回答を参照してください。
サイモンイースト

8

ここに私のために働くものがあります:

add_filter('single_template', function($original){
  global $post;
  $post_name = $post->post_name;
  $post_type = $post->post_type;
  $base_name = 'single-' . $post_type . '-' . $post_name . '.php';
  $template = locate_template($base_name);
  if ($template && ! empty($template)) return $template;
  return $original;
});

したがって、カスタム投稿タイプの投稿foobarhello-world上記のコードのスラッグが与えられた場合、single-foobar-hello-world.phpテンプレートが存在する場合はロードされます。


4

Googleを介してこのスレッドにアクセスする人のために、WP 4.7はすべての投稿タイプのテンプレートを導入しました。完全なチュートリアルについては、WPコアの作成を参照してください。すべてのCPTで1つのテンプレートに制限されることはなくなりました。Pagesでできるように、投稿ごとに個別のテンプレートを割り当てることができます。


2

これは少し古いですが、これを試すこともできます:

カスタム投稿タイプのテンプレートを作成します。

single-*custom-post-type-slug*.php

ファイルはスラッグをチェックし、ファイルが存在するかどうかを確認し、存在しない場合はデフォルトのテンプレートファイルにフォールバックします。

<?php 
    $slug = get_post_field( 'post_name', get_post() );
    $slug = ( locate_template( 'templates/*custom-post-type-slug*/' . $slug . '.php' ) ) ? $slug : 'default';

    get_template_part( 'templates/*custom-post-type-slug*/' . $slug  );
?>

custom-post-type-slugのすべてのインスタンスを、カスタム投稿タイプの実際のスラッグに置き換えます。

これは使いやすさと組織化の目的で行います。テーマのルートフォルダーにすべてのファイルを置くよりも、私にはわかりやすいようです。

フォルダー構造の例:

themeroot
| |single-cases.php
|-templates
| --cases
|   |default.php
|   |case-one.php
|   |case-two.php

1

以下のようにテンプレートファイルを1つ作成し、そのtemplate-itemsという名前を付けるよりも、最初に、アイテムの投稿タイプのコンテンツを表示する、必要に応じてItemsという名前のページに作成します。作成したページのテンプレートを選択します。

<div class="container">

    <div class="row">

        <div class="col-md-9">
            <div class="panel panel-default text-center">
                <?php $loop = new WP_Query( array( 'post_type' => 'items', 'posts_per_page' => 5 ) ); ?>                        

                        <?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
                            <?php the_title();?>
                            <?php if(has_post_thumbnail() ) { the_post_thumbnail(); } ?>
                            <?php the_content();?>
                        <?php endwhile; ?>

                <?php wp_reset_query(); ?>                      
            </div>
        </div>

    </div>

</div>

1

これは非常に簡単です。

テーマルートディレクトリに新しいPHPファイルを作成し、これを一番上に追加します。

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>

完全な例は次のとおりです。

<?php /*
 * Template Name: My custom view
 * Template Post Type: Post_typename   // here you need to add the name of your custom post type
 */ ?>
<?php get_header();?>


<div class="container pt-5 pb-5">


    <?php if (has_post_thumbnail()):?>

      <img src="<?php the_post_thumbnail_url('largest');?>" class="img-fluid">

    <?php endif;?>




    <?php if (have_posts()) : while (have_posts()) : the_post();?>

        <?php the_content();?>

    <?php endwhile; endif;?>


</div>

<?php get_footer();?>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.