Czy tworzysz niestandardowe szablony stron z wtyczkami?

Odpowiedzi:

73

get_page_template()można zastąpić przez page_templatefiltr. 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_redirecti 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;
}
Jan Fabry
źródło
Hej, Jan, masz jakiś przykładowy kod, jak przekazać plik wtyczki jako niestandardowy szablon strony?
jnthnclrk
@trnsfrmr: To naprawdę proste, do mojej odpowiedzi dodałem prosty przykład.
Jan Fabry
10
Zauważ, że zostało to mniej więcej zastąpione przez filtr „template_include” w późniejszych wersjach (3.1+).
Inigoesdr
Idealnie !!!, zaoszczędziłeś mój czas @JanFabry
Kishan Chauhan
Jak stwierdził @fireydude, nie jest to ogólne rozwiązanie. Jest to obejście, które mocno koduje informacje o stronie.
Mauro Colella,
22

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',
        );
}
fireydude
źródło
Byłoby miło ( i preferowane ), jeśli możesz opublikować odpowiedni kod z linku w swojej odpowiedzi, w przeciwnym razie jest to nic innego jak rozdęty komentarz :-)
Pieter Goosen
Samouczek faktycznie uznaje przykład Toma McFarlina za pomysłodawcę tego podejścia.
fireydude
7

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!

Ari
źródło
Przykładowa wtyczka z linkami jest nawet dość dobrze udokumentowana. Lubię to. :)
Arvid
0

Ż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.phpwedł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;
}
Dessauges Antoine
źródło