Статьи

Шаблоны плагинов в WordPress

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

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

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


Самый первый шаг — создать плагин, назовем его « Выбор шаблона ». Создайте папку « template-chooser » в / wp-content / plugins / со следующей структурой:

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

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

1
2
3
4
5
6
7
8
/*
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 плагина и его путь, поэтому нам нужно определить несколько констант:

01
02
03
04
05
06
07
08
09
10
11
12
/*
|—————————————————————————
|
|—————————————————————————
*/
 
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__ ) );

Чтобы пойти дальше, нам нужно настроить новый пользовательский тип записи, давайте создадим CPT « Отзыв », с некоторыми базовыми опорами и функциями. Поскольку цель публикации не состоит в том, чтобы научить создавать пользовательский тип записи, я буду использовать довольно простой код, разделенный на 3 части: метки пользовательских типов записей, опоры и аргументы пользовательских типов записей. Все, что встроено в одну функцию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
|—————————————————————————
|
|—————————————————————————
*/
 
/**
 * 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 .
    );
 
    // Finally register the «testimonial» custom post type
    register_post_type( ‘testimonial’ , $args );
}
 
add_action( ‘init’, ‘rc_tc_setup_post_types’ );

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
|—————————————————————————
|
|—————————————————————————
*/
 
add_filter( ‘template_include’, ‘rc_tc_template_chooser’);
 
/*
|—————————————————————————
|
|—————————————————————————
*/
 
/**
 * 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 » и в этой папке создать единый Файл .php . Это будет ваш новый файл single.php по умолчанию, загруженный только для отзывов, отображаемых в веб -интерфейсе.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 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 .
 
    // 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 .
    }
 
    return apply_filters( ‘rc_repl_template_’ . $template, $file );
}
 
/*
|—————————————————————————
|
|—————————————————————————
*/
 
add_filter( ‘template_include’, ‘rc_tc_template_chooser’ );

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

1
2
3
4
5
<?php get_header();
 
we are in the plugin custom file
 
<?php get_footer();

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


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

1
2
3
4
5
<?php get_header();
 
we are in the theme custom file
 
<?php get_footer();

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

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