Давно хотел разобраться с этой темой и теперь появилась необходимость сделать поддержку дочерних тем на мультисайте.
Создание дочерней темы
Для создания дочерней темы нужно:
- Создать папку с дочерней темой в папке /themes/ (в той же папке где и родительская). Необязательно называть ее theme-child, но так будет удобнее.
- Обязательный файл который должен содержаться в дочерней теме — это style.css и в начале этого файла, вот такая запись:
/* Theme Name: Meisterwerk 2.0 Ivmontan Template: meisterwerk-2 */
В строке Template должно быть указано не название темы, а как называется папка в которой она храниться (чувствительность к регистру). Иногда они не совпадают.
В дочерней теме могут также дублироваться и остальные шаблоны, стили и скрипты, чтобы их можно было изменять локально. Нельзя дублировать functions.php с теми же функциями — из-за этого произойдет 500 ошибка.
Перезапись style.css
Т.к. обычно я подключаю основной стиль (style.css) из functions.php
function header_enqueue_style() {
wp_enqueue_style( 'style', get_template_directory_uri() . '/style.css' , array( ), '1.0' , 'screen' );
}
add_action( 'wp_print_styles', 'header_enqueue_style' );
а functions из дочерней и родительской загружаются последовательно, то дочерний style.css затирался функцией. При этом дочерний style.css наоборот должен полностью заменять родительский.
Решение:
// Подключение дочернего стиля
add_action( 'wp_enqueue_scripts', 'theme_enqueue_child_styles' );
function theme_enqueue_child_styles(){
wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array('style') );
}
Мы подключаем стиль, только при условии, что основной стиль загружен. А т.к. дочерний стиль будет подгружаться после основного он будет перекрывать его стили.
Функция или скрипт только для главного сайта
Для дочерних тем функции и скрипты добавляются непосредственно в файлах подтемы, но как добавить скрипт или функцию конкретно для главной темы, чтобы она не проецировалась на дочерние?
Это делается условием по ID сайта (1 — это главный, также можно делать и для дочерних сайтов):
if ( get_current_blog_id() == 1 ) {
function wptuts_scripts_main() {
wp_enqueue_script( 'main-site-scripts', get_template_directory_uri() . '/js/main-site-scripts.js' , array( ), '1.0', true );
}
add_action( 'wp_enqueue_scripts', 'wptuts_scripts_main', 10 );
}
В этом примере привязывается скрипты для главного сайта, но также можно прописать любую другую функцию.
[site-socialshare]