วิธีการเชื่อมต่อเทมเพลตเก็บถาวรที่กำหนดเองสำหรับประเภทบทความ WordPress ที่แตกต่างกัน

อ่าน 3 นาที
2026-03-18
2026-06-04
2,072
I earn commissions when you shop through the links below, at no additional cost to you.

โครงสร้างลำดับชั้นของเทมเพลต WordPress เป็นหัวใจสำคัญของความยืดหยุ่นและประสิทธิภาพ ซึ่งช่วยให้นักพัฒนาสามารถสร้างหน้าจอแสดงผลที่เฉพาะเจาะจงสำหรับประเภทเนื้อหาต่างๆ ผ่านกฎการตั้งชื่อไฟล์ที่กำหนดไว้ สำหรับหน้าจัดเก็บถาวร (หรือหน้ารายการบทความ) กลไกนี้ก็มีประสิทธิภาพและชัดเจนเช่นเดียวกัน การทำความเข้าใจและนำ archive-{post_type}.php กฎการตั้งชื่อนี้ไปใช้อย่างถูกต้อง เป็นกุญแจสำคัญในการสร้างหน้ารายการเฉพาะสำหรับประเภทบทความที่กำหนดเอง บทความนี้จะอธิบายอย่างเป็นระบบ ตั้งแต่หลักการไปจนถึงการปฏิบัติ และกระบวนการตรวจสอบปัญหาแบบครบวงจร

การทำความเข้าใจลำดับชั้นเทมเพลตและกลไกหน้าจัดเก็บถาวร

เมื่อผู้ใช้เข้าชมหน้าลิสต์บทความ เช่น หน้าแรกของบล็อกหรือหน้าไดเรกทอรีหมวดหมู่ WordPress จะเริ่มกระบวนการที่เรียกว่า “การค้นหาหลัก” เพื่อดึงบทความที่เกี่ยวข้อง พร้อมกันนั้น ตามบริบทของการค้นหาปัจจุบัน มันจะค้นหาไฟล์เทมเพลต PHP ที่ตรงกันมากที่สุดตามลำดับความสำคัญที่กำหนดเพื่อแสดงผลหน้าเว็บ ลำดับนี้เรียกว่า “ลำดับชั้นของเทมเพลต”

สำหรับหน้าการจัดเก็บข้อมูล เส้นทางการค้นหามีรูปแบบที่ชัดเจน สมมติว่าผู้ใช้เข้าชมหน้าการจัดเก็บข้อมูลประเภท “บทความ” เริ่มต้น WordPress จะค้นหา:archive-post.php -> archive.php -> index.phpตราบใดที่พบไฟล์แรกที่มีอยู่ ก็จะใช้ไฟล์นั้น

แนะนำให้อ่าน เชี่ยวชาญ WordPress ประเภทบทความที่กำหนดเอง: คู่มือปฏิบัติฉบับสมบูรณ์ตั้งแต่การสร้างจนถึงการเผยแพร่

แกนกลางของกลไกนี้อยู่ที่ archive-{post_type}.php。ที่นี่ {post_type} เป็นตัวแปรที่ต้องแทนที่ด้วยชื่อลงทะเบียนประเภทบทความ ตัวอย่างเช่น หากต้องการสร้างหน้าอาร์ไคฟ์สำหรับประเภทบทความที่กำหนดเองชื่อ “โครงการ” ก็จำเป็นต้องมีไฟล์ชื่อ archive-project.php หากไฟล์นี้ไม่มีอยู่ WordPress จะย้อนกลับไปใช้ไฟล์ทั่วไป archive.phpนี่ทำให้เรามีความสามารถในการควบคุมการแสดงรายการประเภทเนื้อหาต่างๆ ได้อย่างแม่นยำ

UltaHost WordPress โฮสติ้ง
การรับประกันคืนเงินภายใน 30 วัน, แบนด์วิธและฐานข้อมูลไม่จำกัด, การป้องกัน DDoS ฟรี, ซื้อ 3 ปีลดราคา 50%

