ฉันสามารถกำหนดเทมเพลตให้กับประเภทโพสต์ที่กำหนดเองได้หรือไม่


35

ฉันสามารถกำหนดไฟล์เทมเพลตให้กับประเภทโพสต์ที่กำหนดเองได้หรือไม่

ฉันสร้างประเภทโพสต์แบบกำหนดเองที่เรียกว่าitemsและฉันต้องการกำหนดเทมเพลตให้กับรายการอย่างที่คุณสามารถทำได้กับเพจ


wpbeginner.com/wp-themes/ ...... (สำหรับโพสต์นี้ แต่คุณสามารถแก้ไขได้สำหรับ CPT) nathanrice.net/blog/wordpress-single-post-templates (สำหรับโพสต์ แต่คุณสามารถแก้ไขสำหรับ CPT ได้) มันเป็น ความคิดที่ดีสำหรับปลั๊กอินจริง
Wyck

คำตอบ:


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 ประเภทแม่แบบใน 4-7 /


21

คุณสามารถสร้างเทมเพลตสำหรับประเภทโพสต์ที่กำหนดเองโดยการสร้างไฟล์เช่น:

single-mycustomposttype.php

ดูลำดับชั้นของแม่แบบใน codex

PS : นี้ได้แล้วรับการตอบรับ


2
ขอบคุณสำหรับสิ่งนั้น แต่สิ่งที่ฉันอยากรู้คือถ้าเป็นไปได้ที่จะเพิ่มเทมเพลตที่กำหนดเองให้กับประเภทโพสต์ที่กำหนดเอง ตัวอย่างเช่นฉันสามารถสร้างสองแม่แบบและกำหนดแต่ละแม่แบบให้เป็นโพสต์นั้น ๆ ได้หรือไม่ นั่นช่วยให้สามารถระบุไฟล์เทมเพลตหนึ่งไฟล์เพื่อจัดการโพสต์ประเภทนั้น ๆ เท่าที่ฉันเข้าใจได้
Odyss3us

คือดูว่าถ้าคุณต้องการเทมเพลตที่แตกต่างกันสำหรับการโพสต์เดี่ยวคุณอาจต้องการสร้างโพสต์ที่กำหนดเองหลายประเภทตามแต่ละเทมเพลตที่จำเป็น ฉันเดาว่าขึ้นอยู่กับจำนวนเทมเพลตที่คุณต้องการ คุณจะทำอะไรในเทมเพลตที่ต้องแตกต่างกันในแต่ละโพสต์
mike23

คำตอบนี้ล้าสมัยแล้ว ดูคำตอบของ Vinod Dalvi
Simon East

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;
});

ดังนั้นการกำหนดโพสต์ของประเภทโพสต์ที่กำหนดเองfoobarและกระสุนของhello-worldรหัสดังกล่าวจะโหลดsingle-foobar-hello-world.phpแม่แบบถ้ามันมีอยู่


4

สำหรับผู้ที่มาถึงหัวข้อนี้ผ่านทาง Google WP 4.7 ได้แนะนำเทมเพลตสำหรับโพสต์ทุกประเภท ดูMake WP Coreสำหรับคำแนะนำแบบเต็ม คุณไม่ได้ถูก จำกัด เพียงหนึ่งเทมเพลตสำหรับ CPT ทั้งหมดของคุณคุณสามารถกำหนดโพสต์เทมเพลตแต่ละรายการได้โดยโพสต์เช่นเดียวกับที่คุณทำได้กับเพจ


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  );
?>

แทนที่อินสแตนซ์ที่กำหนดเองประเภทโพสต์ทั้งหมดด้วยกระสุนจริงของประเภทโพสต์ที่กำหนดเองของคุณ

ฉันทำสิ่งนี้เพื่อความสะดวกในการใช้งานและวัตถุประสงค์ขององค์กร ดูเหมือนว่าฉันจะสะอาดกว่าการมีไฟล์ทั้งหมดในโฟลเดอร์รูทของธีม

โครงสร้างโฟลเดอร์ตัวอย่าง:

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

1

สร้างครั้งแรกในหน้าชื่อเป็นรายการตามที่คุณต้องการซึ่งแสดงเนื้อหาจากประเภทโพสต์รายการมากกว่าสร้างไฟล์เทมเพลตหนึ่งไฟล์ด้านล่างและตั้งชื่อเทมเพลตรายการนั้น เลือกเทมเพลตนั้นสำหรับเพจที่คุณสร้าง

<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.