hapus paragraf kosong dari the_content?

33

Hai teman-teman, saya hanya ingin mencegah pembuatan paragraf kosong di postingan wordpress saya. Itu terjadi cukup sering ketika mencoba ruang konten secara manual.

Saya tidak tahu mengapa ini tidak berpengaruh?

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

edit / perbarui:

Sepertinya masalahnya adalah ini:

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

saya melakukan ini berfungsi sendiri untuk menyaring semacam pola kode pendek di posting dan halaman saya. Meskipun di backend saya posting sepenuhnya dilakukan tanpa paragraf dan jarak yang tidak perlu hasilnya terlihat seperti ini:

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

ada ide dari mana p kosong ini berasal?

mathiregister
sumber
1
Coba jalankan filter Anda sebelum wpautopmelakukannya, mis. add_filter('the_content', 'qanda', 7 );..
t31os
@ t31os: Dapatkah Anda memindahkan komentar Anda ke sebuah jawaban sehingga kami dapat memberikan suaranya?
Jan Fabry

Jawaban:

20

WordPress akan secara otomatis memasukkan <p>dan memberi </p>tag yang memisahkan konten dalam posting atau halaman. Jika, karena alasan tertentu, Anda ingin atau perlu menghapus ini, Anda dapat menggunakan salah satu dari potongan kode berikut.

Untuk sepenuhnya menonaktifkan filter wpautop, Anda dapat menggunakan:

remove_filter('the_content', 'wpautop');

Jika Anda masih ingin ini berfungsi coba tambahkan nilai prioritas nanti ke filter Anda seperti:

add_filter('the_content', 'removeEmptyParagraphs',99999);
Bainternet
sumber
2
Terima kasih! Saya tahu wordpress secara otomatis memasukkan tag p. Namun ada beberapa kasus di mana hanya ada tag <p> </p> kosong di suatu tempat di konten saya (ketika saya memeriksanya dengan beberapa alat) ... yang terjadi ketika melakukan banyak penghapusan dan pengeditan posting. Saya hanya tidak ingin memiliki paragraf kosong di konten saya, itu saja. Saya perlu paragraf, hanya saja tidak kosong. 99999 tidak membuat perbedaan. Tidak berhasil. filter wpautop bukan yang saya inginkan. Ini mencegah semua <p> dan autoformatting. Aku hanya tidak ingin ada yang kosong!
mathiregister
saya memperbarui posting saya sehingga Anda mengerti maksud saya! saya melakukan fungsi yang sudah memfilter konten. itu memasukkan divs dan sepertinya wordpress memasukkan <p> </p> sebelum dan sesudahnya, saya hanya tidak mengerti. ada ide?
mathiregister
21

Saya memiliki masalah yang sama dengan yang Anda miliki. Saya hanya melakukan ... katakanlah ... bukan solusi yang sangat indah, tetapi itu berfungsi dan sejauh ini satu-satunya solusi yang saya miliki. Saya menambahkan sedikit garis JavaScript. Perlu jQuery, tapi saya yakin Anda bisa mengetahuinya tanpa.

Ini JS kecil saya:

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

Ini bekerja untuk saya!

David Faber
sumber
oh tidak sedikit itu manis! Terima kasih atas tipnya - ini bekerja untuk saya dan jika ada orang yang bertanya-tanya bagaimana cara menggunakannya, cukup taruh di file JS kustom tema Anda.
Sol
11
Anda juga dapat melakukan ini dengan CSS:p:empty { display:none; }
@D_N Menggunakan CSS untuk menyembunyikan tag paragraf kosong hanya berfungsi <p></p>tetapi tidak berhasil <p>\n</p>.
Michael Ecklund
11

Saya tahu ini sudah ditandai 'terpecahkan' tetapi hanya untuk referensi, inilah fungsi yang melakukan persis apa yang Anda inginkan tanpa harus menambahkan markup ke pos. Masukkan saja ini di functions.php tema Anda:

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

Ini dari intisari ini: https://gist.github.com/1668216