สร้างเทมเพลตเก็บถาวรสำหรับประเภทบทความที่กำหนดเอง

ตรวจสอบให้แน่ใจว่าประเภทบทความรองรับฟังก์ชันการเก็บถาวร

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

ในอาร์เรย์พารามิเตอร์ของฟังก์ชันที่ลงทะเบียนhas_archive พารามิเตอร์ควบคุมการเปิดใช้งานหน้าอาร์คีฟ ตั้งค่าเป็น true เป็นขั้นตอนที่สำคัญ หากตั้งค่าเป็น false หรือไม่ได้ตั้งค่า (ค่าเริ่มต้นคือ false), แม้ว่าคุณจะสร้างไฟล์เทมเพลตที่ถูกต้อง WordPress ก็จะไม่สร้าง URL ที่สอดคล้องกันเพื่อเข้าถึงหน้านี้

ตัวอย่างการลงทะเบียน CPT ที่รองรับการเก็บถาวรมาตรฐานมีดังนี้:

function my_register_custom_post_type() {
    $labels = array(
        'name' => '产品',
        'singular_name' => '产品',
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true, // 启用存档功能
        'rewrite' => array('slug' => 'products'), // 可选:自定义存档页URL别名
        'supports' => array('title', 'editor', 'thumbnail'),
        'menu_icon' => 'dashicons-cart',
    );
    register_post_type('product', $args);
}
add_action('init', 'my_register_custom_post_type');

โครงสร้างและเนื้อหาของการสร้างไฟล์เทมเพลต

หลังจากยืนยันว่า CPT รองรับการเก็บถาวรแล้ว ขั้นตอนต่อไปคือการสร้างไฟล์เทมเพลตที่เกี่ยวข้องในไดเรกทอรีธีมกิจกรรมของคุณ การตั้งชื่อไฟล์ต้องปฏิบัติตามรูปแบบ archive-{post_type}.php อย่างเคร่งครัด และ {post_type} ต้องตรงกับชื่อที่ใช้ในการลงทะเบียนทุกประการ (คำนึงถึงตัวพิมพ์ใหญ่-เล็ก)

แนะนำให้อ่าน เริ่มต้นจากศูนย์: คู่มือการพัฒนา WordPress Theme แบบสมบูรณ์และการแบ่งปันแนวปฏิบัติที่ดีที่สุด

ภายในไฟล์นี้ คุณสามารถใช้แท็กเทมเพลตและลูปของ WordPress ได้เหมือนกับการสร้างเทมเพลตหน้าอื่นๆ พื้นฐานและสมบูรณ์ archive-product.php อาจมีลักษณะดังนี้:

<?php
/**
 * 模板名称:产品存档页
 * 用于展示“product”自定义文章类型的文章列表
 */
get_header(); ?>

<main id="primary" class="site-main">
    <header class="archive-header page-header">
        &lt;?php
            the_archive_title( &#039;<h1 class="archive-title page-title">', '</h1>' );
            the_archive_description( '<div class="archive-description">', '</div>' );
        ?&gt;
    </header>

<?php if ( have_posts() ) : ?>
        <div class="product-archive-wrapper">
            <?php
            while ( have_posts() ) :
                the_post();
                ?>
                <article id="post-<?php the_ID(); ?>" no numeric noise key 1012>
                    <a href="/th/</?php the_permalink(); ?>" class="product-thumbnail-link">
                        
                    </a>
                    <div class="product-content">
                        <h2 class="product-title">
                            <a href="/th/</?php the_permalink(); ?>"><?php the_title(); ?></a>
                        </h2>
                        <div class="product-excerpt">
                            <?php the_excerpt(); ?>
                        </div>
                        <a href="/th/</?php the_permalink(); ?>" class="read-more-link">ดูรายละเอียด</a>
                    </div>
                </article>
            <?php endwhile; ?>
        </div>

2,
            'prev_text' =&gt; __( '上一页', 'textdomain' ),
            'next_text' =&gt; __( '下一页', 'textdomain' ),
        ) );
        ?&gt;
        <section class="no-products">
            <p>ขออภัย ขณะนี้ไม่พบสินค้าใดๆ</p>
        </section>
    <?php endif; ?>
