Поддержка Проблемы и решения Произвольные типы записей

  • Здравствуйте.

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

    Хочу добавить произвольный тип записи «События» и две иерархические таксономии «Календари» и «Города». Соответственно если «переводить в файлы» получается:

    1. events.php — вывод всех созданных событий
    2. singke-events.php — вывод одного события
    3. taxonomy-calendars.php — вывод таксономии календари (дочерние элементы, пример: Марафоны 2019 → Забеги в феврале и т.д.)
    4. taxonomy-cities.php — вывод таксономии города (дочерних элементов нет)

    *Ещё файл custom-type-events, но его я создал для удобства и что бы не городить огород в funtions.php.

    Если все эти файлы оставлять в корне темы, все работает выводятся все события, одно событие, страницы с таксономиями. Но при попытке сгруппировать для удобства эти файлы в отдельную папку (/calendar/) сразу же появились проблемы, которые частично и не смог справиться с одним моментом.

    После перемещения всех файлов из корня темы в папку /calendar/, в functions.php создал функцию подключения шаблонов страниц через template_include:

    
    add_filter('template_include', 'my_template');
    function my_template($template)
    {
    #Подключение events.php
        if (is_page('events')) {
            if ($new_template = locate_template(array('/calendar/events.php')))
                return $new_template;
        }
    
    #Подключение event.php
        global $post;
        if( $post->post_type == 'events' ){
            return get_stylesheet_directory() . '/book-tpl.php';
        }
    
    #Подключение taxonomy-cities.php
        if (is_tax('cities')) {
            return get_template_directory() . '/calendar/taxonomy-cities.php';
        }
    
    #Подключение taxonomy-calendars.php
        if (is_tax('calendars')) {
            return get_template_directory() . '/calendar/taxonomy-calendars.php';
        }
    
        return $template;
    }
    

    Вывод списка событий и конкретного события, как я и говорил — работаю. Но при попытке перейти по таксономии «города или календари», подгружается шаблон single-events.php (смотрел по query monitor, это шаблон для вывода конретного события).

    Подскажите что я делаю не так? Или при создание произвольного типа записи + таксономий к нему обязательно нужно оставлять файлы в корне темы? Ну тогда если я заочу ввести несколько типов записи, получиться же каша 🙁

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

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Совсем забыл, на всякий случай прикреплю код с регистрацией таксономий и типа записи (может в них напортачил)

    Регистрация произвольного типа записи

    
    add_action('init', 'post_types_events');
    function post_types_events()
    {
        register_post_type('events', array(
            'label' => '',
            'labels' => array(
                'name' => 'События',
                'singular_name' => 'Событие',
                'add_new' => 'Добавить событие',
                'add_new_item' => 'Добавление события',
                'edit_item' => 'Редактировать событие',
                'new_item' => 'Новое событие',
                'view_item' => 'Смотреть событие',
                'search_items' => 'Искать события',
                'not_found' => 'Не найдено',
                'not_found_in_trash' => 'Не найдено в корзине',
                'parent_item_colon' => '',
                'menu_name' => 'События',
            ),
            'description' => 'Календарь событий на WordPress',
            'public' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_in_admin_bar' => true,
            'show_in_nav_menus' => true,
            'show_in_rest' => true,
            'menu_position' => 5,
            'menu_icon' => 'dashicons-calendar-alt',
            'hierarchical' => true,
            'query_var' => true,
            'supports' => array('title', 'custom-fields'),
            'has_archive' => true,
            'rewrite' => true,
            'taxonomies' => array('calendars', 'cities'),
        ));
    }
    

    Регистрация таксономии «Календари»

    
    add_action('init', 'calendars_event_taxonomy');
    function calendars_event_taxonomy()
    {
        register_taxonomy('calendars', array('events'), array(
            'label' => '',
            'labels' => array(
                'name' => 'Календари',
                'singular_name' => 'Календарь',
                'search_items' => 'Искать календарь',
                'all_items' => 'Все календари',
                'view_item ' => 'Смотреть календарь',
                'parent_item' => 'Родительский календарь',
                'parent_item_colon' => 'Родительский календарь:',
                'edit_item' => 'Редактировать календарь',
                'update_item' => 'Обновить календарь',
                'add_new_item' => 'Добавить календрь',
                'new_item_name' => 'Новое имя календаря',
                'menu_name' => 'Календари',
            ),
            'description' => '',
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_tagcloud' => true,
            'hierarchical' => true,
            'rewrite' => true,
            'query_var' => 'calendars',
        ));
    }
    

    Регистрация таксономии «Города»

    
    add_action('init', 'cities_event_taxonomy');
    function cities_event_taxonomy()
    {
        register_taxonomy('cities', ['events'], [
            'label' => '',
            'labels' => [
                'name' => 'Страны',
                'singular_name' => 'Страна',
                'search_items' => 'Искать страну',
                'all_items' => 'Все страны',
                'view_item ' => 'Смотреть страну',
                'parent_item' => 'Родительская страна',
                'parent_item_colon' => 'Родительская страна:',
                'edit_item' => 'Редактировать страну',
                'update_item' => 'Обновить страну',
                'add_new_item' => 'Добавить страну',
                'new_item_name' => 'Новое имя страны',
                'menu_name' => 'Страны',
            ],
            'description' => '',
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_tagcloud' => true,
            'hierarchical' => true,
            'rewrite' => true,
            'query_var' => 'cities',
        ]);
    }
    
    • Ответ изменён 4 месяца, 3 недели назад пользователем Aleksandr Yurchenko.

    Или при создание произвольного типа записи + таксономий к нему обязательно нужно оставлять файлы в корне темы?

    Для функционирования Темы достаточно двух файлов: index.php c Циклом и style.css с заголовком Theme Name. Остальное по желанию.

    WordPress не лазит по всем субдиректориям Темы в поисках шаблонов. Если релевантного выводимой сущности шаблона нет в корне Темы, будет использован index.php (который обязательно есть, потому что без него Тема не активируется)

    Матчасть: Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources

Просмотр 2 ответов — с 1 по 2 (всего 2)