Forçando o recarregamento de editor-style.css

10

Existe um método para forçar a atualização de editor-style.css quando altero manualmente a folha de estilo do editor TinyMCE? A modificação não aparece imediatamente, mas será armazenada em cache no lado administrativo do back-end de administração.

Por exemplo, assim:

editor-style.css?ver=3393201
    
por keatch 09.11.2011 / 16:26

5 respostas

11

Existe um gancho para isso: 'mce_css' . Ele é chamado em _WP_Editors::editor_settings() e você obtém todas as folhas de estilo carregadas separadas por vírgula como o primeiro e único parâmetro.

Agora é fácil: use a variável global $editor_styles (aqui estão as folhas de estilo do seu tema e do editor pai já armazenadas), adicione o tempo da última modificação do arquivo como um parâmetro e reconstrua a sequência.

Como um plug-in :

<?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 );
    }
    
por fuxia 21.07.2012 / 08:47
7

Não consegui que a resposta de toscho funcionasse para a versão atual do WordPress (4.7.2), e isso parece ser porque o array init do TinyMCE tem um cache_suffix defina como 'wp-mce-' . $tinymce_version .

Então, você pode sobrescrever isso com o filtro tiny_mce_before_init , assim:

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

Claro, isso não é tão bom quanto filemtime() , mas pelo menos isso funciona em 4.7.2.

Nota: Isso também adiciona o cache buster a outros estilos de editor (como skin.min.css, content.min.css, dashicons.min.css e wp-content.css)

    
por icecold_3000 15.02.2017 / 02:51
4

Eu tive o mesmo problema (2012, WP 3.4.2 !!). Possíveis soluções enquanto esse bug está por aí:

1) Se você usar o firebug, [x] Desativar o Cache do navegador no painel Net ajudará. Eu até tive um problema muito estranho, que o estilo de editor em cache brevemente aparece (em um painel de rede Firebug filtrado por CSS) por uma fração de segundo, que desaparece novamente. Tomou screenshots para provar a mim mesmo.

2) Uma limpeza completa do cache do navegador ajuda. Por qualquer motivo, depois disso, o problema não reapareceu.

3) Por último, meu conselho preferido, se você também tiver que ter certeza, ou seja, seus clientes no servidor intermediário ou ao vivo obtenham melhorias incrementais (sem qualquer aviso de limpeza de cache):

Reposicione o arquivo e continue a contar:

// 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');

Hacky, mas confiável.

    
por Frank Nocke 08.11.2012 / 12:35
2

Em vez de apenas chamar add_editor_style com seu arquivo CSS, adicione um parâmetro de string de consulta do cache buster:

add_action('admin_enqueue_scripts', function(){
  if(is_admin()){
    add_editor_style(get_template_directory_uri().'/assets/css/editor.css?1');
  }
});
    
por user67624 21.08.2017 / 06:46
0

O problema com a resposta aceita nas últimas versões que assumo é $editor_styles array contém apenas stylesheets adicionados usando theme, então como resultado ele remove resto das stylesheets adicionadas pelo core wordpress ou plugins da string de retorno.

A seguir está a solução que eu criei depois de ajustar o código, você pode usá-lo em seu arquivo functions.php. Minha solução usa loop aninhado e verifica as folhas de estilo presentes na matriz $editor_styles e acrescenta a hora da última modificação como parâmetro para consultar a sequência e atualiza o valor na matriz.

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);
}
    
por Zorro Here 16.06.2017 / 20:16