Свой шаблон записи(single) для плагина в WordPress

Разработка плагинов1 комментарий

Когда наступает время создать пользовательский тип записи в плагине WordPress, всегда возникает одна и та же проблема: нужно создать пользовательский single-[cpt_slug].php файл в папке для тем, в том случае, если не хочется использовать созданный по умолчанию файл single.php из вашей выбранной темы.

В этой статье я бы хотел осветить два аспекта использования пользовательских шаблонов. Первым делом покажу, что мы можем работать с пользовательским файлом, составленным в самом плагине, вместо того, чтобы загружать созданный по умолчанию single.php. Затем я объясню, как создать ваш собственный пользовательский файл в папке для тем.

Многие плагины, как например Easy Digital Downloads или Shopp, используют следующий метод: плагин проверяет, задали ли вы пользовательский шаблон в папке тем; если это тот случай, то файл загружается, если нет, то загружается созданный по умолчанию файл шаблона плагина. В обоих случаях созданный по умолчанию для темы файл single.php не загружается.

 

Задаем плагин и его структуру

Самый первый шаг — создать плагин, давайте назовем его: «Template Chooser» (Выбор шаблона)

Создайте папку «template-chooser» в директории /wp-content/plugius/ имеющую следующую структуру:

template_chooser_structure

 

 

 

 

 

 

Структура плагина

Затем откройте основной файл template-choose.php и вставьте следующий код заголовка плагина:

/*
Plugin Name: CPT template Chooser
Plugin URL: http://wp.tutsplus.com/
Description: Loads a custom template file instead of the default single.php
Version: 0.1
Author: Remi Corson
Author URI: http://wp.tutsplus.com/
*/

 

Задаем константы плагина

Позже в плагине нам понадобится легко извлекать его URL и его путь, вот почему необходимо задать несколько констант:

/*
|--------------------------------------------------------------------------
| CONSTANTS
|--------------------------------------------------------------------------
*/
 
if ( ! defined( 'RC_TC_BASE_FILE' ) )
    define( 'RC_TC_BASE_FILE', __FILE__ );
if ( ! defined( 'RC_TC_BASE_DIR' ) )
    define( 'RC_TC_BASE_DIR', dirname( RC_TC_BASE_FILE ) );
if ( ! defined( 'RC_TC_PLUGIN_URL' ) )
    define( 'RC_TC_PLUGIN_URL', plugin_dir_url( __FILE__ ) );

 

Прописываем пользовательский тип записи

Чтобы пойти дальше, нам придется установить новый пользовательский тип записи.

Давайте создадим пользовательский тип записи «Отзыв» с некоторыми очень простыми сопровождениями и свойствами. Так как цель статьи не научить, как создать пользовательский тип записи, то я буду использовать простой красивый код, разделенный на 3 части: метки, сопровождения и аргументы пользовательского типа записи.

Все это выстраивается в одну функцию:

/*
|--------------------------------------------------------------------------
| DEFINE THE CUSTOM POST TYPE
|--------------------------------------------------------------------------
*/
 
/**
 * Setup testimonial Custom Post Type
 *
 * @since 1.0
*/
 
function rc_tc_setup_post_types() {
 
    // Custom Post Type Labels
    $labels = array(
        'name' => esc_html__( 'Testimonials', 'rc_tc' ),
        'singular_name' => esc_html__( 'Testimonial', 'rc_tc' ),
        'add_new' => esc_html__( 'Add New', 'rc_tc' ),
        'add_new_item' => esc_html__( 'Add New Testimonial', 'rc_tc' ),
        'edit_item' => esc_html__( 'Edit Testimonial', 'rc_tc' ),
        'new_item' => esc_html__( 'New Testimonial', 'rc_tc' ),
        'view_item' => esc_html__( 'View Testimonial', 'rc_tc' ),
        'search_items' => esc_html__( 'Search Testimonial', 'rc_tc' ),
        'not_found' => esc_html__( 'No testimonial found', 'rc_tc' ),
        'not_found_in_trash' => esc_html__( 'No testimonial found in trash', 'rc_tc' ),
        'parent_item_colon' => ''
    );
 
    // Supports
    $supports = array( 'title', 'editor' );
 
    // Custom Post Type Supports
    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => array( 'slug' => 'testimonials', 'with_front' => true ),
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => 25,
        'supports' => $supports,
        'menu_icon' => RC_TC_PLUGIN_URL . '/includes/images/testimonials_icon.png', // you can set your own icon here
    );
 
    // Finally register the "testimonial" custom post type
    register_post_type( 'testimonial' , $args );
}
 
add_action( 'init', 'rc_tc_setup_post_types' );

 

Не используем созданный по умолчанию файл single.php

