Tôi đã tìm kiếm trong vài giờ qua để tìm cách tạo một mẫu trang tùy chỉnh từ bên trong một plugin nhưng vẫn chưa có may mắn nào.
Những gì tôi đặc biệt đang cố gắng làm là thêm một tùy chọn vào danh sách các mẫu trang có sẵn khi chỉnh sửa một trang và không sử dụng một số phương pháp khác nhưif( is_page( 'page-slug' ) ) { /* etc */ }
Có một biến toàn cầu tôi có thể sửa đổi để làm điều này?
Biên tập:
Hiện tại tôi đang sử dụng mã này, dựa trên liên kết @ m0r7if3r đã cho tôi nhận xét, vấn đề là nó sẽ chạy chức năng này khi xem trang, nhưng không phải khi chỉnh sửa trang (để điền danh sách thả xuống với các mẫu trang) :
class JW_SiteGrader {
private static $instance;
private function __construct() {
add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );
}
public static function getInstance() {
// Return the class data in a Singleton fashion
if (self::$instance == null)
self::$instance = new JW_SiteGrader();
return self::$instance;
}
public function sitegrader_template_redirect() {
add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );
}
public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {
if ( !is_array( $template_names ) )
return '';
$located = '';
$this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
foreach ( $template_names as $template_name ) {
if ( !$template_name )
continue;
if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {
$located = STYLESHEETPATH . '/' . $template_name;
break;
} else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {
$located = TEMPLATEPATH . '/' . $template_name;
break;
} else if ( file_exists( $this_plugin_dir . $template_name ) ) {
$located = $this_plugin_dir . $template_name;
break;
}
}
if ( $load && '' != $located )
load_template( $located, $require_once );
return $located;
}
public function sitegrader_page_template( $template ) {
$object = get_queried_object();
if ( 'page' == $object->post_type ) {
// New
$templates[] = "page-sitegrader.php";
// Like in core
$templates[] = "page-{$object->post_type}.php";
$templates[] = "page.php";
return locate_template( $templates );
}
// return apply_filters('page_template', $template);
return $template;
}
}
Chỉnh sửa 2:
Có vẻ như chức năng này sẽ được phát hành trong một bản cập nhật trong tương lai, tôi đã đọc khá nhiều vé trac về điều này và đã có một số cuộc thảo luận nhưng không có câu trả lời thực sự (hy vọng cho 3,4). Sẽ liệt kê các vé trac URL ở đây một chút.
Chỉnh sửa 3:
Đoạn mã trên hoạt động, NHƯNG, vấn đề duy nhất tôi gặp phải vào thời điểm này là không có mẫu nào được thêm vào danh sách thả xuống khi chỉnh sửa / thêm trang mới. Tôi đang thử một vài thứ và sẽ sớm cập nhật câu hỏi của tôi.
page_template
hook, đoạn mã trên trong phần chỉnh sửa của tôi là những gì hiện đang được sử dụng. Tôi có cần sử dụng template_redirect
hook và sau đó thêm page_template
bộ lọc vào đó không?