</main>

&lt;?php
get_sidebar();
get_footer();

เทคนิคการควบคุมขั้นสูงและการปรับแต่ง

การใช้เงื่อนไขในการตัดสินใจในเทมเพลตเก็บถาวรทั่วไป

บางครั้ง คุณอาจต้องการให้หลายประเภทบทความแชร์ archive.php ไฟล์เดียวกัน แต่แสดงเนื้อหาต่างกันตามประเภท ในกรณีนี้ แท็กเงื่อนไข (Conditional Tags) ของ WordPress จะมีประโยชน์มาก

เงื่อนไขที่เกี่ยวข้องมากที่สุดคือ is_post_type_archive() ฟังก์ชัน คุณสามารถใช้มันใน archive.php เพื่อกำหนดหัวข้อ คำอธิบาย หรือโครงสร้างลูปสำหรับ CPT ที่แตกต่างกัน

hosting.com 共享主机
高性能,配备 AMD EPYC CPU、NVMe SSD 存储和 LiteSpeed,全天候24小时、全天候的专家内部支持,高级安全措施,包括 SSL、暴力破解、恶意软件和 DDoS 防护,节省高达 73%
// 在 archive.php 文件内
if ( is_post_type_archive('product') ) {
    echo '<h1>ผลิตภัณฑ์และโซลูชันของเรา</h1>';
    get_template_part('template-parts/loop', 'product-grid');
} elseif ( is_post_type_archive('event') ) {
    echo '<h1>กิจกรรมและสัมมนาล่าสุด</h1>';
    get_template_part('template-parts/loop', 'event-list');
} else {
    // 默认的文章存档(博客)
    echo '<h1>บล็อกและข้อมูลข่าวสาร</h1>';
    get_template_part('template-parts/loop', 'default');
}

ใช้ฮุกเพื่อแก้ไขการสืบค้นหน้าอาร์ไคว์

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

ตัวอย่างโค้ดด้านล่างแสดงวิธีการปรับเปลี่ยน Main Query สำหรับหน้าอาร์ไคฟ์ “ผลิตภัณฑ์” เพื่อให้เรียงลำดับตามฟิลด์ที่กำหนดเอง และแสดง 9 รายการต่อหน้า:

function customize_product_archive_query($query) {
    // 确保只在非管理后台、主查询、且是产品存档页时生效
    if ( ! is_admin() && $query->is_main_query() && is_post_type_archive('product') ) {
        $query->set('posts_per_page', 9); // 每页9个产品
        $query->set('orderby', 'meta_value_num'); // 按数字元字段排序
        $query->set('meta_key', 'product_price'); // 指定元字段键
        $query->set('order', 'ASC'); // 升序排列
    }
}
add_action('pre_get_posts', 'customize_product_archive_query');

ข้อควรระวังสำคัญ: หลีกเลี่ยงอย่างเด็ดขาดที่จะใช้ในไฟล์เทมเพลต query_posts() มาแก้ไขคิวรีหลัก ซึ่งจะทำลายอ็อบเจกต์คิวรีและทำให้เกิดข้อผิดพลาดในการแบ่งหน้า ปัญหาความเข้ากันได้ของปลั๊กอิน ฯลฯ

แนะนำให้อ่าน คู่มือการพัฒนาเว็บไซต์อีคอมเมิร์ซ WooCommerce ตั้งแต่การติดตั้งไปจนถึงการใช้งานฟังก์ชันขั้นสูง

โหลดไฟล์เทมเพลตที่แตกต่างกันแบบไดนามิก

สำหรับสถานการณ์ที่ซับซ้อนมากขึ้น คุณสามารถใช้ template_include ตัวกรองเพื่อตัดสินใจแบบไดนามิกว่าจะโหลดไฟล์เทมเพลตใด นี่ช่วยให้คุณสามารถสลับเทมเพลตตามเงื่อนไขใดๆ (เช่น บทบาทผู้ใช้, พารามิเตอร์ URL, เวลา ฯลฯ)