Теперь, когда наш пользовательский тип записи прописан, нам нужно создать функцию, которая скажет WordPress не использовать из темы файл по умолчанию single.php.

Это все потому, что по умолчанию, при отображении пользовательского типа записи во внешнем интерфейсе, WordPress проверит, существует ли файл single-testimonial.php и загрузит его. Если нет, то он будет искать single.php. Но мы не хотим использовать ни один из них.

Мы хотим, чтобы WordPress загружал пользовательский файл из плагина. Для этого нам придется подключить новую функцию к фильтру «template_include». В этой функции заложена цель – проверять тип сообщения и действовать исходя из результатов проверки:

/*
|--------------------------------------------------------------------------
| FILTERS
|--------------------------------------------------------------------------
*/
 
add_filter( 'template_include', 'rc_tc_template_chooser');
 
/*
|--------------------------------------------------------------------------
| PLUGIN FUNCTIONS
|--------------------------------------------------------------------------
*/
 
/**
 * Returns template file
 *
 * @since 1.0
 */
 
function rc_tc_template_chooser( $template ) {
 
    // Post ID
    $post_id = get_the_ID();
 
    // For all other CPT
    if ( get_post_type( $post_id ) != 'testimonial' ) {
        return $template;
    }
 
    // Else use custom template
    if ( is_single() ) {
        return rc_tc_get_template_hierarchy( 'single' );
    }
 
}

 

Загружаем верный шаблон

Как вы могли заметить, в строчке 33 мы вызываем новую функцию rc_tc_get_template_hierarchy(). Это функция, которая проверит, загрузил ли WordPress пользовательский файл из плагина или шаблон из папки для тем.

Обратите внимание, что, когда я говорю о «шаблоне из папки для тем», я имею в виду пользовательский файл, загруженный вместо single.php.

Допустим, вы хотите не загрузить шаблон, встроенный в плагин, а создать ваш собственный. Все, что вам нужно будет сделать, — это создать новую папку в папке для тем, назвать ее «plugin_template», и внутри этой папки создать файл single.php. Это будет ваш новый файл по умолчанию single.php, загруженный только для отзывов, отображающихся во внешнем интерфейсе.

Вы все еще со мной? Ок, давайте создадим функцию:

/**
 * Get the custom template if is set
 *
 * @since 1.0
 */
 
function rc_tc_get_template_hierarchy( $template ) {
 
    // Get the template slug
    $template_slug = rtrim( $template, '.php' );
    $template = $template_slug . '.php';
 
    // Check if a custom template exists in the theme folder, if not, load the plugin template file
    if ( $theme_file = locate_template( array( 'plugin_template/' . $template ) ) ) {
        $file = $theme_file;
    }
    else {
        $file = RC_TC_BASE_DIR . '/includes/templates/' . $template;
    }
 
    return apply_filters( 'rc_repl_template_' . $template, $file );
}
 
/*
|--------------------------------------------------------------------------
| FILTERS
|--------------------------------------------------------------------------
*/
 
add_filter( 'template_include', 'rc_tc_template_chooser' );

 

Шаблон плагина по умолчанию

Теперь создаем новый отзыв в панели администрирования. Затем открываем includes/templates/ single.php, копируем и вставляем простой код:

<?php get_header(); ?>
 
we are in the plugin custom file
 
<?php get_footer(); ?>

Если вы видите отзыв во внешнем интерфейсе, то должны увидеть надпись «we are in the plugin custom file». Это то, чего мы хотим. Но если файл шаблона плагина не удовлетворяет ваши пожелания или если вы просто хотите создать более индивидуальный дизайн, то можете создать файл в папке для тем.

 

Шаблон темы по умолчанию

Чтобы создать пользовательский шаблон, который не использует шаблон по умолчанию из плагина, вы можете создать новую папку с именем «plugin_templates» в вашей папке для тем. Создайте новый файл, названный single.php, и вставьте этот код:

<?php get_header(); ?>
 
we are in the theme custom file
 
<?php get_footer(); ?>

 

Заключение

Что же именно мы сделали? Итак, мы создали плагин, который прописывает пользовательский тип записи «Отзыв». Мы добились функциональных возможностей, чтобы загрузить пользовательский файл, который хранится в папке для плагинов, вместо созданного по умолчанию single.php или single-testimonial.php из папки для тем. Мы также распорядились загружать пользовательский файл, расположенный в папке «plugin_templates» вместо папки для тем.

Почему это здорово? Потому что когда вы создаете собственный плагин, вы сможете предоставить шаблон по умолчанию для отображения пользовательского типа записи, таким образом, давая право выбора конечному пользователю использовать их собственный шаблон или нет.

Исходный код: template-chooser

Перевод статьи: code.tutsplus.com


1 Комментарий к этой статье

Добавить комментарий

Войти с помощью: