สร้างเทมเพลตหน้าเว็บแบบกำหนดเองพร้อมปลั๊กอินหรือไม่


คำตอบ:


73

get_page_template()สามารถแทนที่ได้ผ่านpage_templateตัวกรอง หากปลั๊กอินของคุณเป็นไดเรกทอรีที่มีแม่แบบเป็นไฟล์อยู่นั่นเป็นเพียงเรื่องของการส่งชื่อไฟล์เหล่านี้ หากคุณต้องการสร้างพวกเขา "ในทันที" (แก้ไขได้ในพื้นที่ผู้ดูแลระบบและบันทึกไว้ในฐานข้อมูลหรือไม่) คุณอาจต้องการที่จะเขียนพวกเขาไปยังไดเรกทอรีแคชและอ้างถึงพวกเขาหรือขอเข้าtemplate_redirectและทำeval()สิ่งบ้าบางอย่าง.

ตัวอย่างง่ายๆสำหรับปลั๊กอินที่ "เปลี่ยนเส้นทาง" ไปยังไฟล์ในไดเรกทอรีปลั๊กอินเดียวกันหากมีเงื่อนไขที่แน่นอน:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}

สวัสดี ม.ค. คุณมีโค้ดตัวอย่างบางส่วนเกี่ยวกับวิธีส่งไฟล์ปลั๊กอินเป็นเทมเพลตหน้าเว็บที่กำหนดเองหรือไม่?
jnthnclrk

@trnsfrmr: มันง่ายจริงๆฉันได้เพิ่มตัวอย่างง่ายๆในคำตอบของฉัน
Jan Fabry

10
โปรดทราบว่าสิ่งนี้ถูกแทนที่โดยตัวกรอง "template_include" มากกว่าหรือน้อยกว่าในเวอร์ชันที่ใหม่กว่า (3.1+)
Inigoesdr

สมบูรณ์แบบ !!! คุณประหยัดเวลาของฉัน @JanFabry
Kishan Chauhan

ตามที่ระบุโดย @fireydude นี่ไม่ใช่วิธีแก้ไขปัญหาทั่วไป มันเป็นวิธีการแก้ปัญหาที่ยากรหัสหน้ากระสุน
Mauro Colella

22

การเอาชนะget_page_template()เป็นเพียงแฮ็คที่รวดเร็ว ไม่อนุญาตให้เลือกเทมเพลตจากหน้าจอผู้ดูแลระบบและบุ้งเพจจะถูกเขียนลงในปลั๊กอินอย่างหนักดังนั้นผู้ใช้จึงไม่มีทางรู้ว่าเทมเพลตมาจากไหน

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

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}

จะดี ( และต้องการ ) ถ้าคุณสามารถโพสต์รหัสที่เกี่ยวข้องจากลิงค์ในคำตอบของคุณมิฉะนั้นจะไม่มีอะไรมากไปกว่าความคิดเห็นป่อง :-)
Pieter Goosen

บทช่วยสอนให้เครดิตตัวอย่างของ Tom McFarlin ในฐานะผู้ริเริ่มวิธีนี้
fireydude

7

ใช่มันเป็นไปได้ ฉันพบปลั๊กอินตัวอย่างนี้มีประโยชน์มาก

อีกวิธีหนึ่งที่เข้ามาในหัวของฉันคือการใช้WP Filesystem APIเพื่อสร้างไฟล์เทมเพลตเป็นธีม ฉันไม่แน่ใจว่ามันเป็นวิธีการที่ดีที่สุดที่จะใช้ แต่ฉันแน่ใจว่ามันใช้งานได้!


ปลั๊กอินตัวอย่างที่เชื่อมโยงนั้นได้รับการบันทึกไว้ค่อนข้างดี ฉันชอบมัน. :)
Arvid

0

ไม่มีคำตอบก่อนหน้านี้สำหรับฉัน ที่นี่หนึ่งที่คุณสามารถเลือกแม่แบบของคุณในผู้ดูแลระบบ Wordpress เพียงวางไว้ในไฟล์ปลั๊กอิน php หลักและเปลี่ยนtemplate-configurator.phpตามชื่อแม่แบบของคุณ

//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.