ตัวอย่างเช่น การโหลดเทมเพลตที่แตกต่างสำหรับหน้าอาร์ไชฟ์ “ผลิตภัณฑ์” ภายใต้เงื่อนไขเฉพาะ:

โฮสติ้งแบบแชร์ของ InterServer
共享主机每月 $2.50 USD , 首月 $0.1 USD 优惠码 tryinterserver, 461个云应用脚本,一键安装。
function load_special_product_archive_template($template) {
    if ( is_post_type_archive('product') && some_custom_condition() ) {
        $new_template = locate_template('archive-product-special.php');
        if ( ! empty($new_template) ) {
            return $new_template;
        }
    }
    return $template;
}
add_filter('template_include', 'load_special_product_archive_template');

การแก้ไขปัญหาและแนวทางปฏิบัติที่ดีที่สุด

แม้จะทำตามขั้นตอนทั้งหมดแล้ว บางครั้งเทมเพลตอาร์ไชฟ์อาจยังไม่ทำงาน นี่คือรายการตรวจสอบอย่างเป็นระบบ:

1. 刷新固定链接:这是最常见且首要的步骤。前往WordPress后台的“设置” -> “固定链接”,直接点击“保存更改”。这个操作会刷新WordPress的重写规则,使新的存档页面URL规则生效。
2. 验证CPT注册:确保注册CPT的代码正在执行,并且 has_archive พารามิเตอร์เมื่อส่งผ่านไปยัง register_post_type จริง ๆ แล้ว trueตรวจสอบว่ามีปลั๊กอินหรือโค้ดธีมอื่นที่เขียนทับการตั้งค่า CPT ของคุณหรือไม่
3. 检查文件位置与命名:确认 archive-{post_type}.php อยู่ในไดเรกทอรีรากของธีมที่ถูกต้อง ตรวจสอบการสะกดชื่อไฟล์ รวมถึงตัวพิมพ์ใหญ่-เล็ก ว่าตรงกับชื่อ post_type ที่ลงทะเบียนไว้ทุกประการหรือไม่
4. 处理主题覆盖:如果你使用的是子主题,确保父主题没有同名模板文件覆盖了子主题的模板层次结构。同时,检查是否有其他 template_include ตัวกรองรบกวน
5. 缓存问题:清空所有级别的缓存,包括WordPress对象缓存、页面缓存插件以及服务器或CDN缓存。

เกี่ยวกับแนวทางปฏิบัติที่ดีที่สุด แนะนำให้ใช้เสมอ pre_get_posts แทนที่จะเป็น query_posts เพื่อแก้ไขคำสั่งค้นหา; ใช้ในไฟล์เทมเพลต post_class() ออกคลาส CSS แบบไดนามิกสำหรับบทความ เพื่ออำนวยความสะดวกในการออกแบบสไตล์ และเพิ่มคำอธิบายส่วนหัวที่ชัดเจนให้กับไฟล์เทมเพลตที่คุณกำหนดเอง

สรุป

การเชื่อมต่อเทมเพลตเก็บถาวรที่กำหนดเองสำหรับประเภทบทความต่าง ๆ ใน WordPress เป็นกระบวนการที่เชื่อมโยงเนื้อหากับเลเยอร์การนำเสนออย่างแม่นยำ ใจความสำคัญอยู่ที่การทำความเข้าใจและใช้ archive-{post_type}.php กฎลำดับชั้นของเทมเพลตนี้ ตั้งแต่การตรวจสอบให้แน่ใจว่าฟังก์ชันเก็บถาวรถูกเปิดใช้งานเมื่อลงทะเบียน CPT ไปจนถึงการสร้างและตั้งชื่อไฟล์เทมเพลตอย่างถูกต้อง รวมถึงการใช้ pre_get_posts ฮุคสำหรับการควบคุมคิวรีขั้นสูง ทุกขั้นตอนมีความสำคัญอย่างยิ่ง เมื่อเชี่ยวชึงทักษะเหล่านี้แล้ว คุณจะสามารถสร้างหน้าลิสต์ที่สมบูรณ์และมีสไตล์เฉพาะตัวสำหรับแต่ละประเภทเนื้อหาในเว็บไซต์ได้อย่างง่ายดาย ซึ่งจะช่วยเพิ่มความมืออาชีพและประสบการณ์ผู้ใช้ของเว็บไซต์อย่างมาก

