Come evitare la memorizzazione nella cache durante lo sviluppo?


31

Esiste un modo semplice per impedire tutta la memorizzazione nella cache quando si verifica l'aspetto delle modifiche al sito? Uso WP Super Cache. Posso cancellare la sua cache usando l'opzione fornita, cancellare la cache per il mio browser e alcune modifiche ai CSS o ai widget non si aggiornano. Provo altre soluzioni alternative come il passaggio da browser o computer, ma ci deve essere un flusso di lavoro più snello in cui posso assicurarmi di visualizzare le modifiche apportate e non un formato precedente memorizzato nella cache? Qual è la soluzione migliore per questo?


Sembra che ci siano anche diversi plugin solo per fare questo per CSS. È davvero necessario? Quei plugin fanno qualcosa che non cancella la cache del browser?
cboettig,

Nel mio caso è risultato che ho dovuto svuotare la cache creata dal provider DNS (cloudflare). Grazie a tutti per i suggerimenti qui sotto però.
cboettig,

Uso il browser Chrome; La sua finestra di navigazione in incognito risulta utile quando riscontro problemi di cache a livello di browser durante lo sviluppo.
Joseph Kulandai,

Risposte:


32

Aggiungi il filemtime()tuo foglio di stile come parametro di versione. Diciamo, il tuo foglio di stile predefinito è in css/default.csse css/default.min.css( nonstyle.css ). Quando registriamo un foglio di stile su wp_loaded( noninit ), possiamo passare una versione come quarto parametro. Quella sarà l'ultima volta modificata e quindi cambierà ogni volta che cambiamo il file.

$min    = WP_DEBUG ? '': '.min';
$file   = "/css/default$min.css";
$url    = get_template_directory_uri() . $file;
$path   = get_template_directory() . $file;
$handle = get_stylesheet() . '-default';

// Overridden?
if ( is_child_theme() && is_readable( get_stylesheet_directory() . $file ) )
{
    $url  = get_stylesheet_directory_uri() . $file;
    $path = get_stylesheet_directory()     . $file;
}

$modified = filemtime( $path );

add_action( 'wp_loaded', function() use ( $handle, $url, $modified ) {
    wp_register_style( $handle, $url, [], $modified );
});

add_action( 'wp_enqueue_scripts', function() use ( $handle ) {
    wp_enqueue_style( $handle );
});

Se stai usando Node.js e Grunt, consiglio vivamente Browsersync . Guarderà i tuoi file e li aggiornerà istantaneamente ogni volta che cambiano. Può anche sincronizzare la posizione di scorrimento, i moduli inviati e altro su più browser aperti. Molto bello.


Grazie molto. Sembra che questo sia anche l'approccio del plugin sopra. Non ha risolto il problema nel mio caso perché il mio provider DNS (CloudFlare) stava memorizzando nella cache il file css, quindi ho dovuto svuotare la cache lì - suppongo che non ci sia un modo semplice per aggirare questo. In generale, tuttavia, penso che questa sia la migliore risposta a questo tipo di problema, quindi contrassegnerò come accettato. Grazie ancora.
cboettig,

Perché non usi il tuo foglio di stile locale durante lo sviluppo?
fuxia

Alcuni servizi di memorizzazione nella cache del cloud memorizzano nella cache il file per almeno 8 ore, quindi è necessario richiederli per implementare un servizio migliore per il controllo delle versioni (alcuni lo fanno), cambiare i servizi o smettere di usarli.
Wyck,

@cboettig CloudFlare ha un'impostazione della modalità di sviluppo che interromperà la memorizzazione nella cache per una finestra di 3 ore. Quindi riprende automaticamente la memorizzazione nella cache dopo 3 ore.
Gilbert,

7

Dopo aver cercato una soluzione semplice molte volte ho deciso di trovare qualcosa che funzioni!

quindi ... dopo averci pensato, ho trovato un ottimo modo per ignorare la cache durante lo sviluppo di nuovi siti Web ... (ed è facile).

