Как мне версионировать основной CSS файл?
Это может быть неуместно, сообщите мне, если я что-то упустил.
Четвертый аргумент в wp_enqueue_style()
— это номер версии таблицы стилей. В файле functions.php
вашей темы:
function my_theme_styles() {
// замените "10" на ваш номер версии; увеличивайте его при внесении изменений
wp_enqueue_style('my-theme-style', get_bloginfo('template_directory') . '/style.css', false, 10);
}
add_action('wp_print_styles', 'my_theme_styles');
Требуется, чтобы ваш header.php
содержал вызов wp_head()
, что конечно же вы уже делали. ;)
Это позволяет установить долгие сроки действия заголовков для вашего CSS-файла и принудительно заставить клиентов загружать новый файл, обновляя номер версии. WordPress добавит "?ver=N" к URL вашего CSS-файла.

Добавьте этот код в файл functions.php вашей темы:
function my_cool_style_versioner( $style ){
// Заменяем стандартный style.css на версионированный style-1.css
return str_replace( '/style.css', '/style-1.css', $style );
}
// Применяем фильтр к URI таблицы стилей
add_filter( 'stylesheet_uri', 'my_cool_style_versioner' );

Предполагаю, мне нужно будет вызвать эту функцию откуда-то... (и, думаю, пропущенный / — это ошибка!)

Да, пропущенный слэш был ошибкой, и я также добавил хук фильтра, который вам понадобится.

Также обратите внимание, что по мере увеличения версии второй аргумент ('/style-1.css'
) будет меняться, но первый ('/style.css'
) всегда останется неизменным.

Файл style.css
обязателен для вашей темы WordPress. Именно из него WordPress получает название темы и мета-информацию для меню Внешний вид >> Темы. Однако на самом деле вам не обязательно использовать style.css
в своей теме. Я знаю несколько популярных тем, которые его не используют, и сам применяю его лишь в некоторых своих кастомных дизайнах.
В файле header.php
просто разместите следующий тег вместо стандартной ссылки на таблицу стилей:
<link rel="stylesheet" type="text/css" href="<?php bloginfo('stylesheet_directory'); ?>/style-1.css" />
Это загрузит вашу альтернативную таблицу стилей как основную для страницы, полностью игнорируя стандартный style.css
.

Для ясности: у вас ДОЛЖЕН быть файл style.css в вашей теме WordPress с указанием названия темы. Но вам НЕ нужно загружать этот файл в header.php.

EAMann прав, вам не обязательно использовать файл style.css
для всего вашего CSS.
Для версионирования таблицы стилей и других файлов в вашей теме вы можете добавить это в файл functions.php
function fileVersion($filename)
{
// получаем абсолютный путь к файлу
$pathToFile = TEMPLATEPATH.'/'.$filename;
// проверяем, существует ли файл
if (file_exists($pathToFile))
{
// возвращаем время последнего изменения файла
echo filemtime($pathToFile);
}
else
{
// сообщаем, что файл не найден
echo 'FileNotFound';
}
}
И затем, когда вы создаете ссылку на вашу таблицу стилей, вы можете сделать так:
<link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo( 'stylesheet_url' ); ?>?v=<?php fileVersion('style.css'); ?>" />
Таким образом, вам не нужно вручную обновлять номер версии — каждый раз, когда файл обновляется на сервере, версия автоматически изменится на соответствующую UNIX-метку времени.

