Saya telah mencari-cari beberapa jam terakhir untuk menemukan cara membuat templat halaman khusus dari dalam plugin tetapi belum beruntung.
Apa yang secara khusus saya coba lakukan adalah menambahkan opsi ke daftar template halaman yang tersedia saat mengedit halaman, dan tidak menggunakan beberapa metode lain sepertiif( is_page( 'page-slug' ) ) { /* etc */ }
Apakah ada variabel global yang dapat saya modifikasi untuk melakukan ini?
Edit:
Saya menggunakan kode ini saat ini, berdasarkan tautan @ m0r7if3r memberi saya dalam komentar, masalahnya adalah ia akan menjalankan fungsi ini ketika melihat halaman, tetapi tidak ketika mengedit halaman (untuk mengisi daftar dropdown dengan templat halaman) :
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;
}
}
Edit 2:
Tampaknya fungsi ini akan dirilis dalam pembaruan di masa mendatang, saya membaca beberapa tiket trac tentang ini dan telah ada beberapa diskusi tetapi tidak ada jawaban nyata (berharap 3.4). Akan mencantumkan URL tiket trak di sini sebentar lagi.
Edit 3:
Kode di atas berfungsi, TETAPI, satu-satunya masalah yang saya alami saat ini adalah tidak ada template yang ditambahkan ke daftar dropdown ketika mengedit / menambahkan halaman baru. Saya mencoba beberapa hal dan akan segera memperbarui pertanyaan saya.
page_template
hook, kode di atas dalam edit saya adalah apa yang sedang digunakan. Apakah saya perlu menggunakan template_redirect
pengait dan kemudian menambahkan page_template
filter di sana?