Crearea șabloanelor personalizate de pagină prin intermediul plugin-urilor?

28 oct. 2010, 20:04:20
Vizualizări: 122K
Voturi: 84

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

0
Toate răspunsurile la întrebare 4
5
92

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;
}
2 nov. 2010 15:52:24
Comentarii

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

jnthnclrk jnthnclrk
16 nov. 2010 19:58:46

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

Jan Fabry Jan Fabry
16 nov. 2010 21:46:14

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

Daniel R Daniel R
10 iun. 2013 18:54:10

Perfect !!!, mi-ai salvat timpul @JanFabry

Kishan Chauhan Kishan Chauhan
21 dec. 2018 16:02:14

După cum a menționat @fireydude, aceasta nu este o soluție generică. Este o soluție temporară care codifică manual slug-ul paginii.

Mauro Colella Mauro Colella
8 iul. 2019 00:18:25
2
31

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',
        );
}
12 oct. 2015 14:29:34
Comentarii

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 :-)

Pieter Goosen Pieter Goosen
12 oct. 2015 14:32:32

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

fireydude fireydude
12 oct. 2015 14:53:34
1
16

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;
}
22 oct. 2019 11:21:25
Comentarii

Acesta este modul corect de a face acest lucru.

Muhammad Zohaib Muhammad Zohaib
26 aug. 2023 11:52:32
1

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ă!

4 dec. 2014 17:37:08
Comentarii

Pluginul exemplu la care s-a făcut link este chiar bine documentat. Îmi place asta. :)

Arvid Arvid
14 aug. 2017 17:46:58