удалить пустые абзацы из содержимого?
Привет, ребята, Я просто хочу предотвратить создание пустых абзацев в моем посте 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>
Есть идеи, откуда взялась эта пустая буква "п"?
11 answers
WordPress автоматически вставит теги <p>
и </p>
, которые разделяют разрывы контента внутри сообщения или страницы. Если по какой-либо причине вы хотите или должны удалить их, вы можете использовать любой из следующих фрагментов кода.
Чтобы полностью отключить фильтр wpautop, вы можете использовать:
remove_filter('the_content', 'wpautop');
Если вы все еще хотите, чтобы это работало, попробуйте добавить более позднее значение приоритета в свой фильтр, например:
add_filter('the_content', 'removeEmptyParagraphs',99999);
У меня была та же проблема, что и у вас. Я только что сделал... скажем так... не очень красивое решение, но оно работает, и пока это единственное решение, которое у меня есть. Я добавил небольшую строку JavaScript. Для этого нужен jQuery, но я уверен, что вы сможете разобраться без него.
Это мой крошечный JS:
$('p:empty').remove();
Это работает для меня!
Просто используйте CSS
p:empty {
display: none;
}
Я знаю, что это уже помечено как "решено", но просто для справки, вот функция, которая делает именно то, что вы хотите, без необходимости добавлять какую-либо разметку к публикациям. Просто поместите это в свою тему 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
Вы могли бы просто запустить свой фильтр, прежде чем этот противный wpautop
зацепится и испортит разметку.
add_filter('the_content', 'qanda', 7 );
Таким образом, вы уже преобразовали то, что вам нужно, к моменту подключения, что в некоторых случаях помогает.
Тот же подход, что и 2 ответа до меня, но обновленное регулярное выражение, потому что его не сработало для меня.
Регулярное выражение: /<p>(?:\s| )*?<\/p>/i
(группа без захвата ищет любое количество пробелов или
внутри p-тега, все без учета регистра.
add_filter('the_content', function($content) {
$content = force_balance_tags($content);
return preg_replace('/<p>(?:\s| )*?<\/p>/i', '', $content);
}, 10, 1);
Я нашел это странным, но на самом деле вызов the_content()
вставит абзацы так, как вы описываете. Если вам нужен html-код, в основном такой, как вы его ввели (такой же, как "просмотр HTML" при редактировании), используйте get_the_content()
, который возвращает содержимое без форматирования и тегов абзацев.
Поскольку он возвращает его, убедитесь, что вы используете что-то вроде:
echo get_the_content();
См. также: http://codex.wordpress.org/Function_Reference/get_the_content
Это рекурсивно удалит все пустые 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
Если у вас есть теги <p>
с пробелами в содержимом,
перейдите на свой пост или страницу и отредактируйте его не в визуальном стиле.
Вы бы нашли там немного
..
Удалите его, и пустые теги <p>
исчезнут.
Для того, чтобы иметь только html-контент без
теги мы можем использовать следующий цикл, чтобы выводить только html-код без форматирования сообщения или страницы<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Если вы получаете пустой тег <p>
в верхней части своей страницы или публикации, это обычно вызвано переносом <?php the_content();?>
в теги абзацев.
ПРОБЛЕМА
Вот что вызывает случайный тег <p>
в верхней части страницы/поста:
<p><?php the_content();?></p>
РЕШЕНИЕ
Если вы удалите теги <p>
и у вас будет только тег шаблона, вы решите проблему.
<?php the_content();?>