Erzwingen des erneuten Ladens von editor-style.css

11

Gibt es eine Methode, um die Aktualisierung zu erzwingen editor-style.css, wenn ich das Stylesheet für den TinyMCE-Editor manuell ändere? Änderungen werden nicht sofort angezeigt, sie werden jedoch auf der Administrationsseite des Administrations-Backends zwischengespeichert.

Zum Beispiel so:

editor-style.css?ver=3393201
Keatch
quelle
Wenn es für Ihre Entwicklungszwecke ist, warum nicht einfach eine harte Aktualisierung im Browser durchführen oder den Browser-Cache deaktivieren?
Sanchothefat
3
Ich hatte das gleiche Problem und eine harte Aktualisierung funktioniert nicht immer. Das Caching scheint ziemlich hartnäckig zu sein.
Ray Gulick

Antworten:

10

Dafür gibt es einen Haken : 'mce_css'. Es wird aufgerufen _WP_Editors::editor_settings()und Sie erhalten alle geladenen Stylesheets als ersten und einzigen Parameter durch Kommas getrennt.

Jetzt ist es ganz einfach: Verwenden Sie die globale Variable $editor_styles(hier sind die Editor-Stylesheets Ihres Themas und des übergeordneten Themas bereits gespeichert), fügen Sie den Zeitpunkt der letzten Änderung der Datei als Parameter hinzu und erstellen Sie die Zeichenfolge neu.

Als Plugin :

<?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 );
    }
Fuxia
quelle
In WordPress 3.9 scheint dieses Plugin nun die Bildbearbeitungsschaltflächen zu beschädigen. Ich hatte keine Gelegenheit herauszufinden, warum.
Mrwweb
Update 2016 : Das Hinzufügen dieses Codes wie er ist (aber in meiner functions.phpDatei und nicht in einem Plugin) mit WP 4.6.1 funktioniert einwandfrei. Es scheint keine Probleme beim Hinzufügen von Medien oder Bearbeiten von Medien inline zu geben. Es ist verrückt , dass Sie nicht ein Argument hinzufügen können add_editor_cssmit filemtimeder Art und Weise kann man mit wp_enqueue_styleoder sogar einem Müll String am Ende des Dateinamen ... aber das ist völlig funktioniert.
Indextwo
Vielen Dank für dieses nützliche Plugin! Ich benutze es mit WP 4.9.6. Der einzige Fehler, den ich im Moment gefunden habe, ist, dass das <!--more-->Tag bei Aktivierung des Plugins nicht in TinyMCE angezeigt wird. Irgendwelche Ideen, wie ich das lösen kann?
pa4080
Dadurch wird das Laden der Standardeditorstile unterbrochen.
Xsonic
9

Ich konnte die Antwort von toscho für die aktuelle Version von WordPress (4.7.2) nicht erhalten, und das scheint daran zu liegen, dass für das TinyMCE-Init-Array ein cache_suffix festgelegt ist 'wp-mce-' . $tinymce_version.

Stattdessen können Sie dies einfach mit dem Filter tiny_mce_before_init überschreiben , wie folgt :

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

Das ist natürlich nicht annähernd so gut wie filemtime(), aber zumindest funktioniert dies in 4.7.2.

Hinweis: Dadurch wird der Cache-Buster auch anderen Editorstilen hinzugefügt (z. B. skin.min.css, content.min.css, dashicons.min.css und wp-content.css).

icecold_3000
quelle
2
Wenn Sie aktiv testen und entwickeln, würde ich eine Versionsnummer hinzufügen, die immer anders sein wird. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Sekunden seit der Unix-Epoche (1. Januar 1970, 00:00:00 GMT) $mce_init['cache_suffix'] = "v=" . time(); oder etwas noch Einfacherem wie $mce_init['cache_suffix'] = "v=" . rand(100000000,999999999);
Roberthuttinger,
6

Anstatt nur add_editor_stylemit Ihrer CSS-Datei aufzurufen , fügen Sie einen Cache-Buster-Abfragezeichenfolgenparameter hinzu:

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

quelle
Dies ist die bisher einfachste Methode, die jedes Mal einwandfrei funktioniert.
Antikbd
1
Ich mag die Einfachheit dieses Ansatzes und die Tatsache, dass die Abfragezeichenfolge nicht zu anderen nicht verwandten Stylesheets hinzugefügt wird. Ich kombinierte dies mit, filemtime()um Cache-Busting-Updates zu automatisieren:add_editor_style(get_stylesheet_directory_uri() . '/editor-style.css?v=' . filemtime(get_stylesheet_directory() . '/editor-style.css'));
Josh Harrison
Der Schlüssel hier ist, immer den absoluten Pfad für die fraglichen CSS-Dateien zu verwenden (dh zu verwenden get_template_directory_uri()), wenn ein Cache-Buster angehängt wird. sonst wird es nicht funktionieren.
Zoli Szabó
3

Ich hatte das gleiche Problem (2012, WP 3.4.2 !!). Mögliche Lösungen, während dieser Fehler vorliegt:

1) Wenn Sie Firebug verwenden, hilft [x] Browser-Cache im Netzfenster deaktivieren. Ich hatte sogar ein sehr seltsames Problem, dass der zwischengespeicherte Editor-Stil für den Bruchteil einer Sekunde kurz (in einem CSS-gefilterten) Firebug-Netz angezeigt wird und dann wieder verschwindet. Habe Screenshots gemacht, um es mir selbst zu beweisen.

2) Ein vollständiges Löschen des Browser-Cache hilft. Aus irgendeinem Grund trat das Problem danach nicht mehr auf.

3) Schließlich mein bevorzugter Rat, wenn Sie auch sicherstellen müssen, dass Ihre Clients auf Staging- oder Live-Servern Ihre inkrementellen Verbesserungen erhalten (ohne störende Ratschläge zur Cache-Freigabe):

Verschieben Sie die Datei und zählen Sie weiter:

// 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, aber zuverlässig.

Frank Nocke
quelle
0

Das Problem mit der akzeptierten Antwort in den neuesten Versionen, von denen ich annehme, dass das $editor_stylesArray nur Stylesheets enthält, die mithilfe des Themas hinzugefügt wurden. Daher werden die restlichen Stylesheets, die von Core WordPress oder Plugins hinzugefügt wurden, aus der zurückgegebenen Zeichenfolge entfernt.

Im Folgenden finden Sie die Lösung, die ich nach dem Optimieren des Codes gefunden habe. Sie können sie in Ihrer Datei functions.php verwenden. Meine Lösung verwendet eine verschachtelte Schleife und $editor_stylessucht nach im Array vorhandenen Stylesheets. Hängt die zuletzt geänderte Zeit als Parameter an die Abfragezeichenfolge an und aktualisiert den Wert im 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);
}
Zorro hier
quelle