Фильтр template_include в WordPress позволяет разработчикам изменять путь к файлу шаблона, который будет использоваться для отображения текущей страницы. Этот фильтр активируется непосредственно перед подключением шаблона, что дает возможность динамически подменить его, основываясь на условиях или параметрах URL.
apply_filters( ‘template_include’, string $template )
Фильтр template_include может быть полезен, когда нужно задать особый шаблон для конкретной страницы, записи, пользовательского типа записи, категории или таксономии. Этот метод гибче и не требует создания отдельного файла шаблона в теме — путь к шаблону можно назначить программно.
Параметры
$template(строка): Путь к файлу шаблона, который должен быть подключен WordPress.
Пример 1: Использование кастомного шаблона для страницы «Портфолио»
Если вам нужно назначить уникальный шаблон для страницы с ярлыком «portfolio», вы можете использовать следующий код:
function custom_portfolio_template($template) {
    if (is_page('portfolio')) {
        $custom_template = locate_template(array('custom-portfolio-template.php'));
        if ($custom_template) {
            return $custom_template;
        }
    }
    return $template;
}
add_filter('template_include', 'custom_portfolio_template', 99);
Здесь WordPress проверяет, является ли текущая страница «portfolio», и если да, подключает custom-portfolio-template.php.
Пример 2: Назначение шаблона для всех дочерних страниц
Этот пример покажет, как назначить шаблон для родительской страницы и всех её дочерних страниц. Допустим, родительская страница имеет ID 30.
function parent_and_children_template($template) {
    $parent_page_id = 30;
    $post = get_queried_object();
    if (is_page($parent_page_id) || $parent_page_id === $post->post_parent) {
        return get_theme_file_path('templates/custom-parent-template.php');
    }
    return $template;
}
add_filter('template_include', 'parent_and_children_template', 10);
Этот код проверяет, является ли текущая страница родительской или дочерней страницей с ID 30, и если да, подключает шаблон custom-parent-template.php.
Пример 3: Использование шаблона для архива пользовательского типа записей
Иногда требуется подключить кастомный шаблон для архива определенного типа записи, например, book.
function custom_post_type_archive_template($template) {
    if (is_post_type_archive('book')) {
        $custom_template = locate_template(array('archive-book-custom.php'));
        if ($custom_template) {
            return $custom_template;
        }
    }
    return $template;
}
add_filter('template_include', 'custom_post_type_archive_template', 99);
Этот пример подключает шаблон archive-book-custom.php для архива записей типа book.
Пример 4: Условная маршрутизация шаблонов на основе параметров URL
Можно использовать фильтр template_include для выбора шаблона в зависимости от параметров URL, например, ?action=view.
function conditional_template_routing($template) {
    $action = isset($_GET['action']) ? $_GET['action'] : 'default';
    switch ($action) {
        case 'view':
            $template = __DIR__ . '/templates/view-template.php';
            break;
        case 'edit':
            $template = __DIR__ . '/templates/edit-template.php';
            break;
        default:
            $template = __DIR__ . '/templates/default-template.php';
            break;
    }
    return $template;
}
add_filter('template_include', 'conditional_template_routing');
Здесь, в зависимости от значения action в URL, WordPress подключит нужный шаблон.
Пример 5: Проверка текущего подключаемого шаблона
Если требуется отладка, можно вывести текущий файл шаблона, чтобы проверить, какой именно подключается WordPress.
function display_current_template($template) {
    echo '<div style="color:blue;">Current Template: ' . basename($template) . '</div>';
    return $template;
}
add_filter('template_include', 'display_current_template', 99);
Этот код выведет имя текущего шаблона на экран, что может быть полезно для отладки.
Пример 6: Логирование подключаемого шаблона
Если нужно записывать путь подключаемого шаблона в лог для последующего анализа, можно использовать следующий код:
function log_template_path($template) {
    error_log('Using template: ' . $template);
    return $template;
}
add_filter('template_include', 'log_template_path');
Этот код отправит сообщение с путем к шаблону в лог ошибок сервера, что поможет отслеживать, какой шаблон был загружен.
Пример 7: Загрузка функции в качестве шаблона (альтернативный метод)
Хотя это нестандартный подход, иногда можно использовать функцию в качестве шаблона, если не требуется создавать отдельный файл.
function function_as_template($template) {
    if (is_singular('product')) {
        custom_product_template();
        exit;
    }
    return $template;
}
add_filter('template_include', 'function_as_template');
function custom_product_template() {
    get_header();
    echo '<h1>Кастомный шаблон для продукта</h1>';
    echo '<p>Здесь отображается информация о продукте.</p>';
    get_footer();
}
Этот код подключает шаблон продукта, реализованный в функции custom_product_template. Хотя такой способ возможен, он нарушает стандарты и рекомендуется только для временного решения.
Заключение
Фильтр template_include позволяет гибко управлять загрузкой шаблонов в WordPress. Он может использоваться для создания индивидуальных шаблонов для страниц, архива, постов и таксономий. С его помощью можно настроить маршрут для шаблонов, сделать отладку, использовать условные теги и параметры URL. Этот фильтр — мощный инструмент для создания уникальных тем и плагинов, позволяющий настроить отображение сайта максимально гибко.