Ciò di cui abbiamo bisogno è dire a wp che questa è una nuova versione CSS come questa ...

Prima delle modifiche:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), false, 'all' );

Dopo le modifiche:

wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css?v='.time(), array(), false, 'all' );

Questo è ciò che abbiamo aggiunto:

?v='.time()

Spiegazione:
In sostanza stiamo aggiungendo un numero di versione dinamico al file css che forza il browser a caricare il nuovo css ogni volta che lo aggiorniamo.

Non dimenticare di rimuoverlo al termine dello sviluppo, altrimenti la memorizzazione nella cache non funzionerà per questo file e verrà caricata per gli utenti di ritorno ancora e ancora.

Questa tecnica funziona per i file css & js - spero che questo aiuti;)


Abbastanza bello, ma ancora meglio, basta usare time () nel 4o parametro che è la versione. Il che ti darebbe:wp_enqueue_style( 'maincss', get_template_directory_uri() . '/css/style.css', array(), time(), 'all' );
Dave,

L'utilizzo del tempo come quarto parametro potrebbe consentire a Chrome di mantenere quella versione. Ciò è particolarmente vero se si memorizza nella cache tutto il resto mentre si lavora su un sito live. In questo modo stai inviando un "nuovo file" a Chrome che userebbe invece di cercare di mantenere quella "vecchia" versione per un certo periodo di tempo (come impostato per altre risorse).
Sagive SEO,

No, funziona bene con Chrome, lo stavo usando ieri.
Dave,

ciò significa che non hai impostato il tempo di cache / scadenza nel tuo htaccess o tramite un plugin. Ma qualunque cosa
funzioni

6

Questo potrebbe sembrare eccessivamente semplice, ma che ne dici di disabilitare la memorizzazione nella cache fino a quando non hai finito con la parte di sviluppo del tuo sito? È più che semplice accendere e spegnere.


2
+1 - Uso la barra degli strumenti "Web Developer" per Firefox, ti permette di disabilitare molto rapidamente la cache (tra le altre cose)
Shane

Grazie - è solo necessario disabilitare la cache del browser? WP superCache continuerà a fornire contenuto nella cache? Anche il mio servizio DNS viene memorizzato nella cache, quindi non sono sicuro se devo disabilitare ogni cache (WP, browser, DNS, ecc.) Separatamente.
cboettig,

Sorta dipende, dovrai giocarci e capire cosa devi fare per la tua configurazione.
mor7ifer,

Sono con lui, disabilitalo, ecco cosa faccio.
matt

4

So che a questa domanda è stata accettata una risposta, ma penso che quella risposta sia ancora troppo complicata per il problema in questione e potrebbe effettivamente essere errata a seconda dell'utente (senza offesa), quindi ho pensato di condividere ancora come posso evitare la memorizzazione nella cache quando eseguo il mio sviluppo (non solo con Wordpress).

I browser più moderni hanno qualcosa chiamato modalità di navigazione in incognito . In questa modalità, nulla nel tuo computer viene memorizzato nella cache, quindi ogni aggiornamento è un nuovo download dell'ardesia dal server. In Internet Explorer premi Ctrl + Shift + P. In Firefox e Chrome, premi Ctrl + Shift + N.

Se il tuo browser non ha la modalità di navigazione in incognito, puoi normalmente forzare un ricaricamento forzato premendo Ctrl + F5per IE o Ctrl + Shift + Rsu Firefox e Chrome.

Per quanto riguarda la tua domanda relativa ai file CSS (ed essenzialmente a tutti i tuoi file di risorse, come immagini e file Javascript), questi non vengono memorizzati nella cache in alcun modo da WP Super Cache. Le tue impostazioni e / o l'uso di questo plugin non influiscono sulla modalità di pubblicazione di tali file. Ciò che sta memorizzando nella cache quei file è il tuo browser , ed è per questo che fai un duro ricaricamento.

