Отключение автоматического добавления тегов <br/> в контент записей WordPress

17 янв. 2014 г., 00:03:22
Просмотры: 71.5K
Голосов: 36

Существует ли способ остановить WordPress от автоматической вставки тегов <br> при добавлении переносов строк в текстовом редакторе WordPress.

Я хотел бы, чтобы он работал больше как редактор кода, где я могу структурировать код так, как мне нравится, и сделать его легким для чтения.

Код, который я использую в редакторе:

[one_third][team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"][custom_button url="#"]Подробнее[/custom_button][/team_member][/one_third][one_third][team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"][custom_button url="#"]Подробнее[/custom_button][/team_member][/one_third][one_third][team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"][custom_button url="#"]Подробнее[/custom_button][/team_member][/one_third]

Я хотел бы структурировать его таким образом, чтобы было легче читать и редактировать:

[one_third]
[team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"]
[custom_button url="#"]Подробнее[/custom_button]
[/team_member]
[/one_third]

[one_third]
[team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"]
[custom_button url="#"]Подробнее[/custom_button]
[/team_member]
[/one_third]

[one_third]
[team_member image_url="team_member.jpg" name="Лазерное зрение" role="WordPress Дизайнер"]
[custom_button url="#"]Подробнее[/custom_button]
[/team_member]
[/one_third]

Однако, когда я делаю это, в контент записи добавляются невидимые теги <br>, которые нарушают макет моей страницы.

3
Комментарии

Вы хотите удалить теги везде, или только для этих шорткодов?

shea shea
17 янв. 2014 г. 01:07:24

Пожалуйста, посмотрите мой ответ здесь: http://wordpress.stackexchange.com/questions/55782/remove-wpautop-from-shortcode-content-remove-whitespace-in-buffering/211784#answer-211784

Chiedo Chiedo
14 дек. 2015 г. 19:17:25

Вы также можете попробовать добавить две косые черты в конце каждой строки скрипта.

Pjetursson Pjetursson
23 мар. 2021 г. 20:13:50
Все ответы на вопрос 8
9
27

Ответ от shea не является идеальным, так как во многих случаях:

  • Вы не хотите удалять все теги вроде <br>, <p> и т.д. Вам нужно это как стандартное поведение для визуального редактора WP, которое приведённый выше код удалит
  • Во многих случаях это считается "взломом ядра", так как изменяет стандартное поведение WP – например, такой подход не пройдёт проверку на ThemeForest

Как я вижу, у вас в основном проблемы с шорткодами. Правильный подход заключается не в изменении стандартного поведения (взлом ядра), а в фильтрации контента. Просто добавьте фильтр и передайте в переменную массив шорткодов, которые нужно отфильтровать:

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

Контент будет отфильтрован, и ваши шорткоды освободятся от <br>, <p> и т.д., но остальные части контента – например, обычный текст в редакторе WP, созданный пользователем – сохранят полную функциональность WP.

Ссылки:

  1. Фильтр the_content в WP
  2. "Переводчик" регулярных выражений
  3. Функция join в PHP
  4. Функция preg_replace в PHP
17 янв. 2014 г. 21:24:58
Комментарии

Отлично сработало в моем проекте. Потрясающе, великолепно, восхитительно, блестяще..... Просто превосходно!

Morshedul Arefin Morshedul Arefin
2 нояб. 2015 г. 08:03:11

@Borek Это потрясающе и, кажется, работает действительно хорошо (+1), но чтобы улучшить ваш ответ, не могли бы вы объяснить, ЧТО именно это делает? На первый взгляд, это удаляет теги <p> и <br> рядом с шорткодами one_third и team_member, но я не совсем уверен (мои навыки работы с REGEX определенно не на высоте). Не могли бы вы описать, что делает этот код, и как мы можем настроить его для других шорткодов?

dKen dKen
17 февр. 2016 г. 13:26:59

@dKen Код делает именно то, что вы написали. Помимо регулярных выражений, все довольно просто, так как контент фильтруется встроенным в WP фильтром the_content. Нам просто нужно передать контент через функцию фильтра, в которой мы указываем что (block) и как (rep) фильтровать. Я добавил ссылки, чтобы вам было проще разобраться, изучив каждую функцию и фильтр. Что касается добавления других шорткодов, вам просто нужно расширить массив $block, добавив в него названия шорткодов, например: join("|",array("one_third", "team_member", "next_one", "another_one", "one_more"));

Borek Borek
17 февр. 2016 г. 21:52:06

...сказал профессиональный разработчик, отличная работа. Голосую за.

fusion27 fusion27
8 авг. 2017 г. 01:54:35

К вашему сведению, это работает только при просмотре страницы. Однако в редакторе вы по-прежнему можете видеть нежелательные <p> и <br>, как обычно.

Kalnode Kalnode
7 авг. 2018 г. 01:21:17

@MarsAndBack К вашему сведению, мы говорим о шорткодах. В редакторе нет ничего, кроме тега шорткода, что можно было бы отобразить. Так что нет... никаких тегов p br br. Если только вы не хотите, чтобы они там были как обычный контент - в чем и заключается смысл этой функции... Я действительно не понимаю, что вы хотите здесь сказать....

Borek Borek
7 авг. 2018 г. 09:43:57

Я понимаю, что это дает результаты, отличные от моего ответа, и, возможно, это именно то, чего вы добиваетесь, но кажется немного странным называть удаление фильтра wpautop "взломом ядра" в ответе, который включает применение длинных регулярных выражений к содержимому записи. Ни один из этих фрагментов кода не должен быть включен в тему WordPress; подобные вещи строго относятся к функционалу плагинов или специфичны для конкретного сайта.

shea shea
7 авг. 2018 г. 15:29:40

@shea Когда вы "добавляете" функциональность... хорошо. Пока это делает только то, что должно, и ничего не меняет — отлично. Когда вы создаете что-то, что достигает X, но также изменяет поведение по умолчанию — случайно или как часть процесса — это и есть взлом ядра. Можно ли убить муху с помощью ЯДЕРНОЙ БОМБЫ? Конечно, но лучше использовать мухобойку. Код может содержать 5000 строк регулярных выражений, и это нормально, если он делает только то, для чего предназначен. Что касается фрагментов кода, я полностью согласен. Изменение любой функциональности должно быть в плагине. Тем не менее, OP спросил про шорткоды, и он получил ответ.

Borek Borek
7 авг. 2018 г. 19:09:52

WordPress разработан вокруг действий и фильтров специально для того, чтобы облегчить простое удаление или добавление функциональности к ядру именно таким способом. Это не взлом ядра. Взлом — это обход предназначенного способа делать вещи.

shea shea
15 авг. 2018 г. 05:27:05
Показать остальные 4 комментариев
0
19

Функция wpautop() добавляет теги <p> и <br> к вашему контенту для сохранения переносов строк. Если вы предпочитаете добавлять эти теги самостоятельно, вы можете удалить фильтры, которые применяют эту функцию к содержимому записи:

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

Если вы хотите сохранить автоматическое создание параграфов (вставка тегов <p>) и просто удалить дополнительные теги <br>, вы можете использовать этот код:

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

Смотрите эту ссылку, если вы не уверены, куда вставить этот код.

17 янв. 2014 г. 06:18:07
1

Установите плагин "Don't Muck My Markup".

Он добавляет флажок на каждую страницу, отключающий автоматическую вставку тегов <p> и <br>.

Также есть возможность сделать это для всего сайта.

23 нояб. 2016 г. 01:19:03
Комментарии

Плагин не работает в WP 6.

RashaMatt RashaMatt
13 июл. 2022 г. 19:43:11
0

Возможно, проблема в текстовом редакторе, который вносит путаницу. Вот что я сделал:

Я использую TinyMCE. В настройках текстового редактора я снял галочку с пункта "Прекратить удаление тегов <p> и <br /> при сохранении и показывать их в HTML-редакторе". Это сработало в моем случае.

20 сент. 2016 г. 10:28:16
0

Возможно, вы могли бы просто использовать do_shortcode(), если ваш контент состоит только из шорткодов, при условии что у вас нет другого контента, требующего фильтров.

Я не знаю контекста, но если вы находитесь в цикле:

echo do_shortcode($post->post_content);

18 нояб. 2015 г. 00:37:38
0

Ответ Borek не подошел для моего случая, когда нужно вставлять чистый HTML.

Для этого я использовал плагин Code Snippets (позволяет легко добавлять произвольные PHP-сниппеты, которые выполняются) для создания сниппета шорткода [html][/html]. Что особенно удобно - этот шорткод совместим с плагином toggle-wpautop, который позволяет отключить автоматическую вставку тегов <br> и <p> для всей записи. Вы можете использовать либо один, либо оба плагина вместе.

function html_shorttag_filter($content) {
  // Основано на: https://wordpress.org/plugins/lct-temporary-wpautop-disable-shortcode/
  $new_content = '';
  $pieces = preg_split('/(\[html\].*?\[\/html\])/is', $content, -1, PREG_SPLIT_DELIM_CAPTURE);
  // не мешать плагину, который отключает wpautop для всей страницы
  // см.: 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);
    }
  }
  // удаляем фильтр wpautop, но только если другой плагин не сделает это за нас
  if (!$autop_disabled) {
    remove_filter('the_content', 'wpautop');
    remove_filter('the_excerpt', 'wpautop');
  }
  return $new_content;
}
// идея использовать 9 взята из: 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);
7 дек. 2016 г. 21:41:49
1

Эта функция удаляет только теги <p> и <br> для шорткода.

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');
26 янв. 2019 г. 09:40:01
Комментарии

Это также влияет на все случаи, когда [ и ] не используются как часть вызова шорткода.

fuxia fuxia
26 янв. 2019 г. 10:02:13
0

Для тех, кто не знаком с взломом кода или не хочет использовать плагины, можно сделать следующее.

1) Скопируйте весь текущий код из страниц WordPress (текстовый редактор) копирование кода из текстового редактора WordPress

2) Затем вставьте его в блокнот и продолжайте редактирование (добавление шорткода, HTML или CSS кода)

3) Скопируйте и вставьте из блокнота обратно на ту же страницу в WordPress (текстовый редактор)

4) Нажмите кнопку [ОБНОВИТЬ], которая находится с правой стороны той же страницы WordPress, чтобы опубликовать изменения

кнопка обновления страницы в WordPress

5) Наконец, проверьте результат на живом сайте

Хитрость здесь в том, чтобы не переключаться обратно в [визуальный редактор] для этих конкретных страниц, тогда автоматическое добавление тегов [p] или [br] больше не будет происходить.

7 сент. 2019 г. 06:52:42