Zatrzymaj automatyczne dodawanie tagów <br> do treści postów przez WordPress

26

Czy istnieje sposób, aby powstrzymać WordPress przed automatycznym wstawianiem <br>tagów podczas dodawania zwrotów w edytorze tekstu WordPress.

Chciałbym, aby zachowywał się bardziej jak edytor kodu, w którym mogę uporządkować kod tak, jak lubię i ułatwić czytanie.

Kod, którego używam w edytorze to:

[one_third][team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"][custom_button url="#"]For more information[/custom_button][/team_member][/one_third][one_third][team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"][custom_button url="#"]For more information[/custom_button][/team_member][/one_third][one_third][team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"][custom_button url="#"]For more information[/custom_button][/team_member][/one_third]

Chciałbym tak to skonstruować, aby łatwiej było czytać i edytować:

[one_third]
[team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"]
[custom_button url="#"]For more information[/custom_button]
[/team_member]
[/one_third]

[one_third]
[team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"]
[custom_button url="#"]For more information[/custom_button]
[/team_member]
[/one_third]

[one_third]
[team_member image_url="team_member.jpg" name="Laser vision" role="WordPress Designer"]
[custom_button url="#"]For more information[/custom_button]
[/team_member]
[/one_third]

Jednak gdy to zrobisz, <br>do treści postu zostaną dodane niewidoczne tagi, które zepsują układ mojej strony.

mvaneijgen
źródło
Czy chcesz usunąć tagi wszędzie , czy tylko dla tych skrótów?
shea
Proszę zobaczyć moją odpowiedź tutaj: wordpress.stackexchange.com/questions/55782/…
Chiedo

Odpowiedzi:

25

Odpowiedź shea nie jest idealna, ponieważ w wielu przypadkach:

  • Nie chcesz <br>, <p>usuwać wszystkiego z itp. Chcesz, aby było to domyślne zachowanie twojego kompozytora wizualnego WP, które powyższy kod usunie
  • W wielu przypadkach uważa się to za „zhakowanie rdzenia”, ponieważ zmienia to domyślne zachowanie rdzenia WP - na przykład coś takiego nie przejdzie na ThemeForest

Jak widzę, masz głównie problemy ze skrótami. Właściwym sposobem podejścia do tego jest nie zmiana domyślnego zachowania (zhakowanie rdzenia), ale po prostu filtrowanie zawartości. Więc po prostu dodaj filtr i w zmiennej przekaż tablicę kodów shotrcodes, które chcesz filtrować w następujący sposób:

function the_content_filter($content) {
    $block = join("|",array("one_third", "team_member"));
    $rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content);
    $rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep);
return $rep;
}
add_filter("the_content", "the_content_filter");

Treść w środku zostanie przefiltrowana, dlatego twoje skróty będą wolne od <br>, <p>itp., Ale inne części treści - na przykład standardowy tekst w edytorze WP utworzonym przez użytkownika - nadal będą miały pełną funkcjonalność WP.

Referencje:

  1. filtr WP zawartość
  2. Regex „tłumacz”
  3. dołącz do funkcji PHP
  4. preg_replace Funkcja PHP
Borek
źródło
W moim projekcie działało idealnie. Niesamowite, ogromne, cudowne, genialne ... O wiele doskonałe!
arefin2k,
@Borek To jest niesamowite i wydaje się działać naprawdę dobrze (+1), ale aby poprawić swoją odpowiedź, możesz wyjaśnić CO to robi? Wygląda na to, że usuwa <p>i <br>tagi z bliskiej odległości one_third i team_memberskrótów, ale nie jestem do końca pewien (moje umiejętności REGEX zdecydowanie nie są do zera). Czy możesz nakreślić, co on dla nas robi, a teraz możemy skonfigurować go dla innych skrótów?
dKen
@dKen Robi dokładnie to, co napisałeś. Poza wyrażeniem regularnym jest to naprawdę proste, ponieważ treść jest edytowana przez wbudowany filtr WP the_content. Musimy tylko przekazać treść do filtrowania za pomocą funkcji, w której określamy, co (blok) i jak (rep) filtrować. Dodałem referencje, aby lepiej to zrozumieć, sprawdzając każdą funkcję i filtr. Jeśli chodzi o dodawanie kolejnych skrótów, wystarczy rozwinąć tablicę bloków $, po prostu dodając do niej nazwy join("|",array("one_third", "team_member", "next_one", "another_one", "one_more"));
Borek
... powiedział pro developer, dobra robota. Upvoting.
fusion27
Do Twojej wiadomości działa to tylko podczas przeglądania strony. Jednak w twoim edytorze możesz bardzo dobrze widzieć niechciane <p> i <br> jak zwykle.
MarsAndBack
13

wpautop()Funkcja dodaje <p>i <br>tagi do treści w celu zachowania podziałów wierszy. Jeśli wolisz samodzielnie dodać te tagi, możesz usunąć filtry, które stosują tę funkcję do treści postu:

remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );

Jeśli chcesz zachować automatyczne tworzenie paragaraf (wstawianie <p>znaczników) i po prostu usunąć dodatkowe <br>znaczniki, możesz zamiast tego użyć tego kodu:

remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );

function wpse_wpautop_nobr( $content ) {
    return wpautop( $content, false );
}

add_filter( 'the_content', 'wpse_wpautop_nobr' );
add_filter( 'the_excerpt', 'wpse_wpautop_nobr' );

Zobacz ten link, jeśli nie masz pewności, gdzie umieścić ten kod.

shea
źródło
3

Zainstaluj wtyczkę „Don't Muck My Markup”.

Dodaje opcję pola wyboru do każdej strony, wyłączając automatyczne wstawianie <p>i <br>tagi.

Istnieje również możliwość wykonania tego w całej witrynie.

Brent Baccala
źródło
1

Prawdopodobnie bałagan wywołuje edytor tekstów. Oto co zrobiłem:

Używam TinyMCE. W ustawieniach edytora tekstu odznaczyłem „Przestań usuwać tagi„ <p> ”i„ <br /> ”podczas zapisywania i pokaż je w edytorze HTML”. Pracował dla mnie.

Svein E. Slotte Pedersen
źródło
0

Być może możesz po prostu użyć, do_shortcode()jeśli wszystko, co masz w treści, to skróty, o ile nie masz żadnej innej treści wymagającej filtrów.

Nie znam kontekstu, ale jeśli jesteś w pętli:

echo do_shortcode($post->post_content);

Szymon, Szymek
źródło
0

Odpowiedź Borka nie zadziałała w moim przypadku użycia, którym jest pisanie surowego HTML.

W tym celu użyłem wtyczki Code Snippets (pozwala łatwo dodać dowolne fragmenty PHP, które się uruchamiają), aby utworzyć fragment kodu [html][/html]krótkiego. Co ciekawe, ten krótki kod jest zgodny z wtyczką toggle-wpautop, która pozwala wyłączyć automatyczne wstawianie tagów <br>i <p>całego wpisu. Możesz użyć albo miksować i dopasowywać.

function html_shorttag_filter($content) {
  // Based on: https://wordpress.org/plugins/lct-temporary-wpautop-disable-shortcode/
  $new_content = '';
  $pieces = preg_split('/(\[html\].*?\[\/html\])/is', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
  // don't interfere with plugin that disables wpautop on the entire page
  // see: https://plugins.svn.wordpress.org/toggle-wpautop/tags/1.2.2/toggle-wpautop.php
  $autop_disabled = get_post_meta(get_the_ID(), '_lp_disable_wpautop', true);
  foreach ($pieces as $piece) {
    if (preg_match( '/\[html\](.*?)\[\/html\]/is', $piece, $matches)) {
      $new_content .= $matches[1];
    } else {
      $new_content .= $autop_disabled ? $piece : wpautop($piece);
    }
  }
  // remove the wpautop filter, but only do it if the other plugin won't do it for us
  if (!$autop_disabled) {
    remove_filter('the_content', 'wpautop');
    remove_filter('the_excerpt', 'wpautop');
  }
  return $new_content;
}
// idea to use 9 is from: https://plugins.svn.wordpress.org/wpautop-control/trunk/wpautop-control.php
add_filter('the_content', 'html_shorttag_filter', 9);
add_filter('the_excerpt', 'html_shorttag_filter', 9);
Greg
źródło
0

Ta funkcja usuwa tylko znacznik <p>i <br>dla krótkiego kodu.

function bnd_fix_shortcodes_extra_line_break( $content ){
  $array = array (
    '<p>['    => '[',
    ']</p>'   => ']',
    ']<br />' => ']'
  );
  $content = strtr( $content, $array );
  return $content;
}
add_filter('the_content', 'bnd_fix_shortcodes_extra_line_break');
Burhan Nasir
źródło
To także wpływa na wszystkie przypadki, w których [i ]nie wykorzystywane jako część rozmowy shortcode.
fuxia
0

dla tych, którzy nie znają hakowania kodu lub nie chcą korzystać z wtyczki, możesz to zrobić.

1) skopiuj cały bieżący kod ze stron WP (edytor tekstu) wprowadź opis zdjęcia tutaj

2) następnie wklej do notatnika i kontynuuj wymaganie edycji (dodaj krótki kod, kod HTML lub kod css)

3) Skopiuj wklej z notatnika do tego samego piargu na stronach WP (edytor tekstu)

4) Naciśnij przycisk [AKTUALIZACJA], który znajduje się po prawej stronie tych samych stron WP, aby opublikować strony

wprowadź opis zdjęcia tutaj

5) Wreszcie podgląd na stronie na żywo

Sztuczka polega na tym, aby nie przełączać się z powrotem do [edytora wizualnego] dla tych konkretnych stron, a następnie automatyczne dołączanie do [p] lub [br] już się nie zdarza.

Pin HO LI
źródło
-3

Bardzo proste rozwiązanie: nie używaj nowych wierszy w edytorze Wordpress. Tak, nowe linie wyjaśniają. Jednak w tym przypadku przerwy mogą być nadal zrozumiałe.

JK
źródło