Quello che fa il plugin è che valuta come Wordpress costruisce i tuoi file HTML (tramite PHP) e ne archivia una copia, in modo che la prossima volta che qualcuno richieda lo stesso post, pagina o qualsiasi altra cosa, serva la copia e non dovrà rivalutare nuovamente l'HTML generato da PHP e quindi risparmiare un po 'di tempo di calcolo, caricando le tue pagine molto più velocemente. (Spero sia chiaro.)

Il problema è che, se stai eseguendo uno schiaffo su un timestamp sull'URL dei tuoi file CSS tramite una funzione PHP, questa è una valutazione PHP in HTML e che verrà memorizzata nella cache da WP Super Cache. Ogni richiesta allo stesso post avrà lo stesso timestamp perché agli utenti viene fornita una copia della valutazione del timestamp originale. (Correggimi se sbaglio.)

Il modo corretto per il caching di bypass WP Super Cache è quello di impostare l'opzione Don't cache for known usersa truenella pagina delle impostazioni del plugin.

Infine (e questa è una preferenza personale, dato che sono un vero pignolo quando si tratta di codifica), ricorrere all'uso di incognito o ricariche forzate non ti richiederà di aggiungere markup non necessari nelle tue pagine HTML. Naturalmente, l'aggiunta di un timestamp aggiunge solo circa 13 byte per file statico per richiesta, ma ehi, come ho detto, sono un pignolo per questo tipo di cose. Sono ancora inutili 13 byte.


Grazie per i consigli utili. Sfortunatamente nessuna delle risposte qui è corretta nel mio caso, poiché la mia soluzione ha richiesto la cancellazione della cache del provider di servizi di rete di dominio, cloudflare, ma molte erano ancora buone informazioni.
cboettig,

2

Accidenti, molti modi per rispondere a questo! Innanzitutto, hai chiesto due cose diverse: WP Super Cache e file CSS. Questi vengono memorizzati nella cache in modo diverso, in luoghi diversi, quindi è importante riconoscere dove si trova il problema.

Se WP Super Cache, puoi definire la costante DONOTCACHEPAGEnelle tue function.php durante lo sviluppo per impedire a WP Super Cache di memorizzare nella cache qualsiasi cosa. Non dimenticare di rimuoverlo all'avvio!

define('DONOTCACHEPAGE', true);

Ogni sito ha anche una chiave univoca da aggiungere all'URL per caricare una nuova versione della pagina, che puoi trovare nella scheda "Avanzate", credo.

Scomponendolo su una soluzione ancora migliore, dovresti considerare di impostare un ambiente di sviluppo e un ambiente di produzione, in cui il tuo ambiente di sviluppo non ha WP Super Cache abilitato (di nuovo, supponendo che sia il tuo problema).

Se il problema riguarda i file CSS / JS, vedere la risposta di toscho e il successivo commento di m0r7if3r sopra.


1

HyperCache disabilita la memorizzazione nella cache quando si è effettuato l'accesso come amministratore. Non sono sicuro se WP Super Cache abbia la stessa funzionalità.


C'è un'opzione per questo, sì.
Matthew Boynes,

1

Se stai utilizzando Chrome (che consiglio vivamente), apri Inspector, fai clic sull'icona delle impostazioni nell'angolo in basso a destra e in "Rete" seleziona "Disabilita cache".


0

Come detto per wp super cache, ma per la cache WP generale in wp-config.php Modifica a questo:

define( 'WP_CACHE', false );

Riferimento: codex.wordpress.org


-1

Puoi utilizzare questo frammento https://gist.github.com/jhayiwg/92bae4330aeb738a98022d7ab63ce9b1

Genera nuova versione del tuo tema attivo css e js ogni volta che carichi la pagina


Pubblica qui la risposta, incluso tutto il codice pertinente. Utilizzare siti esterni solo come riferimento. Il tuo post dovrebbe fornire una risposta completa senza la necessità di andare su un altro sito; se il sito di terze parti non funziona, la tua risposta sarà inutile ..
cybmeta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.