Bagaimana cara memindahkan file templat halaman seperti page- {slug} .php ke sub-direktori?

10

Saya ingin memindahkan file templat halaman seperti page-{slug}.phpke sub-direktori dalam tema saya, dengan cara yang akan dikenali oleh WordPress secara otomatis. Jika Templat halaman dari formulir tersebut tidak ada dalam sub-direktori, maka WordPress harus kembali ke aturan memuat template default. Bagaimana saya bisa mencapainya?

Catatan-1: Pertanyaan ini dan jawaban yang sesuai lebih umum untuk templat halaman dan tautan ini menyebutkan template-parts/page, yang bukan hal yang sama.

Catatan-2: Saya memiliki beberapa page-{slug}.phpfile templat halaman seperti, jadi saya ingin memindahkannya ke sub-direktori untuk organisasi file yang lebih rapi.

perwujudan
sumber
2
Mungkin akan lebih baik untuk mengubahnya ke Page Templates daripada page-slug.php? Core mendukung memiliki Page Templates di subdirektori: nacin.com/2012/03/29/…
WebElaine

Jawaban:

12

Bagaimana Templat Halaman dimuat:

Menurut Hierarki Templat WordPress default , pagepermintaan memuat templat berdasarkan prioritas dan penamaan seperti yang dinyatakan di bawah ini:

  1. Custom Page Template: jika didefinisikan dalam editor halaman.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: hanya untuk karakter multi-byte.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Di antaranya, singular.phpdan index.phpyang tidak benar-benar halaman template. singular.phpadalah template fallback untuk semua jenis posting tunggal dan index.phpmerupakan template fallback utama untuk apa pun yang seharusnya dimuat oleh template WordPress. Jadi lima yang pertama adalah templat halaman.

Cara menyuntikkan file template dari sub-direktori dalam hierarki:

Fungsi inti WordPress get_page_template()menghasilkan pagelarik hierarki templat yang diperlukan dan tepat sebelum memutuskan dengan tepat file templat mana yang akan dimuat dari hierarki, WordPress mengaktifkan page_template_hierarchykait filter. Jadi cara terbaik untuk menambahkan sub-direktori, di mana WordPress akan mencari page-{slug}.phptemplat secara otomatis, adalah dengan menggunakan filter ini dan menyuntikkan nama file yang tepat relatif terhadap sub-direktori dalam array hierarki templat halaman.

Catatan: kait filter asli adalah kait filter dinamis yang didefinisikan sebagai{$type}_template_hierarchy, yang terletak diwp-includes/template.phpfile. Jadi ketika$typeitupage, hook filter menjadipage_template_hierarchy.

Sekarang, untuk tujuan kami, kami akan menyuntikkan sub-directory/page-{slug}.phpnama file tepat sebelum page-{slug}.phpdalam array hierarki template yang diteruskan ke fungsi panggilan balik kait. Dengan begitu, WordPress akan memuat sub-directory/page-{slug}.phpfile jika ada, jika tidak maka akan mengikuti hierarki pemuatan templat laman normal. Tentu saja, untuk menjaga konsistensi, kami akan tetap memberikan Custom Page Templateprioritas yang lebih tinggi dibandingkan dengan sub-directory/page-{slug}.phpfile kami . Jadi hierarki templat halaman yang diubah akan menjadi:

  1. Custom Page Template: jika didefinisikan dalam editor halaman.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: hanya untuk karakter multi-byte.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: hanya untuk karakter multi-byte.
  6. page-{id}.php
  7. page.php

Contoh functions.phpKODE:

Jika Anda berencana untuk melakukan perubahan ini hanya pada satu tema, maka Anda dapat menggunakan KODE berikut dalam functions.phpfile tema aktif Anda :

// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );

function wpse312159_page_template_add_subdir( $templates = array() ) {
    // Generally this doesn't happen, unless another plugin / theme does modifications
    // of their own. In that case, it's better not to mess with it again with our code.
    if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
        return $templates;

    $page_tpl_idx = 0;
    if( $templates[0] === get_page_template_slug() ) {
        // if there is custom template, then our page-{slug}.php template is at the next index 
        $page_tpl_idx = 1;
    }

    $page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );

    // As of WordPress 4.7, the URL decoded page-{$slug}.php template file is included in the
    // page template hierarchy just before the URL encoded page-{$slug}.php template file.
    // Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
    // always be different from page-{id}.php, even if you try to input the {id} as {slug}.
    // So this check will work for WordPress versions prior to 4.7 as well.
    if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
        $page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
    }

    array_splice( $templates, $page_tpl_idx, 0, $page_tpls );

    return $templates;
}
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );

Plugin Contoh:

Jika Anda ingin mengikuti organisasi file templat yang sama dalam beberapa tema, maka sebaiknya memisahkan fitur ini dari tema Anda. Dalam hal ini, alih-alih memodifikasi file tema functions.phpdengan KODE sampel di atas, Anda harus membuat plugin sederhana dengan KODE sampel yang sama.

Simpan KODE berikut dengan nama file misalnya page-slug-template-subdir.phpdalam pluginsdirektori WordPress Anda :

<?php
/*
Plugin Name:  WPSE Page Template page-slug.php to Sub Directory
Plugin URI:   https://wordpress.stackexchange.com/a/312159/110572
Description:  Page Template with page-{slug}.php to a Sub Directory
Version:      1.0.0
Author:       Fayaz Ahmed
Author URI:   https://www.fayazmiraz.com/
*/

// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );

function wpse312159_page_template_add_subdir( $templates = array() ) {
    // Generally this doesn't happen, unless another plugin / theme does modifications
    // of their own. In that case, it's better not to mess with it again with our code.
    if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
        return $templates;

    $page_tpl_idx = 0;
    if( $templates[0] === get_page_template_slug() ) {
        // if there is custom template, then our page-{slug}.php template is at the next index 
        $page_tpl_idx = 1;
    }

    $page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
                                                                                  uded in the
    // page template hierarchy just before the URL encoded page-{$slug}.php template file.
    // Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
    // always be different from page-{id}.php, even if you try to input the {id} as {slug}.
    // So this check will work for WordPress versions prior to 4.7 as well.
    if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
        $page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
    }

    array_splice( $templates, $page_tpl_idx, 0, $page_tpls );

    return $templates;
}
// the original filter hook is {$type}_template_hierarchy,
// wihch is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );

Pemakaian:

Dengan salah satu dari KODE di atas, WordPress akan mengenali page-{slug}.phpfile template dalam page-templatesdirektori tema Anda secara otomatis.

Katakan misalnya, Anda memiliki abouthalaman. Jadi, jika tidak memiliki custom page templateset dari editor, maka WordPress akan mencari THEME/page-templates/page-about.phpfile template dan jika itu tidak ada, maka WordPress akan mencari THEME/page-about.phpfile template dan sebagainya (yaitu hierarki templat halaman default).

Fayaz
sumber