Проблемы приоритета CSS в дочерних темах без использования !important
Я перевел свой сайт WordPress на использование дочерней темы, но стили родительской темы имеют приоритет над любыми изменениями, которые я делаю в CSS дочерней темы. Я могу обойти это с помощью !important
, однако это временное решение, и дочерняя тема должна работать как основной ресурс сайта.
Например, на моем сайте, граница, которая включает .wp-caption
, имеет тот же цвет, что и фон, используя тег !important
, но без него не работает.
Связано ли это с файлом functions.php?
Вот содержимое моего PHP файла:
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
}

Попробуйте подключить CSS дочерней темы следующим образом:
// Сначала подключаем стили родительской темы, затем дочерней/кастомные стили
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles', PHP_INT_MAX);
function theme_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/styles/child-style.css', array( 'parent-style' ) );
}
Обратите внимание на несколько моментов:
1) PHP_INT_MAX в качестве приоритета, чтобы этот код выполнялся последним
2) get_stylesheet_directory_uri() вместо get_template_directory_uri(), что указывает на папку шаблонов дочерней темы, а не родительской.
Я также добавил подпапку /styles/
, так как обычно храню CSS в подпапке своей темы.
3) Затем идет array( 'parent-style' )
, чтобы сделать CSS родительской темы зависимостью для дочернего CSS. Это приводит к тому, что в разделе head сначала загружается родительская тема, а за ней - дочерняя. Благодаря этому любые одинаковые стили в дочерней теме перезапишут версию из родительской темы.

Большое спасибо, новый массив работает идеально, а также стал чище и понятнее.

до сих пор не работает.. очень странно. 40 минут и как минимум 20 руководств по теме twentysixteen. Не получается переопределить стили. body, select { color: red !important; font-size:200% !important; }

В моем случае помог PHP_INT_MAX. Это заставляет CSS дочерней темы загружаться после родительской.

Краткий ответ: первый параметр каждой функции wp_enqueue_style()
не должен оставаться как 'parent-style' и 'child-style'. Их следует переименовать, чтобы они соответствовали названию родительской темы и её дочерней темы.
Проблема
Если вы не переименуете параметры, дочерняя тема может быть загружена дважды, что приведёт к дублированию правил в Firebug. Изменение значений в неправильном файле может не дать видимого эффекта, из-за чего может показаться, что правила дочерней темы не переопределяют родительские.
Ожидание
Страница Codex о дочерних темах правильно указывает, что если ничего не делать, CSS дочерней темы будет подключён автоматически. Так и происходит, но только его. Работа с CSS немного отличается: вы хотите переопределять, а не заменять. Это логично (так же работают другие файлы темы), но стоило бы добавить примечание.
Решение
Переименуйте параметры. Я делаю это так, чтобы получить немного больше контроля. Обратите внимание, что вместо twentysixteen и twentysixteen-child следует использовать названия вашей темы и дочерней темы:
function theme_enqueue_scripts() {
//ПЕРВОЕ
wp_enqueue_style( 'twentysixteen-style', get_template_directory_uri() . '/style.css' );
//...здесь может быть кастомная очередь .js и .css для плагинов JavaScript и подобного
//ПОСЛЕДНЕЕ
wp_enqueue_style( 'twentysixteen-child-style', get_stylesheet_directory_uri() . '/style.css', array( 'twentysixteen-style' ) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_scripts' );
(Также учтите, что в этом действии вы не можете контролировать порядок загрузки некоторых (или всех?) плагинов WordPress. Они подключаются после.)
Удачной охоты за селекторами ;)

Вы можете использовать более специфичный селектор в CSS вашей дочерней темы, чтобы он имел приоритет.
Вместо:
.wp-caption {
background: #2d2d2d !important;
}
Используйте:
.entry .wp-caption {
background: #2d2d2d;
}
Также убедитесь, что вы подключили таблицу стилей дочерней темы в файле functions.php, если ещё этого не сделали.
http://codex.wordpress.org/Function_Reference/wp_enqueue_style

Решение, предложенное Rambillo, у меня не сработало. Я сделал так, и теперь всё работает:
function my_theme_enqueue_styles() {
wp_enqueue_style( 'name-child-style', get_stylesheet_directory_uri() . '/style.css' );
}
add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles', PHP_INT_MAX );
