Добавление номера версии к основной таблице стилей дочерней темы

21 мая 2014 г., 20:23:29
Просмотры: 28.3K
Голосов: 16

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

0
Все ответы на вопрос 7
4
17

Я считаю, что лучший способ — оставить таблицу стилей дочерней темы (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.

Ссылки:

http://www.php.net/filemtime

http://php.net/manual/en/function.date.php

1 июн. 2014 г. 14:24:56
Комментарии

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

Marcel Stör Marcel Stör
2 янв. 2016 г. 16:45:03

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

Laxmana Laxmana
4 янв. 2016 г. 21:18:45

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

Marcel Stör Marcel Stör
4 янв. 2016 г. 21:28:48

"выпустить" его для пользователей, которые возвращаются на сайт. Новые пользователи видят свежие данные из файла.

ryanrain ryanrain
22 июл. 2017 г. 07:40:14
0
13

Что вам нужно сделать — это отменить регистрацию основного стиля по его 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');
28 мая 2014 г. 11:49:04
9

Вы можете обновить версию непосредственно в таблице стилей дочерней темы...

/*
 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 <---- Обновить здесь
*/
28 мая 2014 г. 14:49:17
Комментарии

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

drake035 drake035
30 мая 2014 г. 13:35:36

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

Matt Royal Matt Royal
30 мая 2014 г. 14:36:46

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

drake035 drake035
10 июн. 2014 г. 14:59:06

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

Matt Royal Matt Royal
10 июн. 2014 г. 16:37:39

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

drake035 drake035
14 июн. 2014 г. 21:22:47

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

Tim Malone Tim Malone
17 апр. 2015 г. 11:24:13

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

Matt Royal Matt Royal
18 апр. 2015 г. 11:24:24

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

Matt Royal Matt Royal
18 апр. 2015 г. 11:39:01

@MattRoyal, вы правы, этот подход больше не работает. Пожалуйста, обновите ваш ответ соответствующим образом. Это принятый ответ, люди будут пробовать этот способ, но он не сработает для них.

panepeter panepeter
8 июл. 2020 г. 09:37:59
Показать остальные 4 комментариев
0

Текущий лучший ответ зависит от темы, так как требует, чтобы разработчик темы сделал номер версии дочерней темы переменной, а затем добавил его в 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);

Надеюсь, это поможет кому-то. Я использую этот метод на каждом сайте, которым активно управляю.

28 дек. 2018 г. 21:06:01
0

Вместо использования стандартного 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 );
27 мая 2014 г. 20:30:55
0

Используйте filemtime для версионирования по изменению файла. Удалите и заново добавьте стили.

  1. Посмотрите в исходном коде (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' />

  1. Используйте этот код (источник), но замените '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' );
27 нояб. 2020 г. 16:03:00
1

Я считаю, что если вы используете редактор тем Wordpress для редактирования таблицы стилей дочерней темы, то при каждом сохранении файла автоматически добавляется новый номер версии.

21 мая 2014 г. 20:44:53
Комментарии

Правильно, но я не использую редактор WP для работы с моими таблицами стилей..

drake035 drake035
26 мая 2014 г. 21:23:51