Odpowiedzi:
get_page_template()
można zastąpić przez page_template
filtr. Jeśli twoja wtyczka jest katalogiem z szablonami jako plikami, to tylko kwestia przekazania nazw tych plików. Jeśli chcesz je utworzyć „w locie” (edytować je w obszarze administracyjnym i zapisać je w bazie danych?), Możesz zapisać je w katalogu pamięci podręcznej i odwoływać się do nich lub podłączyć template_redirect
i zrobić szalone eval()
rzeczy .
Prosty przykład wtyczki, która „przekierowuje” do pliku w tym samym katalogu wtyczek, jeśli spełnione jest określone kryterium:
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;
}
Przesłonięcie get_page_template()
to tylko szybki hack. Nie pozwala na wybranie szablonu z ekranu administratora, a informacja o stronie jest na stałe zakodowana we wtyczce, więc użytkownik nie ma możliwości dowiedzenia się, skąd pochodzi szablon.
Preferowanym rozwiązaniem byłoby wykonanie tego samouczka, który pozwala zarejestrować szablon strony w zapleczu z wtyczki. Następnie działa jak każdy inny szablon.
/*
* 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',
);
}
Tak to mozliwe. Uważam, że ta przykładowa wtyczka jest bardzo pomocna.
Innym podejściem, które przyszło mi do głowy, jest użycie WP Filesystem API do utworzenia pliku szablonu do kompozycji. Nie jestem pewien, czy jest to najlepsze podejście, ale jestem pewien, że to działa!
Żadna z poprzednich odpowiedzi nie działała na moją. Tutaj możesz wybrać swój szablon w Wordpress admin. Wystarczy umieścić go w głównym pliku wtyczki php i zmienić template-configurator.php
według nazwy szablonu
//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;
}