Michelle
sumber
6
Hanya sedikit catatan tentang penggunaan force_balance_tags () ... Saya menemukan bug yang disebabkan oleh fungsi ini ketika digunakan pada konten yang menyertakan JavaScript (JS berasal dari Gravity Forms saat menggunakan ajax pada formulir). Ada masalah yang diketahui force_balance_tagsketika bertemu <karakter dalam situasi tertentu. Lihat tiket [9270] ( core.trac.wordpress.org/ticket/9270 ) untuk detailnya.
Dave Romsey
Saya memiliki masalah yang sama yang disorot oleh Dave: cuplikan dihapus video youtube tertanam dan yang menyebabkan masalah validasi pada halaman amp juga.
Marco Panichi
11

Cukup gunakan CSS

p:empty {
  display: none;
}
setidaknya tiga karakter
sumber
Silakan tambahkan penjelasan untuk jawaban Anda
Pieter Goosen
4
@PieterGoosen sudah cukup jelas
setidaknya tiga karakter
Jika Anda hanya ingin menghindari menampilkannya untuk tujuan penspasian, ini bekerja dengan baik hingga IE9. caniuse.com/#feat=css-sel3 dan developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty untuk lebih banyak.
Will
1
Pilihan bagus dengan metode pemilih CSS, tidak tahu itu ada. Terima kasih!
i_a
1
FYI: Jika ada &nbsp;di dalam tag <p> ini tidak akan berfungsi.
RynoRn
5

Anda bisa menjalankan filter Anda sebelum wpautophook jahat itu hidup dan mengacaukan markup.

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

Dengan begitu, Anda telah mengonversi apa yang Anda butuhkan saat terhubung, yang memang membantu dalam beberapa kasus.

t31os
sumber
3

Pendekatan yang sama dari 2 jawaban sebelum saya, tetapi regex yang diperbarui, karena itu tidak bekerja untuk saya.

regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (grup bukan tangkap yang mencari sejumlah spasi putih atau &nbsp;p-tag di dalam, semua case insenstive.

add_filter('the_content', function($content) {
    $content = force_balance_tags($content);
    return preg_replace('/<p>(?:\s|&nbsp;)*?<\/p>/i', '', $content);
}, 10, 1);
kater louis
sumber
0

Saya menemukan ini aneh, tetapi sebenarnya menelepon the_content()akan memasukkan paragraf dengan cara yang Anda jelaskan. Jika Anda menginginkan kode html, pada dasarnya seperti Anda memasukkannya (sama dengan "view HTML" saat mengedit), kemudian gunakan get_the_content()yang mengembalikan konten tanpa pemformatan dan tag paragraf.

Karena mengembalikannya, pastikan Anda menggunakan sesuatu seperti:

gema get_the_content ();

Lihat juga: http://codex.wordpress.org/Function_Reference/get_the_content

cwd
sumber
Baiklah terima kasih. Namun saya tidak menginginkan itu! Saya butuh paragraf normal. Pertama, markup semantik dan kedua seperti yang seharusnya. Saya hanya tidak memiliki paragraf kosong yang tidak masuk akal! Hanya karena saya telah menerapkan gaya pada paragraf-paragraf itu juga paragraf kosong muncul dengan gaya ini dan halaman saya terlihat aneh.
mathiregister
Saya benar-benar heran mengapa add_filter saya tidak berfungsi?
mathiregister
Gotcha. Yah satu hal yang saya sarankan coba adalah beralih dari HTML ke visual dan kembali satu atau dua kali. Saya percaya ketika editor WYSIWYG memuat itu tidak menghapus tag paragraf kosong.
cwd
0

Ini akan secara rekursif menghapus semua tag html kosong dari string

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

Pola diambil dari http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

pengguna2914440
sumber
0

Jika Anda memiliki <p>tag dengan spasi kosong di konten, buka posting atau halaman Anda yang suntingnya tidak dalam gaya visual.

Anda akan menemukan beberapa &nbsp;di sana .. Hapus dan <p>tag kosong akan hilang.

Christian Isak
sumber
0

Agar hanya memiliki konten html tanpa

tag kita dapat menggunakan loop berikut untuk hanya menempatkan html tanpa memformat posting atau halaman

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Shashank
sumber