Elisseii
@Elisseii
Пишу музыку и код.

Нужно сложить кастомные SLUG файлы шаблонов по папкам, как это сделать в Wordpress?

Всем известно, что в Wordpress можно создавать копии файлов шаблона и тем самым делать разную вёрстку в зависимости от адреса (SLUG) страницы.
К примеру копируем page.php и переименовываем в page-home.php
Точно так же можно сделать header-home.php, только в случае с ним прописать соответствующий слаг в функции get_header('home');

Ну так вот, о чем, я? Вот можно ли эти самые созданные вариации файлов сложить аккуратно в отдельную папку?
К примеру:
theme_name/template-parts/pages/
или
theme_name/template-parts/headers/

Не хочется плодить это всё в общей куче корневой директории темы.
Попробовал сложить в папки по подобным схемам, но wp просто не ищет эти файлы там и не важно что им прописаны комментарии.
с header ещё проблемнее...

В общем посоветуйте как это можно по человечески упаковать, не нарушая корректную работу WP.
мб в functons.php что прописать или у wp уже есть такая возможность, но просто эти папки должны обязательно называться определёнными именами?
  • Вопрос задан
  • 427 просмотров
Решения вопроса 2
deniscopro
@deniscopro Куратор тега WordPress
WordPress-разработчик, denisco.pro
1. Если использование slug не принципиально, то шаблоны страниц можно сложить в папку page-templates. В заголовке файлов прописать Template name: Название шаблона и при редактировании страницы в админ панели выбрать нужный шаблон в выпадалке "Шаблон". Использовать в названии файла "page-" для таких шаблонов не следует.
Более подробно про шаблоны можно почитать в документации.
2. Части шаблонов можно сложить в любую нужную иерархию и затем вызывать с помощью функции get_template_part.
<?php get_template_part('template-parts/headers/header', 'home'); ?>
Ответ написан
zorca
@zorca Куратор тега WordPress
Можно дописать в functions.php своей темы новую логику подключения шаблонов:
https://wp-kama.ru/hook/template_include
add_filter( 'template_include', 'portfolio_page_template', 99 );
function portfolio_page_template( $template ) {
	if( is_page('portfolio')  ){
		if ( $new_template = locate_template( array( 'portfolio-page-template.php' ) ) )
			$template = $new_template ;
	}
	return $template;
}

Или полностью переписать ее:
https://wp-kama.ru/hook/template_redirect
<?php
namespace Oxboot\Theme;
use Brain\Hierarchy\Hierarchy;
use duncan3dc\Laravel\BladeInstance;
use Twig_Loader_Filesystem;
use Twig_Environment;
class View
{
    public function __construct($config)
    {
        add_action('template_redirect', function () use ($config) {
            $templates = (new Hierarchy())->getTemplates();
            $template_engines = $config['view']['template_engines'];
            foreach ($templates as $template) {
                foreach ($template_engines as $template_engine => $template_extension) {
                    $path = OX_THEME_VIEWS."/{$template}{$template_extension}";
                    if (file_exists($path)) {
                        switch ($template_engine) {
                            case 'Blade':
                                $blade = new BladeInstance(OX_THEME_VIEWS, OX_THEME_CACHE.'/blade');
                                echo $blade->render($template);
                                break;
                            case 'Twig':
                                $loader = new Twig_Loader_Filesystem(OX_THEME_VIEWS);
                                $twig = new Twig_Environment($loader, ['cache' => OX_THEME_CACHE.'/twig']);
                                echo $twig->render($template.$template_extension);
                                break;
                            case 'PHP':
                                require $path;
                        }
                        exit;
                    }
                }
            }
        });
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