Принудительная перезагрузка editor-style.css


11

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

Например, вот так:

editor-style.css?ver=3393201

Если это для ваших целей разработки, почему бы просто не сделать жесткое обновление в браузере или отключить кеш браузера?
sanchothefat

3
У меня была та же проблема, и жесткое обновление не всегда работает. Кэширование кажется довольно упрямым.
Рэй Гулик

Ответы:


10

Существует крюк для этого: 'mce_css'. Он вызывается, _WP_Editors::editor_settings()и вы получаете все запятые таблицы стилей, разделенные как первый и единственный параметр.

Теперь это легко: используйте глобальную переменную $editor_styles(здесь уже сохранены таблицы стилей редактора вашей темы и родительской темы), добавьте время последней модификации файла в качестве параметра и перестройте строку.

Как плагин :

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: Refresh Editor Stylesheets
 * Description: Enforces fresh editor stylesheets per version parameter.
 * Version:     2012.07.21
 * Author:      Fuxia
 * Plugin URI:  http://wordpress.stackexchange.com/q/33318/73
 * Author URI:  https://fuxia.me
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

    add_filter( 'mce_css', 't5_fresh_editor_style' );

    /**
     * Adds a parameter of the last modified time to all editor stylesheets.
     *
     * @wp-hook mce_css
     * @param  string $css Comma separated stylesheet URIs
     * @return string
     */
    function t5_fresh_editor_style( $css )
    {
        global $editor_styles;

        if ( empty ( $css ) or empty ( $editor_styles ) )
        {
            return $css;
        }

        // Modified copy of _WP_Editors::editor_settings()
        $mce_css   = array();
        $style_uri = get_stylesheet_directory_uri();
        $style_dir = get_stylesheet_directory();

        if ( is_child_theme() )
        {
            $template_uri = get_template_directory_uri();
            $template_dir = get_template_directory();

            foreach ( $editor_styles as $key => $file )
            {
                if ( $file && file_exists( "$template_dir/$file" ) )
                {
                    $mce_css[] = add_query_arg(
                        'version',
                        filemtime( "$template_dir/$file" ),
                        "$template_uri/$file"
                    );
                }
            }
        }

        foreach ( $editor_styles as $file )
        {
            if ( $file && file_exists( "$style_dir/$file" ) )
            {
                $mce_css[] = add_query_arg(
                    'version',
                    filemtime( "$style_dir/$file" ),
                    "$style_uri/$file"
                );
            }
        }

        return implode( ',', $mce_css );
    }

В WordPress 3.9 этот плагин теперь, кажется, ломает кнопки редактирования изображения. У меня не было возможности выяснить почему.
mrwweb

Обновление 2016 : добавив этот код точно как есть (но в моем functions.phpфайле, а не в плагине) с WP 4.6.1, он работает отлично. Кажется, нет никаких проблем с добавлением медиа или редактированием медиа встраиваемых. Это безумие , что вы не можете добавить аргумент add_editor_cssс filemtimeтем , как вы можете с wp_enqueue_styleили даже мусора строки на конец файла ... но это полностью работает.
Indextwo

Спасибо за этот полезный плагин! Я использую его с WP 4.9.6. Единственная ошибка, которую я обнаружил на данный момент, - когда плагин активирован, <!--more-->тег не отображается в TinyMCE. Любые идеи, как я могу решить это?
pa4080

Это нарушает загрузку стилей редактора по умолчанию.
xsonic

9

Я не мог получить ответ toscho к работе для текущей версии WordPress (4.7.2), и что , как представляется, так как массив TinyMCE инициализации имеет cache_suffix набор для 'wp-mce-' . $tinymce_version.

Так что вместо этого вы можете просто перезаписать это с помощью фильтра tiny_mce_before_init , например так:

function wpse33318_tiny_mce_before_init( $mce_init ) {

    $mce_init['cache_suffix'] = 'v=123';

    return $mce_init;    
}
add_filter( 'tiny_mce_before_init', 'wpse33318_tiny_mce_before_init' );

Конечно, это не так хорошо filemtime(), но, по крайней мере, это работает в 4.7.2.

Примечание. Это также добавляет кеш-буфер к другим стилям редактора (например, skin.min.css, content.min.css, dashicons.min.css и wp-content.css).


2
Если вы находитесь в активном тестировании и разработке, я бы добавил номер версии, который всегда будет другим. Один из способов сделать это - использовать секунды с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу) $mce_init['cache_suffix'] = "v=" . time(); или что-то еще более простое $mce_init['cache_suffix'] = "v=" . rand(100000000,999999999);
roberthuttinger,

6

Вместо того, чтобы просто вызывать add_editor_styleваш CSS-файл, добавьте параметр строки запроса кеша:

add_action('admin_enqueue_scripts', function(){
  if(is_admin()){
    add_editor_style(get_template_directory_uri().'/assets/css/editor.css?1');
  }
});

Пока это самый простой метод, который работает безупречно каждый раз.
antikbd

1
Мне нравится простота этого подхода и тот факт, что он не добавляет строку запроса в другие несвязанные таблицы стилей. Я объединил это с тем, filemtime()чтобы автоматизировать обновление кеша:add_editor_style(get_stylesheet_directory_uri() . '/editor-style.css?v=' . filemtime(get_stylesheet_directory() . '/editor-style.css'));
Джош Харрисон,

Ключевым моментом здесь является всегда использовать абсолютный путь для рассматриваемого (ых) файла (ов) css get_template_directory_uri()при добавлении кеша; иначе это не сработает.
Золи

3

У меня была такая же проблема (2012, WP 3.4.2 !!). Возможные решения, пока эта ошибка существует:

1) Если вы используете firebug, [x] помогает отключить кэш браузера на панели «Сеть». У меня даже была очень странная проблема, что кешированный стиль редактора ненадолго появляется (в фильтре css) в сетевой панели Firebug на долю секунды, а затем снова исчезает. Сделал скриншоты, чтобы доказать себе.

2) помогает очистить кеш браузера. По какой-то причине после этого проблема не появилась снова.

3) И наконец, мой предпочтительный совет, если вы также должны убедиться, что ваши клиенты на промежуточном или живом сервере получат ваши дополнительные улучшения (без всякой раздражающей рекомендации по очистке кэша):

Переместите файл и продолжайте считать:

// add_editor_style('editor-style-01.css'); bump for every deployment
// add_editor_style('editor-style-02.css');
add_editor_style('editor-style-03.css');

Хаки, но надежный.


0

Я предполагаю, что проблема с принятым ответом в последних версиях заключается в том, что $editor_stylesмассив содержит только таблицы стилей, добавленные с использованием темы, поэтому в результате он удаляет из возвращаемой строки остальные таблицы стилей, добавленные ядром WordPress или плагинами.

Ниже приведено решение, которое я придумал после настройки кода, вы можете использовать его в своем файле functions.php. Мое решение использует вложенный цикл и проверяет таблицы стилей, присутствующие в $editor_stylesмассиве, и добавляет последнее измененное время в качестве параметра к строке запроса и обновляет значение в массиве.

add_filter('mce_css', 'fresh_editor_style');

function fresh_editor_style($mce_css_string){
    global $editor_styles;
    $mce_css_list = explode(',', $mce_css_string);

    foreach ($editor_styles as $filename){
        foreach($mce_css_list as $key => $fileurl){
            if(strstr($fileurl, '/' . $filename)){
                $filetime = filemtime(get_stylesheet_directory() . '/' . $filename);
                $mce_css_list[$key] =  add_query_arg('time', $filetime, $fileurl);
            }
        }
    }

    return implode(',', $mce_css_list);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.