Створити власні шаблони сторінок за допомогою плагінів?


Відповіді:


73

get_page_template()може бути скасовано через page_templateфільтр. Якщо ваш плагін - це каталог із шаблонами у вигляді файлів у них, справа лише в тому, щоб передати назви цих файлів. Якщо ви хочете створити їх "на льоту" (відредагуйте їх у зоні адміністрування та збережіть у базі даних?), Можливо, ви захочете записати їх у каталог кешу та посилатися на них, або підключити template_redirectі зробити якісь шалені eval()речі .

Простий приклад плагіна, який "переспрямовує" файл до тієї ж каталоги плагінів, якщо певний критерій відповідає дійсності:

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;
}

Здравствуйте, Ян, у вас є приклад коду про те, як передавати файл плагіна як шаблон власного сторінки?
jnthnclrk

@trnsfrmr: Це дуже просто, я додав простий приклад до своєї відповіді.
Ян Фабрі

10
Зауважте, що це було більш-менш замінено фільтром "template_include" в пізніших версіях (3.1+).
Inigoesdr

Ідеально !!!, ви заощадили мій час @JanFabry
Kishan Chauhan

Як зазначає @fireydude, це не загальне рішення. Це вирішення того, що жорстко кодує сторінки слизька.
Мауро Коллела

22

Переосмислення get_page_template()- це лише швидкий злом. Він не дозволяє обрати шаблон на екрані адміністратора, а сторінку-шпал жорстко закодований у плагін, щоб користувач не міг знати, звідки надходить шаблон.

Кращим рішенням було б дотримуватися цього підручника, який дозволяє зареєструвати шаблон сторінки у зворотному напрямку із плагіна. Тоді він працює як і будь-який інший шаблон.

 /*
 * 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

7

Так, можливо. Я вважаю цей приклад плагіном дуже корисним.

Інший підхід, який мені приходить в голову, - це використання API файлової системи WP для створення файлу шаблону до теми. Я не впевнений, що це найкращий підхід, але я впевнений, що це працює!


Зв'язаний приклад плагін навіть досить добре зафіксований. Мені це подобається. :)
Арвід

0

Жодна з попередніх відповідей не працювала на мою. Ось один, де ви можете обрати свій шаблон у Wordpress admin. Просто помістіть його у свій основний файл плагіну php та змініть template-configurator.phpна ім’я шаблону

//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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.