xóa đoạn văn bản trống khỏi the_content?


33

Chào các bạn, tôi chỉ đơn giản muốn ngăn chặn việc tạo ra các đoạn trống trong bài viết wordpress của tôi. Điều đó xảy ra khá thường xuyên khi cố gắng tự nội dung không gian.

Tôi không biết tại sao điều này không có hiệu lực?

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

chỉnh sửa / cập nhật:

Có vẻ như vấn đề là thế này:

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

tôi đã tự thực hiện chức năng này để lọc một loại mẫu shortcode trong bài viết và trang của mình. Mặc dù trong phần phụ trợ của tôi, bài viết được hoàn thành mà không có đoạn văn và khoảng cách không cần thiết, kết quả trông như thế này:

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

Bất cứ ý tưởng nơi p trống rỗng này đến từ đâu?



1
Hãy thử chạy bộ lọc của bạn trước khi wpautopthực hiện, ví dụ. add_filter('the_content', 'qanda', 7 );..
t31os

@ t31os: Bạn có thể chuyển bình luận của bạn đến một câu trả lời để chúng tôi có thể bỏ phiếu cho nó không?
Jan Fabry

Câu trả lời:


20

WordPress sẽ tự động chèn <p></p>các thẻ phân tách nội dung trong một bài đăng hoặc trang. Nếu, vì một số lý do, bạn muốn hoặc cần xóa những thứ này, bạn có thể sử dụng một trong các đoạn mã sau.

Để tắt hoàn toàn bộ lọc wpautop, bạn có thể sử dụng:

remove_filter('the_content', 'wpautop');

Nếu bạn vẫn muốn chức năng này hãy thử thêm một giá trị ưu tiên sau vào bộ lọc của bạn một cái gì đó như:

add_filter('the_content', 'removeEmptyParagraphs',99999);

2
cảm ơn bạn! Tôi biết wordpress tự động chèn thẻ p. Tuy nhiên, có một số trường hợp chỉ có các thẻ <p> </ p> trống ở đâu đó trong nội dung của tôi (khi tôi kiểm tra nó bằng một số công cụ) ... điều đó xảy ra khi thực hiện nhiều thao tác xóa và chỉnh sửa bài đăng. Tôi chỉ không muốn có những đoạn trống trong nội dung của mình, thế thôi. Tôi cần đoạn văn, chỉ là những đoạn không trống. 99999 không tạo ra sự khác biệt. Chỉ không làm việc. bộ lọc wpautop không phải là những gì tôi muốn. Nó ngăn tất cả <p> 's và tự động định dạng. Tôi chỉ không muốn bất kỳ p trống!
mathiregister

tôi đã cập nhật bài viết của mình để bạn hiểu ý tôi! tôi đã làm một chức năng đã lọc nội dung. nó chèn div và có vẻ như wordpress đang chèn <p> </ p> trước và sau nó, tôi không nhận được nó. có ý kiến ​​gì không
mathiregister

21

Tôi đã có cùng một vấn đề bạn có. Tôi vừa mới làm ... giả sử ... giải pháp không hay lắm, nhưng nó hiệu quả và cho đến nay đó là giải pháp duy nhất tôi có. Tôi đã thêm một dòng JavaScript nhỏ. Nó cần jQuery, nhưng tôi chắc chắn bạn có thể tìm ra nó mà không cần.

Đây là JS nhỏ bé của tôi:

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

Điều này làm việc cho tôi!


oh không phải là một con số nhỏ ngọt ngào Cảm ơn về mẹo - nó hoạt động với tôi và trong trường hợp bất kỳ ai khác tự hỏi làm thế nào để sử dụng nó, chỉ cần đặt nó vào tệp JS tùy chỉnh của chủ đề của bạn.
Sol

11
Bạn cũng có thể làm điều này với CSS:p:empty { display:none; }

@D_N Sử dụng CSS để ẩn các thẻ Đoạn trống chỉ hoạt động <p></p>nhưng không hoạt động <p>\n</p>.
Michael Ecklund

11

Tôi biết điều này đã được đánh dấu 'đã giải quyết' nhưng chỉ để tham khảo, đây là một chức năng thực hiện chính xác những gì bạn muốn mà không phải thêm bất kỳ đánh dấu nào vào bài viết. Chỉ cần đặt nó trong chức năng của chủ đề của bạn.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);
}

Đây là từ ý chính này: https://gist.github.com/1668216


