Добавление номера версии к основной таблице стилей дочерней темы
В файле header.php я хочу добавить номер версии к таблице стилей, чтобы браузер принудительно обновлял её. Но при работе с дочерней темой её таблица стилей не вызывается явно, WordPress ищет её автоматически. Как и где можно добавить номер версии к таблице стилей дочерней темы?

Я считаю, что лучший способ — оставить таблицу стилей дочерней темы (style.css) пустой, содержащей только необходимые комментарии (такие как название темы, описание и т. д., чтобы WordPress мог распознать вашу тему), а затем создать другой CSS-файл в папке your-theme-name-folder/css/main.css.
После этого в файле function.php вы можете задавать новую «версию» каждый раз при изменении файла:
function my_scripts_and_styles(){
$cache_buster = date("YmdHi", filemtime( get_stylesheet_directory() . '/css/main.css'));
wp_enqueue_style( 'main', get_stylesheet_directory_uri() . '/css/main.css', array(), $cache_buster, 'all' );
}
add_action( 'wp_enqueue_scripts', 'my_scripts_and_styles', 1);
Логика:
Каждый раз при сохранении файла изменяется время его модификации. Новое время передаётся в функцию date для преобразования времени (filemtime возвращает целое число, представляющее время) в формат даты, чтобы получить строку в желаемом формате. В нашем примере время форматируется с точностью до минут. Вы можете изменить его для отслеживания даже секунд, например, "YmdHis"
. Затем новое время модификации файла передаётся в качестве новой версии в wp_enqueue_style
.
Ссылки:

Я предпочитаю использовать версию темы в качестве cache buster. Если использовать $cache_buster = wp_get_theme()->get('Version')
, вы получите версию, указанную в комментариях в файле style.css
. Подробнее см. https://codex.wordpress.org/Function_Reference/wp_get_theme.

Хороший метод, не знал о существовании этой функции. Но опять же, вам придётся вручную менять версию при каждом изменении, что может раздражать, особенно во время разработки (из-за проблем с кешированием). Кроме того, вы обязаны прописывать версию в style.css, даже если импортируете туда свой main.css, что, на мой взгляд, не лучший подход. Также, если вы работаете с SASS, это может усложнить поддержку. И наконец, мне кажется, что проверка времени изменения файла быстрее, чем открытие файла, чтение первых комментариев и поиск версии (не уверен, работает ли wp_get_theme()->get('Version')
именно так).

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

Что вам нужно сделать — это отменить регистрацию основного стиля по его handle (идентификатору), а затем зарегистрировать его заново с вашей версией. В данном случае идентификатор — style-css
.
Вы можете определить нужный handle, посмотрев на ссылку на таблицу стилей в HTML-коде:
<link rel='stylesheet' id='style-css-css' href='http://site-url/wp-content/themes/child-theme/style.css?ver=4.6.1' type='text/css' media='all' />
Здесь id — style-css-css
, что означает, что наш handle — style-css
.
Добавьте этот код в function.php вашей дочерней темы:
function wpse_145141_change_style_version(){
// Сначала отменяем регистрацию основного стиля
wp_deregister_style( 'style-css' );
// Затем добавляем его снова с вашим номером версии
wp_register_style( 'style-css', get_stylesheet_uri(), array(), "НОМЕР_ВЕРСИИ" );
// И наконец подключаем его снова
wp_enqueue_style( 'style-css');
}
add_action( 'wp_enqueue_scripts', 'wpse_145141_change_style_version');

Вы можете обновить версию непосредственно в таблице стилей дочерней темы...
/*
Theme Name: Twenty Fourteen Child
Theme URI: http://example.com/twenty-fourteen-child/
Description: Дочерняя тема Twenty Fourteen
Author: John Doe
Author URI: http://example.com
Template: twentyfourteen
Version: 1.1.2 <---- Обновить здесь
*/

Вы уверены, что это обязательно сбросит кешированные стили и заставит загрузить новую версию, как при добавлении номера версии в header.php?

Да, если вы посмотрите исходный код страницы, то увидите, что query string обновляется при изменении номера версии в style.css вашей дочерней темы.

Отлично. Я создавал вознаграждение за этот вопрос? Мэтт, дай мне знать, если да — я создам его снова и передам тебе. Спасибо!

