Làm cách nào để di chuyển các tệp mẫu trang như page- {slug} .php sang thư mục con?


10

Tôi muốn di chuyển các tệp mẫu trang như page-{slug}.phpvào một thư mục con trong chủ đề của mình, theo cách mà WordPress sẽ tự động nhận ra chúng. Nếu các mẫu trang của biểu mẫu đã nói không tồn tại trong thư mục con, thì WordPress sẽ quay lại quy tắc tải mẫu mặc định. Làm thế nào tôi có thể đạt được điều đó?

Lưu ý-1: Câu hỏi và câu trả lời tương ứng này chung chung hơn cho các mẫu trang và liên kết này đề cập template-parts/page, đây không phải là điều tương tự.

Lưu ý-2: Tôi có nhiều page-{slug}.phptệp mẫu trang giống nhau, vì vậy tôi muốn chuyển chúng sang thư mục con để tổ chức tệp gọn gàng hơn.


2
Có lẽ sẽ đáng để thay đổi chúng thành Mẫu trang thay vì page-slug.php? Core hỗ trợ có Mẫu trang trong thư mục con: nacin.com/2012/03/29/ Khăn
WebElaine

Câu trả lời:


12

Cách tải trang mẫu:

Theo Phân cấp mẫu mặc định của WordPress , một pageyêu cầu tải một mẫu dựa trên mức độ ưu tiên và đặt tên như được nêu dưới đây:

  1. Custom Page Template: nếu được xác định trong trình chỉnh sửa trang.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: chỉ dành cho các ký tự nhiều byte.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Trong số này, singular.phpindex.phpđang không thực sự trang mẫu. singular.phplà mẫu dự phòng cho bất kỳ loại bài đăng đơn lẻ nào và index.phplà mẫu dự phòng cuối cùng cho mọi thứ mà mẫu WordPress được yêu cầu tải. Vì vậy, năm đầu tiên là các mẫu trang.

Cách tiêm tệp mẫu từ thư mục con trong cấu trúc phân cấp:

Chức năng cốt lõi của WordPress get_page_template()tạo ra pagemảng phân cấp mẫu cần thiết và ngay trước khi quyết định chính xác tệp mẫu nào sẽ tải từ cấu trúc phân cấp, WordPress kích hoạt page_template_hierarchyhook bộ lọc. Vì vậy, cách tốt nhất để thêm thư mục con, trong đó WordPress sẽ page-{slug}.phptự động tìm kiếm các mẫu, là sử dụng bộ lọc này và nhập tên tệp thích hợp liên quan đến thư mục con đó trong mảng phân cấp mẫu của trang.

Lưu ý: hook bộ lọc ban đầu là hook bộ lọc động được định nghĩa là{$type}_template_hierarchy, nằm trongwp-includes/template.phptệp. Vì vậy, khi$typepage, móc lọc trở thànhpage_template_hierarchy.

Bây giờ, với mục đích của chúng tôi, chúng tôi sẽ chèn sub-directory/page-{slug}.phptên tệp ngay trước đó page-{slug}.phptrong mảng phân cấp mẫu được truyền cho hàm gọi lại hook. Bằng cách đó, WordPress sẽ tải sub-directory/page-{slug}.phptệp nếu nó tồn tại, nếu không, nó sẽ tuân theo phân cấp tải mẫu trang bình thường. Tất nhiên, để duy trì tính nhất quán, chúng tôi vẫn sẽ Custom Page Templateưu tiên cao hơn so với sub-directory/page-{slug}.phptệp của chúng tôi . Vì vậy, hệ thống phân cấp mẫu trang đã sửa đổi sẽ trở thành:

  1. Custom Page Template: nếu được xác định trong trình chỉnh sửa trang.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: chỉ dành cho các ký tự nhiều byte.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: chỉ dành cho các ký tự nhiều byte.
  6. page-{id}.php
  7. page.php

functions.phpMÃ mẫu :

Nếu bạn dự định chỉ thực hiện thay đổi này trên một chủ đề, thì bạn có thể sử dụng CODE sau trong functions.phptệp của chủ đề đang hoạt động :

// 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 mẫu:

Nếu bạn muốn theo cùng một tổ chức tệp mẫu trong nhiều chủ đề, thì tốt nhất nên tách tính năng này khỏi chủ đề của bạn. Trong trường hợp đó, thay vì sửa đổi functions.phptệp của chủ đề bằng CODE mẫu ở trên, bạn sẽ cần tạo một plugin đơn giản với cùng CODE mẫu.

Lưu CODE sau với tên tệp, ví dụ page-slug-template-subdir.phptrong pluginsthư mục WordPress của bạn :

<?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' );

Sử dụng:

Với một trong các MÃ trên, WordPress sẽ tự động nhận ra page-{slug}.phpcác tệp mẫu trong page-templatesthư mục của chủ đề của bạn.

Nói ví dụ, bạn có một abouttrang. Vì vậy, nếu nó không có một custom page templatebộ từ trình chỉnh sửa, thì WordPress sẽ tìm THEME/page-templates/page-about.phptệp mẫu và nếu nó không tồn tại, thì WordPress sẽ tìm THEME/page-about.phptệp mẫu, v.v. (tức là phân cấp mẫu trang mặc định).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.