Обратите внимание, что не следует использовать строки запроса для управления версиями файлов (прокси-сервера не кэшируют их).
Лучшим решением будет добавление номера версии в имя файла, например:
- style.123.css
- style.124.css
Мой подход заключается в следующем:
Редиректы через .htaccess в Apache
Если вы используете HTML5 boilerplate с Apache, вы можете найти следующий раздел в .htaccess файле:
# ------------------------------------------------------------------------------
# | Управление кэшированием на основе имен файлов |
# ------------------------------------------------------------------------------
# Если вы не используете систему сборки для управления версиями файлов,
# рассмотрите возможность включения следующих директив для перенаправления всех
# запросов вида `/css/style.12345.css` на `/css/style.css`.
# Чтобы понять, почему это важно и лучше, чем `*.css?v231`, прочитайте:
# http://stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpe?g|gif)$ $1.$3 [L]
</IfModule>
(Обычно нужно сначала раскомментировать эти строки)
Файл functions.php темы
Я хотел автоматически использовать версию моей темы для файла стилей, поэтому придумал следующее:
Вы можете добавить это в functions.php вашей темы:
function my_theme_styles() {
$my_theme = wp_get_theme();
$version = str_replace('.','',$my_theme->get( 'Version' ));
$stylesheet = get_bloginfo('stylesheet_directory').'/style.'.$version.'.css';
wp_enqueue_style('my-main', $stylesheet, false, null);
}
add_action('wp_print_styles', 'my_theme_styles');
Обратите внимание, что я указал null
в качестве версии вместо false
, чтобы WordPress не добавлял свою версию в строку запроса.
Результат
Для темы версии 1.0.2 это выводит стиль в таком формате:
<link rel='stylesheet' id='maw-main-css' href='http://www.example.com/wp-content/themes/my-theme/style.102.css' type='text/css' media='all' />
После обновления темы до версии 2.0.0 в style.css, вывод будет следующим:
<link rel='stylesheet' id='maw-main-css' href='http://www.example.com/wp-content/themes/my-theme/style.200.css' type='text/css' media='all' />
Дополнительные заметки
Учтите, что если вы просто удаляете точки из версии, как я сделал, могут возникнуть проблемы с версиями тем, такими как 1.2.23 и 1.22.3, так как обе версии без точек будут иметь вид 1223.
Лучшим решением будет учесть это в файле .htaccess. Например, можно разрешить подчеркивания между числами и заменить точки на них.
Это не тестировалось, но должно работать:
.htaccess
# ------------------------------------------------------------------------------
# | Управление кэшированием на основе имен файлов |
# ------------------------------------------------------------------------------
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.([_\d]+)\.(js|css|png|jpe?g|gif)$ $1.$3 [L]
</IfModule>
functions.php
function my_theme_styles() {
$my_theme = wp_get_theme();
$version = str_replace('.','_',$my_theme->get( 'Version' ));
$stylesheet = get_bloginfo('stylesheet_directory').'/style.'.$version.'.css';
wp_enqueue_style('my-main', $stylesheet, false, null);
}
add_action('wp_print_styles', 'my_theme_styles');

Можно просто использовать style.css
как файл, в котором указывается нужная версия. Просто добавьте:
@import url("style-1.css");
Затем при обновлении версии просто измените на:
@import url("style-2.css");
Что касается сохранения версий, рассматривали ли вы использование Subversion или git? Это позволит вам вести полную историю изменений таблицы стилей. Возможно, я не до конца понимаю причины вашего управления версиями.

Я наткнулся на этот старый вопрос и обнаружил, что все ответы кажутся устаревшими в наши дни.
Я бы просто использовал версию темы, указанную в заголовке файла style.css. Её можно получить с помощью wp_get_theme()->get( 'Version' )
function my_enqueue_styles() {
wp_enqueue_style( 'my-theme-style', get_template_directory_uri() . '/style.css', false, wp_get_theme()->get( 'Version' ) );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_styles' );
Таким образом, номер версии автоматически добавится к URL в виде ?ver=#.##
, и URL изменится, как только версия темы будет увеличена в style.css.

Не уверен, изменилось ли это в WP3, поэтому не могу сказать наверняка, но один из способов — напрямую отредактировать соответствующий php-файл (не знаю, можно ли это сделать через админку):
wp-folder/wp-content/themes/ваша-тема/
И откройте файл header.php
. В этом файле найдите строку:
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />
Чтобы добавить 'версию' к подключаемому стилю (предположим, вы хотите получить что-то вроде: stylesheetURL.css?version=2
), измените её на:
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>?version=2" type="text/css" media="screen" />
Это не самый элегантный способ, так что если есть вариант лучше, я бы и сам с радостью о нём узнал =)
Перечитал ваш вопрос...
Чтобы использовать другой файл стилей styles-1.css
, вы можете просто изменить строку (см. выше) на:
<link rel="stylesheet" href="absolute/or/root-relative/path/to/styles-1.css" type="text/css" media="screen" />
(По сути, заменив <?php ... ?>
на обычный путь к файлу.)

"Это выглядит несколько неуклюже" — да, особенно если я хочу использовать файл с именем "style-1.css"! ;-)

@Bobby Jack, согласен и +1 (хотя я попытался добавить столь же неуклюжий подход для достижения вашей цели). =/

Ладно. Полагаю, я беспокоился, что stylesheet_url может использоваться где-то еще, но на самом деле для этого нет причин, верно? Есть еще момент, что было бы неплохо иметь механизм автоматического обновления, чтобы всегда использовать самую свежую версию файла, но сейчас я просто начинаю выявлять недостатки в своем вопросе :)
