問題描述

我正在編寫一個自定義帖子型別的外掛。其中一部分我透過簡訊輸出到模板。但是其他部分需要一個自定義的帖子模板,我想出瞭如何使用 CPT 的模板層次結構。但是自定義模板是在主題中,我認為外掛應該是 self-contained,至少要開始。

那麼這裡最好的做法是什麼?我們如何在 CPT 外掛中包含模板檔案?你能指點一下我們如何做好這個例子嗎?

謝謝你的幫助。

最佳解決方案

So what’s the best practice here?

我會說,讓主題處理它並提供一個預設的外掛的組合。

您可以使用 single_template 過濾器來切換模板。在你的回撥中,看看主題是否提供了 post 型別的模板,如果沒有做,什麼都不做。

<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
    if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
        // if you're here, you're on a singlar page for your costum post
        // type and WP did NOT locate a template, use your own.
        $template = dirname(__FILE__) . '/path/to/fallback/template.php';
    }
    return $template;
}

我喜歡這種方法最好。結合它提供了一套完整的”template tags”(例如 the_contentthe_title),支援任何與您的帖子型別相關的自定義資料,併為終端使用者提供了大量定製功能以及一些聲音預設值。 Bbpress 做得很好:包含使用者模板,如果它找到並提供了大量的模板標籤。

或者,您可以使用 the_content 過濾器的回撥,只需更改內容中的內容。

<?php
add_filter('the_content', 'wpse96660_the_content');

function wpse96660_the_content($content)
{
    if (is_singular('your_post_type') && in_the_loop()) {
        // change stuff
        $content .= '<p>here we are on my custom post type</p>';
    }

    return $content;
}

次佳解決方案

如果請求是針對您的帖子型別,您可以掛接到 template_include 並返回您的外掛檔案

add_filter( 'template_include', 'insert_my_template' );

function insert_my_template( $template )
{
    if ( 'my_post_type' === get_post_type() )
        return dirname( __FILE__ ) . '/template.php';

    return $template;
}

但這樣會大大改變外觀。仍然沒有乾淨的解決方案。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。