Passa tra le schede Visual e HTML liberamente


21

Quindi questa domanda è stata sollevata molte volte sotto diverse bandiere, tuttavia vorrei presentare un thread unificato per una soluzione definitiva a questo problema.

In WordPress, per impostazione predefinita, quando si passa avanti e indietro tra gli editor HTML e Visual in TinyMCE, alcuni tag vengono rimossi dal contenuto e si verificano altre strane funzionalità. Due soluzioni alternative note per la scrittura di codice HTML più efficiente sono l'utilizzo della rimozione della funzione wp_auto_p mediante i filtri e l'installazione di TinyMCE Advanced e l'attivazione dell'opzione "smetti di rimuovere i tag p & br".

Questo funziona solo così bene, sfortunatamente.

Prendi, ad esempio, il seguente esempio:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre>
&lt;script type=&quot;text/javascript&quot; src=&quot;/path/to/jquery.easycolumns.js&quot;&gt;&lt;/script&gt;
</pre>

Se scrivo questo codice nell'editor HTML, con entrambe le opzioni sopra elencate già abilitate, quando passo tra i due diversi editor, non succede nulla, cosa che ci si aspetta. Sfortunatamente, durante il salvataggio, il codice si converte automaticamente in questo:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre>
<script type="text/javascript" src="/path/to/jquery.easycolumns.js"></script>
</pre>

Come puoi vedere, tutte le entità all'interno del pre tag vengono riconvertite in caratteri HTML reali. Quindi, se salvo di nuovo questo stesso post, ottengo qualcosa di simile al seguente:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre><br />
<script type="text/javascript" src="/path/to/jquery.easycolumns.js"></script><br />
</pre>

Si noti che Wordpress in realtà inserirà i tag br nel post. Inutile dire che, quando questo post è stato aggiornato alcune volte, quando lo si visualizza sul frontend, il display non si trova da nessuna parte vicino al display previsto.

L'unico modo in cui mi è sembrato di sbarazzarmi di tutte le "funzionalità di formattazione" aggiunte è stato disabilitare l'editor Visual tramite il mio profilo.

Questa è un'ottima soluzione per me, considerando che sono uno sviluppatore web professionista. Per i miei clienti, questa soluzione è tutt'altro che elegante. I miei clienti, per la maggior parte, useranno l'editor visivo. Molti dei miei clienti non sono molto esperti di tecnologia e talvolta hanno bisogno che io aggiorni i loro post quando il layout si rompe. Questo mi limita a usare l'editor visivo, poiché non posso passare all'editor HTML senza timore di interrompere il layout.

Principalmente, (e penso che ci sia una grande comunità che potrebbe beneficiare di questa risposta), quali passi espliciti posso seguire per garantire quanto segue:

  1. Un post può essere modificato dall'editor Visual o HTML.
  2. Il contenuto di un post non viene modificato in alcun modo quando si passa da una scheda all'altra.
  3. Quando si salva un post dall'editor HTML, non viene aggiunto alcun contenuto aggiuntivo.
  4. Quando si salva un post dall'editor HTML, nessuna entità viene convertita.
  5. BONUS: quando si salva un post dall'editor HTML, qualsiasi codice (ad esempio HTML) racchiuso in un pre tag e non già convertito in entità verrà automaticamente convertito in entità.

In sostanza, se siamo in grado di creare il comportamento sopra menzionato in TinyMCE mediante l'uso di un plug-in di terze parti, possiamo porre fine a tutte le altre domande relative alla falsa formattazione mediante l'uso di TinyMCE. Sento che molte persone potrebbero trarne beneficio.

Sembra logico che ci sia una certa funzionalità che ci si aspetterebbe da un editor WYSIWIG, e questo va contro di essa. Secondo ogni logica e ragione, le funzioni di formattazione integrate di Wordpress sono piuttosto inutili con la loro configurazione attuale. Mi sembra che se vogliono usare queste opzioni di formattazione, la loro scommessa migliore sarebbe quella di abilitare un editor o l'altro, non entrambi.

