видалити порожні абзаци з_контенту?


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>

будь-яка ідея, звідки взявся цей порожній р?



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

2
Дякую тобі! Я знаю, що Wordpress автоматично вставляє теги p. Однак трапляються випадки, коли десь у моєму вмісті є лише порожні теги <p> </p> (коли я перевіряю його за допомогою якогось інструмента) ... це трапляється, коли робиться багато видалення та редагування публікацій. Я просто не хочу мати порожніх абзаців у своєму вмісті, ось і все. Мені потрібні абзаци, просто не порожні. 99999 не має значення. Просто не працює. фільтр wpautop - це не те, що я хочу. Це запобігає всім <p> і і автоформатування. Я просто не хочу порожніх п!
mathiregister

я оновив свій пост, щоб ви бачили, що я маю на увазі! Я зробив функцію, яка вже фільтрує вміст. він вставляє divs, і, здається, 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

Я знаю, що це вже позначено "вирішено", але лише для довідки, ось функція, яка робить саме те, що ви хочете, не додаючи розмітки до публікацій. Просто помістіть це в функції теми .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
FYI: Якщо є &nbsp;тег <p>, це не працює.
RynoRn

5

Ви можете просто запустити свій фільтр перед тим неприємним wpautopгачком і заплутатися з розміткою.

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

Таким чином, ви вже перетворили те, що вам потрібно, до моменту його підключення, що допомагає в деяких випадках.


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


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; ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.