6
Chỉ cần lưu ý một chút về việc sử dụng force_balance_tags () ... Tôi đã gặp phải một lỗi khó khăn do hàm này gây ra khi nó được sử dụng trên nội dung có chứa JavaScript (JS xuất phát từ Gravity Forms khi sử dụng ajax trên một biểu mẫu). Có những vấn đề được biết đến force_balance_tagskhi nó gặp <nhân vật trong những tình huống nhất định. Xem vé [9270] ( core.trac.wordpress.org/ticket/9270 ) để biết chi tiết.
Dave Romsey

Tôi đã gặp vấn đề tương tự được Dave nhấn mạnh: đoạn trích đã xóa video youtube nhúng và điều đó cũng gây ra sự cố xác thực trên các trang amp.
Marco Panichi

11

Đơn giản chỉ cần sử dụng CSS

p:empty {
  display: none;
}

Vui lòng thêm một lời giải thích cho câu trả lời của bạn
Pieter Goosen

4
@PieterGoosen nó đã tự giải thích
ít nhất ba ký tự

Nếu bạn chỉ muốn tránh hiển thị chúng cho mục đích giãn cách, thì điều này hoạt động tốt với IE9. caniuse.com/#feat=css-sel3developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty để biết thêm.
Sẽ

1
tùy chọn đẹp với phương pháp chọn CSS, không biết nó tồn tại. cảm ơn!
i_a

1
FYI: Nếu có &nbsp;thẻ <p> thì điều này sẽ không hoạt động.
RynoRn

5

Bạn chỉ có thể chạy bộ lọc của mình trước khi wpautopmóc nối khó chịu đó và gây rối với đánh dấu.

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

Bằng cách đó, bạn đã chuyển đổi những gì bạn cần vào thời điểm nó tiếp tục, điều này giúp ích trong một số trường hợp.


3

Cách tiếp cận tương tự hơn 2 câu trả lời trước tôi, nhưng một bản regex được cập nhật, vì anh ta không làm việc cho tôi.

regex: /<p>(?:\s|&nbsp;)*?<\/p>/i (nhóm không bắt giữ đang tìm kiếm bất kỳ số lượng khoảng trắng hoặc &nbsp;s nào trong thẻ p, tất cả các trường hợp không xác định.

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

0

Tôi thấy điều này kỳ lạ, nhưng thực sự việc gọi the_content()sẽ chèn các đoạn văn theo cách bạn mô tả. Nếu bạn muốn mã html, về cơ bản giống như bạn đã nhập nó (giống như "xem HTML" khi chỉnh sửa), sau đó sử dụng get_the_content()trả về nội dung mà không cần định dạng và thẻ đoạn.

Vì nó trả về nó, hãy đảm bảo bạn sử dụng một cái gì đó như:

echo get_the_content ();

Xem thêm: http://codex.wordpress.org/Function_Reference/get_the_content


vậy, cám ơn. Tuy nhiên tôi không muốn điều đó! Tôi cần những đoạn bình thường. Đầu tiên là đánh dấu ngữ nghĩa và thứ hai là cách nó được sử dụng. Tôi chỉ không có những đoạn trống không có ý nghĩa! Đơn giản vì tôi có kiểu dáng được áp dụng cho những đoạn đó cũng có những đoạn trống xuất hiện với kiểu này và trang của tôi trông lạ.
mathiregister

Tôi tự hỏi tại sao add_filter của tôi không hoạt động?
mathiregister

Gotcha. Vâng, một điều tôi khuyên bạn nên thử là chuyển từ HTML sang trực quan và quay lại một hoặc hai lần. Tôi tin rằng khi trình soạn thảo WYSIWYG tải, nó sẽ loại bỏ các thẻ đoạn trống.
cwd

0

Điều này sẽ loại bỏ đệ quy tất cả các thẻ html trống khỏi chuỗi

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

Mẫu được lấy từ http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html


0

Nếu bạn có <p>các thẻ có khoảng trắng trong nội dung, hãy chuyển đến bài đăng hoặc trang của bạn để chỉnh sửa nó không theo phong cách trực quan.

bạn sẽ tìm thấy một số &nbsp;trong đó .. Xóa nó và các <p>thẻ trống sẽ biến mất.


0

Để chỉ có nội dung html mà không có

các thẻ chúng ta có thể sử dụng vòng lặp sau để chỉ đặt html mà không định dạng bài đăng hoặc trang

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
Licensed under cc by-sa 3.0 with attribution required.