E PER FAVORE: non rispondere a questa discussione con soluzioni alternative e download per altri editor WYSIWIG che "risolvono" il problema. Questo è un problema di fondo (anche se non proprio un bug) con il core di Wordpress che deve essere corretto.

EDIT : Va bene, ho lavorato su questo e penso che il reverse engineering sarà il modo migliore per risolvere questo problema. Quindi per ora, ho disabilitato wpautop (che solo per chiarezza è una funzione che si aggancia al filtro "the_content" per aggiungere tag p e br prima che il testo venga visualizzato , non quando il testo viene salvato. Penso che esista un po 'di confusione per quanto riguarda il funzionamento di questa funzione. wpautop non è responsabile delle modifiche che si verificano quando si passa da una scheda dell'editor all'altra. È qualcosa di completamente diverso.

Comunque, ho disabilitato wpautop, come è buona pratica quando usi l'editor HTML. Da quel momento, ho disabilitato l'editor visivo per iniziare prima con gli errori di entità html presenti durante il salvataggio di un post. Grazie all'aiuto di un C. Bavota, ho trovato uno snippet per convertire qualsiasi tag nell'editor HTML in entità equivalenti prima di visualizzarli sul front-end del sito (credito: http://bavotasan.com/2012/convert -pre-tag-contents-to-html-entity-in-wordpress / ).

#add_filter( 'the_content', 'pre_content_filter', 0 );
/**
 * Converts pre tag contents to HTML entities 
 *
 * This function is attached to the 'the_content' filter hook.
 *
 * @author c.bavota
 */

function pre_content_filter( $content ) {
        return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}


function convert_pre_entities( $matches ) {
        return str_replace( $matches[1], htmlentities($matches[1] ), $matches[0] );
}

add_filter( 'the_content', 'pre_content_filter', 10, 2 ); 

Questo elimina efficacemente i problemi con Wordpress convertendo tutte le entità in tag al momento del salvataggio, eludendolo. Ora puoi utilizzare l'editor HTML e scrivere il codice standard tra i tag "pre" senza eseguire tu stesso la conversione dell'entità. Questo risolve tutti i problemi con la conversione delle entità in Wordpress e assicura che tutto venga visualizzato correttamente sul front-end. Ora, dobbiamo capire cosa agganciare per modificare il comportamento sperimentato quando si fa clic avanti e indietro tra le schede. In questo momento, sembrerebbe che quando si passa dall'HTML alla scheda visiva, i contenuti della scheda HTML vengono interpretati da javascript o qualcosa per cercare di fornire un aggiornamento dal vivo di come dovrebbe apparire il contenuto. Questo fa sì che i tag (che sono visualizzati in forma non entità nella scheda HTML) vengano elaborati anziché visualizzati. Poi, quando si torna alla scheda HTML, sembrerebbe che TinyMCE trasmetta i dati correnti. Ciò significa che quando torni indietro, perdi la tua struttura HTML. Dobbiamo trovare un modo per dire a TinyMCE di convertire tutto in pre tag in entità equivalenti prima di caricarlo nella finestra (essenzialmente la versione backend di ciò che abbiamo fatto sul frontend ma con tinymce e javascript anziché php e hook), in modo che venga visualizzato anziché elaborato. Suggerimenti? s entità equivalenti prima di caricarlo nella finestra (essenzialmente la versione backend di ciò che abbiamo fatto sul frontend ma con tinymce e javascript anziché php e hook), in modo che venga visualizzato anziché elaborato. Suggerimenti? s entità equivalenti prima di caricarlo nella finestra (essenzialmente la versione backend di ciò che abbiamo fatto sul frontend ma con tinymce e javascript anziché php e hook), in modo che venga visualizzato anziché elaborato. Suggerimenti?

EDIT 2 :

Dopo ulteriori ricerche, la conversione delle entità nel pre-tag quando vengono visualizzate funziona correttamente per i contenuti all'interno del pre-tag, ma supponiamo che io abbia un post sul blog con una riga come questa:

"Successivamente, dobbiamo aggiungere questa riga al nostro file HTML: <p> Ciao, mondo! </p>"

Guardando questa riga, puoi dire che il codice dovrebbe essere visualizzato sul sito e non analizzato, tuttavia quando il post viene salvato, queste entità vengono decodificate al successivo caricamento di modifica del post e ad ogni salvataggio successivo vengono salvate come tag html non elaborati, che li induce ad essere analizzati sul front-end. L'unica soluzione a cui riesco a pensare finora sarebbe quella di scrivere in un codice simile per il tag "code" come sto usando per il pre, e quindi avvolgere solo un piccolo liner nel tag "code", e grossi pezzi nel tag "pre". Qualcuno ha altre idee?


2
Bel post. Che TinyMCE non mi ha causato altro che mal di testa. Di recente l'ho cambiato per CKEditor, anche se è troppo presto per dire come sta resistendo. Un problema che non hai menzionato nel tuo post è il cr ** in più quando si incolla da Word.
Twifty,

Ho usato CKeditor sul nostro sito per un po 'pensando che questa fosse la soluzione di cui avevo bisogno, ma sfortunatamente il problema a portata di mano qui sta nella gestione e formattazione di Wordpress dei dati che riceve da TinyMCE e non in TinyMCE stesso. Deve esserci un modo per collegarsi a Wordpress al momento giusto per creare l'effetto desiderato. Ma indipendentemente da CKeditor è sicuramente un buon plugin, non proprio quello che sto cercando.
Thought Space Designs

1
Inoltre, sei a conoscenza della funzione "incolla da parola" nel "lavello della cucina" di TinyMCE corretta? Ciò dovrebbe risolvere il problema con "schifezze extra" quando si incolla da Word.
Thought Space Designs

7
Ottima domanda Per rendere più piccante: ricompenserò la soluzione con una taglia di 200 . Aspetterò fino a quando non ci sarà effettivamente una risposta, quindi la taglia non scadrà troppo presto.
fuxia

Risposte:


5

Bene, quindi ho già aggiornato questa domanda un sacco e sta iniziando a sovraccaricarsi, quindi ho pensato di scrivere questa come una risposta anche se non è completa.

Estrapolato dalla risposta di @ bueltge, in realtà sono tornato indietro e ho trovato il suo precedente post in questione. In quel post, c'era un plugin elencato che non avevo mai visto prima: "Preserved HTML Editor Markup". Questo plugin non è stato aggiornato da un po ', ma l'ho appena testato con WP 3.6.1 ed è perfettamente funzionante. Questo plugin si occupa automaticamente di wpautop, fornisce un formato unificato per l'inserimento di tag br e p all'interno dell'editor visivo e conserva il markup quando si passa da una scheda all'altra.

Per i miei scopi, ho ampliato questo plugin con le mie funzionalità: conversione automatica di eventuali tag html all'interno di tag "<code>" nelle rispettive entità al momento del salvataggio. Ciò significa che puoi scrivere il codice HTML standard nei tag del codice all'interno della scheda di testo, quindi salvarlo e tutte le cose nei pre tag verranno convertite in entità per una corretta visualizzazione sul front-end del sito e nell'editor visivo. Non è la soluzione più elegante che abbia mai trovato, ma sembra funzionare. Aggiungi questa riga al tuo Functions.php dopo aver attivato il plugin:

function code_content_conversion_filter( $content ) {
        return preg_replace_callback( '|<code.*>(.*)</code|isU' , 'convert_entities', $content );
}

function convert_entities( $matches ) {
        return str_replace( $matches[1], htmlspecialchars($matches[1], ENT_QUOTES | ENT_HTML5, 'UTF-8', FALSE ), $matches[0] );
}

add_filter( 'content_save_pre', 'code_content_conversion_filter', 0);

Ora, digita qualsiasi codice HTML valido tra i tag di codice e quando salvi, quando viene visualizzato il backup dell'editor, verranno tutti convertiti in entità. Ciò ti consente di scrivere il codice più velocemente. Ora, l'unica cosa che è ancora un problema è che se hai un campo "pre" con un tag di codice nidificato e HTML in esso, e vai alla scheda visiva e provi a inserire una nuova riga nel codice, un tag br viene iniettato nel tag del codice nell'HTML. Ci deve essere un'opzione per disabilitarlo in TinyMCE. Indipendentemente da ciò, finché modifichi i tuoi pre-campi dalla scheda di testo, puoi sentirti libero di passare liberamente tra le schede, aggiungere qualsiasi contenuto in qualsiasi scheda, salvare da entrambe le schede e non devi preoccuparti della formattazione incasinata!

Questo in realtà risolve tutti e 5 i punti della mia domanda iniziale. Il punto 2 è ancora un po 'traballante, ma credo che ai fini della maggior parte delle persone questo risolva il problema. Ho intenzione di setacciare questo plugin ad un certo punto ed estrarre le parti necessarie, combinarlo con le mie scoperte e riconfezionarlo per il download pubblico. Il mio obiettivo qui è quello di creare un semplice plug-in di installazione con un clic che scriva come previsto.

Spero che questo aiuti tutti!


3

All'inizio, penso che questo problema sia stato risolto dalla versione 3.5 di WP; vedi biglietto 19666 in trac . Ma il tinyMCE ha un gancio lì ci dà la possibilità di cambiare il contenuto all'interno dell'editor e non è necessario analizzare l'output sul frontend.

Una piccola sceneggiatura originale. Non ho testato questo con una versione attuale di WP, era una soluzione precedente per un cliente.

Aggiungi questa fonte tramite plug-in e migliora il markup. La funzione controlla il tag html <pree, se esiste, verrà sostituita con markup.

add_filter( 'tiny_mce_before_init', 'fb_correction_content_tiny_mce' );

function fb_correction_content_tiny_mce( $init ) {

    $init['setup'] = "function(ed) {
        ed.onBeforeSetContent.add( function(ed, o) {

            if ( o.content.indexOf('<pre') != -1 ) {
                o.content = o.content.replace(
                    /<pre[^>]*>[\\s\\S]+?<\\/pre>/g,
                    function(a) {
                        return a.replace(/(\\r\\n|\\n)/g, '<br />');
                    }
                );
            }
        } );
    }";

    return $init;
}

Il problema che è stato risolto in 3.5 non è esattamente lo stesso problema. Il problema che ho non è che le interruzioni di riga vengano rimosse quando si passa da Visual a HTML, è che tutti i miei tag, anche quelli nei pre-tag, sembrano essere interpretati come HTML di origine e non visualizzati in quanto non sono codificati come entità nel pannello HTML. Questa funzione modificherà il comportamento di TinyMCE in modo che l'HTML nelle pre sia visualizzato anziché elaborato?
Thought Space Designs

In un piccolo test funziona, le entità lasceranno il passaggio da HTML a Visual, anche indietro e con contenuto di salvataggio.
edificio

Lo proverò più tardi oggi per assicurarmi che soddisfi ciò che sto cercando.
Thought Space Designs,

OK, attendi la tua risposta e forse aiuta. Ho provato questo con la fonte del tuo esempio sulla domanda. Se lo capisco non è corretto, si prega di migliorare questo qui.
edificio

Vedi la mia risposta ...
Thought Space Designs,

0

Ho avuto un problema simile a OP, ma per me non è stato un problema con il mantenimento <h1>in <div>. Questo è ciò che volevo mantenere passando tra le schede Testo e Visual: h1 in div e con div all'interno

Ogni volta che cambiavo scheda <h1>scompariva. Ho fatto molte ricerche e per Wordpress 4.7.3 ho scoperto che esistono molte correzioni obsolete. C'è stato un aggiornamento sindaco di TinyMCE dalla versione 3 alla 4. Le soluzioni per la v.3 non hanno funzionato per la v.4. Dopo aver cercato su Google e aver letto la documentazione originale di TinyMCE versione 4, ho trovato la soluzione per il mio caso:

  1. Installa il plug-in di configurazione avanzata TinyMCE
  2. impostare TinyMCE valid_childrensu+div[h1],h1[div]
  3. I additonnaly configurato indent=true, forced_root_block=falsee schema=html5(quando leggo forced_root_blockdescrizione ho capito come wpautopsostituto)

Di conseguenza ottengo questo (ed è resistente al cambio di schede) inserisci qui la descrizione dell'immagine

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.