Forzando la recarga de editor-style.css

10

¿Existe un método para forzar la actualización de editor-style.css , cuando cambio manualmente la hoja de estilo para el editor TinyMCE? La modificación no se muestra de inmediato, pero se almacenarán en caché en el lado de administración del backend de administración.

Por ejemplo, como este:

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

5 respuestas

11

Hay un gancho para eso: 'mce_css' . Se llama en _WP_Editors::editor_settings() y obtiene todas las hojas de estilo cargadas separadas por comas como el primer y único parámetro.

Ahora es fácil: use la variable global $editor_styles (aquí están las hojas de estilo del editor de su tema principal y padre ya almacenadas), agregue la hora de la última modificación del archivo como parámetro y reconstruya la cadena.

Como un complemento :

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

No pude conseguir que la respuesta de toscho funcione para la versión actual de WordPress (4.7.2), y parece ser que la matriz de inicio TinyMCE tiene una cache_suffix establecido en 'wp-mce-' . $tinymce_version .

Entonces, en lugar de eso, puedes sobrescribirlo con el filtro tiny_mce_before_init , así:

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

Por supuesto, esto no es tan bueno como filemtime() , pero al menos esto funciona en 4.7.2.

Nota: Esto también agrega el destructor de caché a otros estilos de editor (como skin.min.css, content.min.css, dashicons.min.css y wp-content.css)

    
respondido por el icecold_3000 15.02.2017 - 02:51
4

Tuve el mismo problema (2012, WP 3.4.2 !!). Posibles soluciones mientras este error esté presente:

1) Si usa firebug, [x] Desactivar la caché del navegador en el panel de red ayuda. Incluso tuve un problema muy extraño: el estilo de editor de caché aparece brevemente (en un filtro de red Firebug con filtro css) por una fracción de segundo, que desaparece nuevamente. Tomé capturas de pantalla para probarme a mí mismo.

2) Un borrado completo de la caché del navegador ayuda. Por alguna razón posterior, el problema no volvió a aparecer.

3) Por último, mi consejo preferido, si también debe asegurarse, es decir, que sus clientes en el servidor de prueba o en vivo obtengan sus mejoras incrementales (sin ningún consejo de borrado de caché molesto):

Reubique el archivo y siga contando:

// 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, pero confiable.

    
respondido por el Frank Nocke 08.11.2012 - 12:35
2

En lugar de simplemente llamar a add_editor_style con su archivo CSS, agregue un parámetro de cadena de consulta del destructor de caché:

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

El problema con la respuesta aceptada en las últimas versiones que asumo es que $editor_styles array solo contiene hojas de estilo agregadas mediante el tema, por lo que elimina el resto de las hojas de estilo agregadas por wordpress o complementos de la cadena que regresa.

La siguiente es la solución que se me ocurrió después de ajustar el código, puedes usarlo en tu archivo functions.php. Mi solución usa un bucle anidado y comprueba las hojas de estilo presentes en $editor_styles array, y agrega la última hora modificada como parámetro para consultar la cadena y actualiza el valor en array.

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

Lea otras preguntas en las etiquetas