удалить пустые абзацы из the_content?

33

Эй, ребята, я просто хочу предотвратить создание пустых абзацев в моем посте WordPress. Это происходит довольно часто при попытке вручную разместить содержимое.

Я не знаю, почему это не вступает в силу?

/*Remove empty paragraph tags from the_content*/
function removeEmptyParagraphs($content) {

    /*$pattern = "/<p[^>]*><\\/p[^>]*>/";   
    $content = preg_replace($pattern, '', $content);*/
    $content = str_replace("<p></p>","",$content);
    return $content;
}

add_filter('the_content', 'removeEmptyParagraphs');

редактировать / обновление:

Кажется, проблема в следующем:

function qanda($content) {

    // filters for [q=some question] and [a=some answer]
    // wraps it inside of <div class="qanda"><div class="question"> </div><div class="answer"> </div></div>
    $content = preg_replace('/\[q=(.+?)].+?\[a=(.+?)]/is', '<div class="qanda"><div class="question">$1</div><div class="answer">$2</div></div>', $content);

    return $content;
}

add_filter('the_content', 'qanda');

Я сделал эту функцию сам, чтобы отфильтровать своего рода шаблон шорткода в моих сообщениях и страницах. Хотя в моем бэкэнде пост полностью сделан без абзацев и лишних пробелов, результат выглядит так:

<div class="entry">

    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>
    <p></p>
    <p></p>
    <div class="qanda">...</div>

</div>

Есть идеи, откуда взялись эти пустые буквы?

mathiregister
источник
1
Попробуйте запустить свой фильтр, прежде чем wpautopэто сделать, например. add_filter('the_content', 'qanda', 7 );..
t31os
@ t31os: Можете ли вы переместить свой комментарий к ответу, чтобы мы могли проголосовать за него?
Ян Фабри

Ответы:

20

WordPress будет автоматически вставлять <p>и </p>теги , которые разделяют разрывы контента внутри поста или страницы. Если по какой-либо причине вы хотите или должны удалить их, вы можете использовать любой из следующих фрагментов кода.

Чтобы полностью отключить фильтр wpautop, вы можете использовать:

remove_filter('the_content', 'wpautop');

Если вы по-прежнему хотите, чтобы это работало, попробуйте добавить более позднее значение приоритета в ваш фильтр, например:

add_filter('the_content', 'removeEmptyParagraphs',99999);
Bainternet
источник
2
Спасибо! Я знаю, что WordPress автоматически вставляет теги p. Однако бывают случаи, когда где-то в моем контенте есть пустые теги <p> </ p> (когда я проверяю их с помощью какого-либо инструмента) ... это происходит при большом удалении и редактировании сообщений. Я просто не хочу, чтобы в моем содержании были пустые абзацы, вот и все. Мне нужны параграфы, только не пустые. 99999 не имеет значения. Просто не работает. фильтр wpautop - это не то, что я хочу. Это предотвращает все <p> и автоформатирование. Я просто не хочу пустых писем!
mathiregister
я обновил свой пост, чтобы вы поняли, о чем я! Я сделал функцию, которая уже фильтрует содержимое. он вставляет div и кажется, что WordPress вставляет <p> </ p> до и после него, я просто не понимаю. Любые идеи?
mathiregister
21

У меня была та же проблема, что и у вас. Я только что ... скажем ... не очень красивое решение, но оно работает, и пока это единственное решение, которое у меня есть. Я добавил небольшую строку JavaScript. Это требует jQuery, но я уверен, что вы можете понять это без.

Это мой крошечный JS:

$('p:empty').remove();

Это работает для меня!

Дэвид Фабер
источник
о, это не милый маленький номер! Спасибо за совет - он работает для меня, и в случае, если кто-то еще интересуется, как его использовать, просто поместите его в пользовательский файл JS вашей темы.
Соль
11
Вы также можете сделать это с помощью CSS:p:empty { display:none; }
@D_N Использование CSS для скрытия пустых тегов абзаца работает только для, <p></p>но не работает <p>\n</p>.
Майкл Эклунд
11

Я знаю, что это уже помечено как «решено», но просто для справки, вот функция, которая делает именно то, что вы хотите, без необходимости добавлять какие-либо разметки к сообщениям. Просто поместите это в functions.php вашей темы:

