Как обойти кеширование style.css дочерней темы

2 янв. 2016 г., 01:35:51
Просмотры: 14.5K
Голосов: 13

Мой вопрос может затрагивать несколько аспектов, но по сути он прост: как убедиться, что изменения в файле style.css дочерней темы правильно распространяются через все уровни кеширования?

Я читал в нескольких источниках, что WordPress должен/может добавлять версию WP в параметр nnn при запросе ресурса вида http://host/wp-content/themes/theme-child/style.css?ver=nnn. В моей установке на http://frightanic.com/ я вижу, что вместо этого используется версия родительской темы. У меня установлены W3 Total Cache и CDN, но даже если их отключить, запрашивается ресурс вида wp-content/themes/frightanic/style.css?ver=3.0.7, где 3.0.7 — это версия родительской темы Decode.

Но как бы то ни было, если я обновляю CSS своей дочерней темы, не обновляя при этом WordPress или родительскую тему, как я могу принудительно обновить кеш?

1
Комментарии

http://wordpress.stackexchange.com/a/147215/8105

montrealist montrealist
2 янв. 2016 г. 01:46:42
Все ответы на вопрос 4
4
12

Комментарий @dalbaeb в итоге привел к содержательным обсуждениям и рабочему решению. Большое спасибо!

Я считаю, что причина, по которой CSS моего дочерней темы загружался с параметром 'ver=<parent-theme-version>, заключалась в том, что я строго следовал документации WP Codex о дочерних темах. В моем functions.php был следующий код:

add_action('wp_enqueue_scripts', 'theme_enqueue_styles');
function theme_enqueue_styles() {
  wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css');
}

Код, который я в итоге использовал, был впервые упомянут в https://wordpress.stackexchange.com/a/182023/30783, но множество сайтов в интернете просто скопировали его (не указывая первоисточник).

// Убеждаемся, что дочерняя тема имеет независимую версию и может сбрасывать кэш: https://wordpress.stackexchange.com/a/182023/30783
// Фильтруем get_stylesheet_uri(), чтобы возвращать таблицу стилей родительской темы
add_filter('stylesheet_uri', 'use_parent_theme_stylesheet');
// Подключаем скрипты и стили этой темы (после родительской темы)
add_action('wp_enqueue_scripts', 'my_theme_styles', 20);

function use_parent_theme_stylesheet()
{
    // Используем таблицу стилей родительской темы
    return get_template_directory_uri() . '/style.css';
}

function my_theme_styles()
{
    $themeVersion = wp_get_theme()->get('Version');

    // Подключаем наш style.css с собственной версией
    wp_enqueue_style('child-theme-style', get_stylesheet_directory_uri() . '/style.css',
        array(), $themeVersion);
}

Обновление от 26.01.2017

Текущее руководство по темам WordPress теперь содержит правильное решение: https://developer.wordpress.org/themes/advanced-topics/child-themes/#3-enqueue-stylesheet

2 янв. 2016 г. 16:51:50
Комментарии

Отлично! Если вы сами ответили на свой вопрос, можно принять свой собственный ответ как решение.

phatskat phatskat
4 янв. 2016 г. 17:21:52

Я знаю, но нужно подождать 2 дня, пока эта функция станет доступна.

Marcel Stör Marcel Stör
4 янв. 2016 г. 18:25:11

Текущее руководство по темам WP теперь содержит правильное решение: https://developer.wordpress.org/themes/advanced-topics/child-themes/#3-enqueue-stylesheet

Marcel Stör Marcel Stör
26 янв. 2017 г. 00:02:58

@MarcelStör Не могли бы вы указать, где именно на указанной странице упоминается `cache busting`, потому что я не нашел этого

Eric Hepperle - CodeSlayer2010 Eric Hepperle - CodeSlayer2010
27 авг. 2024 г. 19:51:17
1

Это хорошо работает, когда вы добавляете код напрямую в ваш header.php и обновляете кеш каждый раз при изменении css-файла:

<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); echo '?' . filemtime( get_stylesheet_directory() . '/style.css'); ?>" type="text/css" media="screen" />

В результате выводится: style.css?324932684, где число — это время последнего изменения файла

30 сент. 2016 г. 20:23:04
Комментарии

Стили должны подключаться с использованием wp_enqueue_style, а не жёстко прописываться в коде.

bravokeyl bravokeyl
30 сент. 2016 г. 20:29:52
1

Это также может сработать. Используя функцию rand в PHP:

function theme_enqueue_styles() {

    $parent_style = 'parent-style'; // Родительский стиль

    wp_enqueue_style( $parent_style, get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'child-style',
        get_stylesheet_directory_uri() . '/style.css?'.rand(), // Добавляем случайное число для предотвращения кэширования
        array( $parent_style )
    );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' ); // Подключение стилей
22 дек. 2016 г. 14:08:42
Комментарии

Это не очень хорошая идея, так как вы хотите, чтобы эти ресурсы кэшировались браузером до тех пор, пока они не изменятся.

Marcel Stör Marcel Stör
22 дек. 2016 г. 17:44:27
0

В WordPress теперь это реализовано с помощью функции.

add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' );
function my_theme_enqueue_styles() {
    wp_enqueue_style( 'child-style', get_stylesheet_uri(),
        array( 'parenthandle' ), 
        wp_get_theme()->get('Version') // это работает только если у вас указана Version в заголовке стиля
    );
}

Использует Version: 1.0.0 в вашей таблице стилей Подключение таблицы стилей с версией

24 авг. 2020 г. 13:12:42