ฉันสามารถกำหนดไฟล์เทมเพลตให้กับประเภทโพสต์ที่กำหนดเองได้หรือไม่
ฉันสร้างประเภทโพสต์แบบกำหนดเองที่เรียกว่าitems
และฉันต้องการกำหนดเทมเพลตให้กับรายการอย่างที่คุณสามารถทำได้กับเพจ
ฉันสามารถกำหนดไฟล์เทมเพลตให้กับประเภทโพสต์ที่กำหนดเองได้หรือไม่
ฉันสร้างประเภทโพสต์แบบกำหนดเองที่เรียกว่าitems
และฉันต้องการกำหนดเทมเพลตให้กับรายการอย่างที่คุณสามารถทำได้กับเพจ
คำตอบ:
จาก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 /
คุณสามารถสร้างเทมเพลตสำหรับประเภทโพสต์ที่กำหนดเองโดยการสร้างไฟล์เช่น:
single-mycustomposttype.php
ดูลำดับชั้นของแม่แบบใน codex
PS : นี้ได้แล้วรับการตอบรับ
นี่คือสิ่งที่ใช้ได้กับฉัน:
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
แม่แบบถ้ามันมีอยู่
สำหรับผู้ที่มาถึงหัวข้อนี้ผ่านทาง Google WP 4.7 ได้แนะนำเทมเพลตสำหรับโพสต์ทุกประเภท ดูMake WP Coreสำหรับคำแนะนำแบบเต็ม คุณไม่ได้ถูก จำกัด เพียงหนึ่งเทมเพลตสำหรับ CPT ทั้งหมดของคุณคุณสามารถกำหนดโพสต์เทมเพลตแต่ละรายการได้โดยโพสต์เช่นเดียวกับที่คุณทำได้กับเพจ
นี่เก่าไปหน่อย แต่คุณสามารถลองทำสิ่งนี้ได้:
สร้างเทมเพลตสำหรับประเภทโพสต์ที่กำหนดเอง:
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
สร้างครั้งแรกในหน้าชื่อเป็นรายการตามที่คุณต้องการซึ่งแสดงเนื้อหาจากประเภทโพสต์รายการมากกว่าสร้างไฟล์เทมเพลตหนึ่งไฟล์ด้านล่างและตั้งชื่อเทมเพลตรายการนั้น เลือกเทมเพลตนั้นสำหรับเพจที่คุณสร้าง
<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>
มันง่ายมากที่จะทำ
สร้างไฟล์ 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();?>
เราหาวิธีแก้ปัญหาอื่นโดยใช้ปลั๊กอินเทมเพลตโพสต์ที่กำหนดเอง