คำถามที่พบบ่อย (FAQ)

URL ของหน้าอาร์ไคฟ์ที่กำหนดเองมีลักษณะอย่างไร?

โดยค่าเริ่มต้น WordPress จะสร้าง URL ของหน้าอาร์ไคฟ์ตามชื่อที่คุณใช้เมื่อลงทะเบียนประเภทโพสต์ที่กำหนดเอง ตัวอย่างเช่น CPT ที่มีชื่อ product URL ของหน้าอาร์ไคฟ์มักจะเป็น 你的网站域名/product/คุณสามารถตั้งค่าได้เมื่อลงทะเบียนโดยการตั้งค่า rewrite พารามิเตอร์ใน slug ตัวเลือกสำหรับกำหนดนามแฝง URL นี้เอง

ฉันสามารถแสดงตัวกรองบทความสำหรับแท็กซอนอมีที่กำหนดเองในเทมเพลตเก็บถาวรได้ไหม?

แน่นอนได้ นี่เป็นความต้องการทั่วไปสำหรับหน้าจัดเก็บ คุณสามารถใช้ archive-{post_type}.php เทมเพลต get_terms() ฟังก์ชันเพื่อดึงข้อมูลคำศัพท์ทั้งหมดของแท็กซอนอมีที่กำหนดเองที่เกี่ยวข้อง (เช่น “หมวดหมู่สินค้า”) แล้ววนลูปแสดงผลเป็นลิงก์กรอง เมื่อผู้ใช้คลิกลิงก์หมวดหมู่ใด พวกเขาจะเข้าสู่หน้าการจัดเก็บของแท็กซอนอมีนั้น และในขณะนั้น WordPress จะค้นหาและโหลด taxonomy-{taxonomy_name}.phptaxonomy-{taxonomy_name}-{term_slug}.php เทมเพลตเป็นต้น

วิธีการสร้างหน้ารายการสำหรับประเภทบทความที่ไม่ได้เปิดใช้งานฟังก์ชันเก็บถาวร?

หากประเภทบทความ has_archive เป็น falseคุณจะไม่สามารถเข้าถึงรายการของมันได้ผ่าน URL เก็บถาวรมาตรฐาน ทางเลือกคือสร้างหน้า (Page) ปกติ จากนั้นใช้ในเทมเพลตหน้านั้น WP_Queryget_posts() เพื่อค้นหาและแสดงบทความของประเภทบทความเฉพาะนั้น คุณสามารถกำหนดเทมเพลตแบบกำหนดเองให้กับหน้านี้และเขียนโค้ดการค้นหาและลูปเฉพาะในนั้น

การแบ่งหน้าไม่ทำงานบนหน้าอาร์ไคฟ์แบบกำหนดเอง วิธีแก้ไขคืออะไร?

การแบ่งหน้าที่ล้มเหลวมักเกิดจากการเปลี่ยนแปลงแบบผิดพลาดของ Main Query โปรดตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ query_posts()ในเทมเพลต หากคุณต้องการแก้ไขพารามิเตอร์การสืบค้น (เช่น จำนวนบทความ การจัดเรียง) คุณต้องใช้ pre_get_posts ฮุค (hooks) ตามที่กล่าวไว้ในบทความนี้ พร้อมทั้งตรวจสอบให้แน่ใจว่าเมื่อเรียกใช้ the_posts_pagination() ฟังก์ชันแบ่งหน้า (pagination functions) จะทำงานกับออบเจกต์ $wp_query ระดับโลก (global) ไม่ใช่กับอินสแตนซ์ที่กำหนดเอง (custom) WP_Query อินสแตนซ์