Примусове перезавантаження редактора-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 Epoch (1 січня 1970 00:00:00 GMT) $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] Вимкнути кеш браузера на панелі Net. У мене навіть було дуже дивне питання, що кешований стиль редактора ненадовго з’являється (у фільтрах, відфільтрованих 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 або плагінами з рядка, що повертається.

Далі йде рішення, яке я придумав після налаштування коду, ви можете використовувати його у вашому файлі function.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.