Pytanie to było podnoszone wiele razy pod różnymi flagami, jednak chciałbym przedstawić zunifikowany wątek, aby uzyskać najlepsze rozwiązanie tego problemu.
W WordPress domyślnie podczas przełączania między edytorami HTML i Visual w TinyMCE niektóre tagi są usuwane z treści i występują inne dziwne funkcje. Dwa znane obejścia dotyczące pisania bardziej wydajnego kodu HTML polegają na usunięciu funkcji wp_auto_p za pomocą filtrów oraz zainstalowaniu TinyMCE Advanced i włączeniu opcji „przestań usuwać tagi p & br”.
Niestety działa to tak dobrze.
Weźmy na przykład następujący przykład:
<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>
Jeśli wpiszę ten kod do edytora HTML, a obie opcje wymienione powyżej są już włączone, to po przełączeniu się między dwoma różnymi edytorami nic się nie dzieje, czego można się spodziewać. Niestety podczas zapisywania kod automatycznie konwertuje się na:
<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>
Jak widać, wszystkie elementy wewnątrz tagu wstępnego są konwertowane z powrotem na rzeczywiste znaki HTML. Następnie, jeśli ponownie zapiszę ten sam post, otrzymuję coś takiego:
<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>
Zauważ, że Wordpress faktycznie wstrzykuje tagi br do postu. Nie trzeba dodawać, że po kilkakrotnym zaktualizowaniu tego postu podczas wyświetlania go na interfejsie wyświetlacz nie jest w pobliżu zamierzonego wyświetlacza.
Jedynym sposobem, w jaki pozbyłem się wszystkich dodanych „funkcji formatowania”, było wyłączenie edytora Visual w moim profilu.
To dla mnie dobre rozwiązanie, biorąc pod uwagę, że jestem profesjonalnym programistą. Dla moich klientów to rozwiązanie nie jest eleganckie. Moi klienci będą w przeważającej części korzystać z edytora wizualnego. Wielu moich klientów nie jest zbyt obeznana z technologią i czasami potrzebuje mnie, aby naprawić swoje posty, gdy układ się psuje. Ogranicza mnie to do korzystania z edytora wizualnego, ponieważ nie mogę przejść do edytora HTML bez obawy o uszkodzenie układu.
Głównie (i myślę, że istnieje duża społeczność, która mogłaby skorzystać z tej odpowiedzi), jakie wyraźne kroki mogę wykonać, aby zapewnić:
- Wpis można edytować za pomocą edytora Visual lub HTML.
- Treść postu nie jest w żaden sposób modyfikowana podczas przełączania między dwiema zakładkami.
- Podczas zapisywania posta z edytora HTML nie jest dodawana żadna dodatkowa treść.
- Podczas zapisywania posta z edytora HTML żadne podmioty nie są konwertowane.
- BONUS: Podczas zapisywania posta z edytora HTML każdy kod (na przykład HTML) zawinięty w tagu wstępnym i jeszcze nie przekonwertowany na encje zostanie automatycznie przekonwertowany na encje.
Zasadniczo, jeśli możemy stworzyć powyższe zachowanie w TinyMCE za pomocą wtyczki innej firmy, możemy stłumić wszystkie inne pytania dotyczące fałszywego formatowania za pomocą TinyMCE. Czuję, że wiele osób mogłoby z tego skorzystać.
Po prostu wydaje się logiczne, że istnieje pewna funkcjonalność, jakiej można oczekiwać od edytora WYSIWIG, i to wbrew temu. Zgodnie z całą logiką i rozumem wbudowane funkcje formatowania Wordpress są dość bezużyteczne w ich obecnej konfiguracji. Wydaje mi się, że jeśli chcą skorzystać z tych opcji formatowania, najlepiej postawić jeden lub drugi edytor, a nie oba.
I PROSZĘ: Nie odpowiadaj na ten wątek, stosując obejścia i pliki do pobrania dla innych edytorów WYSIWIG, które „naprawiają” problem. Jest to podstawowy problem (choć nie tak naprawdę błąd) związany z rdzeniem Wordpress, który należy naprawić.
EDYCJA : W porządku, pracowałem nad tym i myślę, że inżynieria odwrotna będzie najlepszym sposobem rozwiązania tego problemu. Na razie więc wyłączyłem wpautop (która tylko dla przejrzystości jest funkcją, która łączy się z filtrem „the_content”, aby dodać tagi p i br przed wyświetleniem tekstu , a nie po zapisaniu tekstu. Myślę, że istnieje pewne zamieszanie jak działa ta funkcja. wpautop nie ponosi odpowiedzialności za zmiany, które widzisz, kiedy zmieniasz karty edytora. To coś zupełnie innego.
W każdym razie wyłączyłem wpautop, co jest dobrą praktyką podczas korzystania z edytora HTML. Od tego momentu wyłączyłem edytor wizualny, aby zacząć od błędów encji HTML, które występują podczas zapisywania postu. Dzięki pomocy jednego C. Bavota znalazłem fragment kodu do konwersji dowolnych tagów w edytorze HTML na odpowiadające im jednostki przed wyświetleniem ich w interfejsie strony (kredyt: http://bavotasan.com/2012/convert -pre-tag-content-to-html-podmiotów-w-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 );
To skutecznie eliminuje problemy z konwersją wszystkich elementów na znaczniki podczas zapisywania przez Wordpress. Teraz możesz używać edytora HTML i pisać standardowy kod między znacznikami „pre” bez samodzielnej konwersji encji. To zajmuje się wszystkimi problemami z konwersją encji w Wordpress i zapewnia, że wszystko wyświetla się poprawnie w interfejsie. Teraz musimy dowiedzieć się, w co się podłączyć, aby zmodyfikować zachowanie występujące podczas klikania w obie strony między kartami. W tej chwili wydaje się, że po przejściu z HTML do karty wizualnej zawartość karty HTML jest interpretowana przez javascript lub coś, co ma na celu zapewnienie aktualizacji na żywo tego, jak powinna wyglądać treść. Powoduje to, że tagi (które są wyświetlane w formie nieistniejącej na karcie HTML) są przetwarzane zamiast wyświetlane. Następnie, przy ponownym przejściu do zakładki HTML wydaje się, że TinyMCE przekazuje bieżące dane. Oznacza to, że po przełączeniu utracisz strukturę HTML. Musimy wymyślić sposób, aby TinyMCE przekonwertować wszystko w tagach wstępnych na równoważne elementy przed załadowaniem go do okna (w zasadzie wersja backendowa tego, co zrobiliśmy na interfejsie użytkownika, ale z tinymce i javascript zamiast php i hooków), dzięki czemu jest wyświetlany zamiast przetwarzany. Propozycje? s równoważne byty przed załadowaniem go do okna (zasadniczo backendowa wersja tego, co zrobiliśmy na frontendie, ale z tinymce i javascript zamiast php i hookami), dzięki czemu jest wyświetlany zamiast przetwarzany. Propozycje? s równoważne byty przed załadowaniem go do okna (zasadniczo backendowa wersja tego, co zrobiliśmy na frontendie, ale z tinymce i javascript zamiast php i hookami), dzięki czemu jest wyświetlany zamiast przetwarzany. Propozycje?
EDYCJA 2 :
Po kilku dalszych badaniach konwersja encji w tagu wstępnym, gdy są wyświetlane, działa dobrze w przypadku treści w tagu wstępnym, ale powiedz, że mam wpis na blogu z linią taką jak ta:
„Następnie musimy dodać tę linię do naszego pliku HTML: <p> Witaj, świecie! </p>”
Patrząc na ten wiersz, możesz stwierdzić, że kod powinien być wyświetlany w witrynie, a nie analizowany, jednak po zapisaniu wpisu podmioty te są dekodowane przy następnym ładowaniu edycji wpisu i przy każdym kolejnym zapisie są zapisywane jako nieprzetworzone tagi HTML, co powoduje ich parsowanie na interfejsie. Jedynym rozwiązaniem, jakie do tej pory wymyśliłem, byłoby napisanie podobnego kodu dla znacznika „code”, którego używam w wersji wstępnej, a następnie po prostu owinięcie małych linijek w znacznik „code”, a dużych fragmentów w Tag „pre”. Czy masz jeszcze jakieś pomysły?