Crearea șabloanelor personalizate de pagină prin intermediul plugin-urilor?
Este posibil să creezi șabloane personalizate de pagină disponibile prin intermediul unui plugin?

get_page_template()
poate fi suprascris prin filtrul page_template
. Dacă plugin-ul tău este un director care conține șabloanele ca fișiere, este suficient să transmiți numele acestor fișiere. Dacă dorești să le creezi "din mers" (le editezi în zona de administrare și le salvezi în baza de date?), poți să le scrii într-un director de cache și să te referi la ele, sau să te conectezi la template_redirect
și să faci niște lucruri nebunești cu eval()
.
Un exemplu simplu pentru un plugin care "redirecționează" către un fișier din același director al plugin-ului dacă un anumit criteriu este îndeplinit:
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;
}

Hei Jan, ai niște cod exemplu despre cum să treci un fișier de plugin ca șablon personalizat de pagină?

@trnsfrmr: E foarte simplu, am adăugat un exemplu simplu în răspunsul meu.

Reține că acest lucru a fost mai mult sau mai puțin înlocuit de filtrul "template_include" în versiunile mai recente (3.1+).

Suprascrierea funcției get_page_template()
este doar o soluție rapidă și improvizată. Aceasta nu permite selectarea șablonului din ecranul de administrare, iar slug-ul paginii este hardcodat în plugin, astfel încât utilizatorul nu are nicio modalitate de a ști de unde provine șablonul.
Soluția recomandată ar fi să urmați acest tutorial, care vă permite să înregistrați un șablon de pagină în back-end direct din plugin. Apoi, acesta va funcționa ca orice alt șablon.
/*
* Inițializează pluginul prin setarea filtrelor și funcțiilor de administrare.
*/
private function __construct() {
$this->templates = array();
// Adaugă un filtru în metabox-ul de atribute pentru a injecta șablonul în cache.
add_filter('page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Adaugă un filtru la salvarea postării pentru a injecta șablonul în cache-ul paginii
add_filter('wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Adaugă un filtru la includerea șablonului pentru a determina dacă pagina are
// șablonul nostru atribuit și returnează calea acestuia
add_filter('template_include',
array( $this, 'view_project_template')
);
// Adaugă șabloanele tale în acest array.
$this->templates = array(
'goodtobebad-template.php' => 'E Bine să Fii Rău',
);
}

Ar fi bine (și preferabil) dacă ai putea posta codul relevant din link în răspunsul tău, altfel acesta nu este altceva decât un comentariu umflat :-)

Tutorialul de fapt atribuie exemplul lui Tom McFarlin ca fiind inițiatorul acestei abordări.

Niciunul dintre răspunsurile anterioare nu a funcționat pentru mine. Iată o soluție în care poți alege șablonul din administrarea WordPress. Pur și simplu adaugă acest cod în fișierul principal al plugin-ului tău PHP și înlocuiește template-configurator.php
cu numele șablonului tău.
//Încărcare șablon pentru o anumită pagină
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;
}
/**
* Adăugare șablon "Personalizat" în secțiunea de atribute ale paginii.
*/
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 ) {
// Adaugă șablonul personalizat numit template-custom.php în meniul dropdown
$post_templates['template-configurator.php'] = __('Configurator');
return $post_templates;
}

Da, este posibil. Am găsit acest plugin exemplu foarte util.
O altă abordare care mi-a venit în minte este utilizarea WP Filesystem API pentru a crea fișierul de template în temă. Nu sunt sigur că este cea mai bună abordare, dar sunt sigur că funcționează!
