强制重新加载editor-style.css


11

editor-style.css当我手动更改TinyMCE编辑器的样式表时,有没有一种方法可以强制刷新?修改不会立即显示,但是它们将被缓存在管理后端的管理端。

例如这样:

editor-style.css?ver=3393201

如果是出于开发目的,为什么不只是在浏览器中进行硬刷新或关闭浏览器缓存?
sanchothefat 2011年

3
我遇到了同样的问题,并且很难刷新。缓存似乎很固执。
Ray Gulick

Answers:


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 2014年

2016更新functions.php使用WP 4.6.1 完全按原样添加此代码(但在我的文件中而不是在插件中),它完美地工作。添加媒体或内联编辑媒体似乎没有任何问题。令人疯狂的是,您无法add_editor_cssfilemtime的方式添加参数wp_enqueue_style,甚至无法在文件名的末尾添加垃圾字符串...但这完全可行。
indextwo

感谢您提供这个有用的插件!我在WP 4.9.6中使用它。我目前发现的唯一错误是激活插件<!--more-->后,TinyMCE中未显示该标签。有什么想法我该如何解决?
pa4080 '18

这会中断默认编辑器样式的加载。
xsonic

9

对于当前版本的WordPress(4.7.2),我无法获得toscho的答案,这似乎是因为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纪元(1970年1月1日00:00:00 GMT) $mce_init['cache_suffix'] = "v=" . time();$mce_init['cache_suffix'] = "v=" . rand(100000000,999999999);
数秒

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'));
Josh Harrison

这里的关键是get_template_directory_uri(),在附加缓存无效化程序时,始终使用相关css文件的绝对路径(即use )。否则它将无法正常工作。
ZoliSzabó19年

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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.