@drake035 Ты сделал это, да. Это было бы здорово, спасибо, друг :-)

Я понял, что сейчас могу начать только награду в 100, вариант с 50 исчез из списка. 100 - это треть моей репутации, это немного многовато... Очень жаль!

Это все еще работает? У меня изменение версии в style.css дочерней темы не дает эффекта - query string style.css в head все равно выводится как номер версии Wordpress (в данном случае 4.1.1).

Это зависит от того, как настроена ваша тема. Посмотрите ответ @kraftner ниже на странице. Если ваша тема сначала отменяет регистрацию, а затем повторно регистрирует файл, то этот способ не сработает.

Еще раз проверил - теперь версия по умолчанию основана на версии WordPress. Так что этот ответ больше не актуален! (https://github.com/WordPress/WordPress/blob/0fa23c1ac2f46ab79c186f4a295648f990758636/wp-includes/class.wp-styles.php#L32)

Текущий лучший ответ зависит от темы, так как требует, чтобы разработчик темы сделал номер версии дочерней темы переменной, а затем добавил его в child style.css при постановке в очередь. Я видел такое в некоторых темах, но не во многих. Следующий метод работает с любой темой, которая регистрирует стили дочерней темы в functions.php — он не будет работать со старым правилом @import, которое я уже редко встречаю.
В файле functions.php дочерней темы у вас должно быть что-то подобное:
// загрузка стилей дочерней темы
function wp_schools_enqueue_scripts() {
wp_register_style( 'childstyle', get_stylesheet_directory_uri() . '/style.css' );
wp_enqueue_style( 'childstyle' );
}
add_action( 'wp_enqueue_scripts', 'wp_schools_enqueue_scripts', 11);
Если изменить его следующим образом, то при каждом сохранении файла будет добавляться временная метка в качестве номера версии, что позволит каждому изменению таблицы стилей обходить локальный кеш:
// загрузка стилей дочерней темы
function wp_schools_enqueue_scripts() {
wp_register_style(
'childstyle',
get_stylesheet_directory_uri() . '/style.css',
array(),
filemtime( get_stylesheet_directory() . '/style.css' )
);
wp_enqueue_style( 'childstyle' );
}
add_action( 'wp_enqueue_scripts', 'wp_schools_enqueue_scripts', 11);
Надеюсь, это поможет кому-то. Я использую этот метод на каждом сайте, которым активно управляю.

Вместо использования стандартного style.css я обычно применяю wp_enqueue_style в файле functions.php дочерней темы или другом подключаемом PHP-файле. Таким образом, у вас останется style.css в дочерней теме со всеми её деталями, но при этом вы можете иметь отдельный CSS-файл в дочерней теме для фактического стиля дочерней темы (я обычно размещаю его в директории assets/css внутри дочерней темы). Это также позволит вам установить версию CSS с помощью четвёртого параметра. Например:
function theme_name_child_scripts() {
wp_enqueue_style( 'style-name', get_stylesheet_directory_uri() . '/assets/css/child-style.css', array(), '1.0.0', 'screen');
}
add_action( 'wp_enqueue_scripts', 'theme_name_child_scripts' );
Вы можете добавить приоритет к действию, если стили загружаются в неправильном порядке, или работать с параметром зависимости в wp_enqueue_style выше:
add_action( 'wp_enqueue_scripts', 'theme_name_child_scripts', 20 );

Используйте filemtime
для версионирования по изменению файла. Удалите и заново добавьте стили.
- Посмотрите в исходном коде (ctrl + U) и найдите ID CSS дочерней темы без "-css". В данном случае это voyager-default
<link rel='stylesheet' id='voyager-default-css' href='/wp-content/themes/voyager-child-theme/style.css?1606484598' type='text/css' media='all' />
- Используйте этот код (источник), но замените
'style'
на найденную строку (здесь'voyager-default'
)
functions.php дочерней темы
function add_timestamp_to_childtheme_stylesheet() {
wp_dequeue_style( 'style' );
wp_deregister_style( 'style' );
wp_enqueue_style('style', get_stylesheet_uri().'?'.filemtime(get_stylesheet_directory().'/style.css'), array(), null);
}
add_action( 'wp_print_styles', 'add_timestamp_to_childtheme_stylesheet' );