add_filter('the_content', 'remove_empty_p', 20, 1);
function remove_empty_p($content){
    $content = force_balance_tags($content);
    return preg_replace('#<p>\s*+(<br\s*/*>)?\s*</p>#i', '', $content);
}

Это из этой сущности: https://gist.github.com/1668216

Мишель
источник
6
Просто небольшая заметка об использовании force_balance_tags () ... Я столкнулся с хитрой ошибкой, вызванной этой функцией, когда она использовалась для контента, включающего JavaScript (JS исходил из Gravity Forms при использовании ajax в форме). Есть известные проблемы с тем, force_balance_tagsкогда он сталкивается с <персонажем в определенных ситуациях. Подробности смотрите в билете [9270] ( core.trac.wordpress.org/ticket/9270 ).
Дэйв Ромси,
У меня была та же проблема, выделенная Дейвом: фрагмент удалил встроенное видео на YouTube, что также вызвало проблемы с проверкой на страницах с усилителями.
Марко Паничи
11

Просто используйте CSS

p:empty {
  display: none;
}
минимум три персонажа
источник
Пожалуйста, добавьте объяснение к вашему ответу
Питер Гусен
4
@PieterGoosen это уже говорит само за себя
как минимум три символа
Если вы просто хотите избежать отображения их в целях пробелов, это хорошо работает до IE9. caniuse.com/#feat=css-sel3 и developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty для получения дополнительной информации.
Будет
1
хороший вариант с методом селектора CSS, не знал, что он существует. Благодарность!
i_a
1
К вашему сведению: если есть &nbsp;тег <p>, это не сработает.
RynoRn
5

Вы можете просто запустить свой фильтр до того, как этот неприятный wpautopзацепит и испортит разметку.

add_filter('the_content', 'qanda', 7 );

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

t31os
источник
3

Тот же подход, что и 2 ответа до меня, но обновленное регулярное выражение, потому что его у меня не сработало.

регулярное выражение: /<p>(?:\s|&nbsp;)*?<\/p>/i (группа без захвата ищет любое количество пробелов или &nbsp;s внутри p-тега, без учета регистра).

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
Катер Луис
источник
0

Я нахожу это странным, но на самом деле вызов the_content()будет вставлять абзацы так, как вы описываете. Если вам нужен HTML-код, в основном, как вы его ввели (то же самое, что и «просмотр HTML» при редактировании), используйте get_the_content()метод, который возвращает содержимое без форматирования и теги абзаца.

Поскольку он возвращает его, убедитесь, что вы используете что-то вроде:

echo get_the_content ();

Смотрите также: http://codex.wordpress.org/Function_Reference/get_the_content

УХО
источник
что ж, спасибо тебе. Однако я не хочу этого! Мне нужны нормальные абзацы. Во-первых, это семантическая разметка, а во-вторых, именно так, как и должно быть. У меня просто нет пустых абзацев, которые не имеют смысла! Просто потому, что к этим абзацам применен стиль, также появляются пустые абзацы с этим стилем, и моя страница выглядит странно.
mathiregister
Я действительно удивляюсь, почему моя штука add_filter не работает?
mathiregister
Попался. Хорошо, я бы порекомендовал попробовать переключиться с HTML на визуальный и обратно раз или два. Я считаю, что когда WYSIWYG-редактор загружается, он удаляет пустые теги абзаца.
cwd
0

Это рекурсивно удалит все пустые HTML-теги из строки

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Return if string not given or empty.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Recursive empty HTML tags.
       return preg_replace (

              //** Pattern written by Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Replace with nothing if string empty.
             !is_string ($repto) ? '' : $repto,

            //** Source string
           $str
);}

Шаблон взят из http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

user2914440
источник
0

Если у вас есть <p>теги с пробелами в содержании, перейдите к своему сообщению или странице и отредактируйте его не в визуальном стиле.

Вы найдете &nbsp;там несколько. Удалите его, и пустые <p>теги исчезнут.

Кристиан Исак
источник
0

Для того, чтобы иметь только HTML-контент без

теги, которые мы можем использовать в следующем цикле, чтобы выводить только HTML без форматирования поста или страницы

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Shashank
источник