¿Cómo eliminar párrafos vacíos de the_content?

3 abr 2011, 13:13:16
Vistas: 94.3K
Votos: 39

Hola a todos, Simplemente quiero evitar la creación de párrafos vacíos en mi entrada de WordPress. Esto sucede con frecuencia cuando se intenta espaciar el contenido manualmente.

No sé por qué esto no surte efecto:

/*Eliminar etiquetas de párrafos vacíos de 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');

edición/actualización:

parece que el problema es este:

function qanda($content) {

    // filtros para [q=alguna pregunta] y [a=alguna respuesta]
    // lo envuelve dentro de <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');

hice esta función yo mismo para filtrar un tipo de patrón de shortcode en mis entradas y páginas. Aunque en mi backend la entrada está completamente hecha sin párrafos y espacios innecesarios, el resultado se ve así:

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

¿alguna idea de dónde vienen estos p vacíos?

3
Comentarios

Intenta ejecutar tu filtro antes de que wpautop haga su trabajo, por ejemplo: add_filter('the_content', 'qanda', 7 );..

t31os t31os
4 abr 2011 01:16:10

@t31os: ¿Puedes mover tu comentario a una respuesta para que podamos votarlo?

Jan Fabry Jan Fabry
6 abr 2011 15:31:22
Todas las respuestas a la pregunta 11
3
25

Tenía el mismo problema que tú. Hice una... digamos... solución no muy bonita, pero funciona y hasta ahora es la única solución que tengo. Añadí una pequeña línea de JavaScript. Necesita jQuery, pero estoy seguro de que puedes resolverlo sin él.

Este es mi pequeño JS:

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

¡Esto funciona para mí!

2 ene 2012 12:00:02
Comentarios

¡Oh, qué pequeña maravilla! Gracias por el consejo - funciona para mí y por si alguien más se preguntaba cómo usarlo, solo colócalo en el archivo JS personalizado de tu tema.

SolaceBeforeDawn SolaceBeforeDawn
6 sept 2012 08:08:07

También puedes hacer esto con CSS: p:empty { display:none; }

User User
20 jul 2016 04:42:00

@D_N Usar CSS para ocultar etiquetas de párrafo vacías solo funciona para <p></p> pero no funciona para <p>\n</p>.

Michael Ecklund Michael Ecklund
21 abr 2017 23:51:33
6
23

Simplemente usa CSS

p:empty {
  display: none;
}
30 sept 2015 16:24:27
Comentarios

Por favor, añade una explicación a tu respuesta

Pieter Goosen Pieter Goosen
30 sept 2015 16:49:24

@PieterGoosen ya es autoexplicativo

at least three characters at least three characters
1 oct 2015 15:23:54

Si solo quieres evitar mostrarlos por motivos de espaciado, esto funciona bien hasta IE9. http://caniuse.com/#feat=css-sel3 y https://developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty para más información.

Will Will
3 ene 2016 23:11:32

buena opción con el método de selector CSS, no sabía que existía. ¡gracias!

i_a i_a
14 abr 2016 14:47:18

Para tu información: Si hay &nbsp; dentro de la etiqueta <p>, esto no funcionará.

laszlo-horvath laszlo-horvath
6 jun 2019 17:52:04

Esto en realidad no funciona.

pjk_ok pjk_ok
5 ene 2021 00:27:08
Mostrar los 1 comentarios restantes
2
22

WordPress insertará automáticamente las etiquetas <p> y </p> que separan los saltos de contenido dentro de una publicación o página. Si, por algún motivo, deseas o necesitas eliminarlos, puedes utilizar cualquiera de los siguientes fragmentos de código.

Para desactivar completamente el filtro wpautop, puedes usar:

remove_filter('the_content', 'wpautop');

Si aún deseas que esta función siga activa, intenta agregar un valor de prioridad más alto a tu filtro, algo como:

add_filter('the_content', 'removeEmptyParagraphs',99999);
3 abr 2011 15:15:51
Comentarios

¡gracias! Sé que WordPress inserta automáticamente etiquetas p. Sin embargo, hay casos en los que aparecen etiquetas <p></p> vacías en algún lugar de mi contenido (cuando lo inspecciono con alguna herramienta)... eso sucede al hacer muchas eliminaciones y ediciones de publicaciones. Simplemente no quiero tener párrafos vacíos en mi contenido, eso es todo. Sí necesito párrafos, pero no vacíos. El 99999 no hace diferencia. Simplemente no funciona. El filtro wpautop no es lo que quiero. Eso evita todos los <p> y el formato automático. ¡Solo no quiero párrafos vacíos!

mathiregister mathiregister
3 abr 2011 15:23:07

¡actualicé mi publicación para que veas a lo que me refiero! Hice una función que ya filtra el contenido. Inserta divs y parece que WordPress está insertando <p></p> antes y después, simplemente no lo entiendo. ¿alguna idea?

mathiregister mathiregister
3 abr 2011 16:02:39
2
15

Sé que esto ya está marcado como 'resuelto', pero solo como referencia, aquí hay una función que hace exactamente lo que quieres sin tener que añadir ningún marcado a las publicaciones. Solo coloca esto en el functions.php de tu tema:

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

Esto es de este gist: https://gist.github.com/1668216

23 may 2012 01:03:32
Comentarios

Solo una pequeña nota sobre el uso de force_balance_tags()...

Me encontré con un error complicado causado por esta función cuando se usaba en contenido que incluía JavaScript (el JS provenía de Gravity Forms al usar ajax en un formulario). Hay problemas conocidos con force_balance_tags cuando encuentra el carácter < en ciertas situaciones. Consulta el ticket 9270 para más detalles.

Dave Romsey Dave Romsey
15 ago 2013 00:56:57

Tuve el mismo problema señalado por Dave: el fragmento eliminaba videos incrustados de YouTube y eso causaba problemas de validación en las páginas AMP también.

Marco Panichi Marco Panichi
29 jun 2019 15:14:49
0

Podrías ejecutar tu filtro antes de que ese molesto wpautop se enganche y estropee el marcado.

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

De esa manera, ya habrás convertido lo que necesitas para cuando se active, lo que ayuda en algunos casos.

6 abr 2011 15:40:17
0

Mismo enfoque que las 2 respuestas anteriores, pero con una expresión regular actualizada, porque la suya no funcionó para mí.

La expresión regular: /<p>(?:\s|&nbsp;)*?<\/p>/i (grupo sin captura que busca cualquier cantidad de espacios en blanco o &nbsp; dentro de la etiqueta p, todo insensible a mayúsculas/minúsculas).

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

Encontré esto extraño, pero en realidad llamar a the_content() insertará párrafos de la manera que describes. Si quieres el código html, básicamente como lo ingresaste (igual a "ver HTML" al editar), entonces usa get_the_content() que devuelve el contenido sin formato y sin etiquetas de párrafo.

Ya que lo devuelve, asegúrate de usar algo como:

echo get_the_content();

Ver también: http://codex.wordpress.org/Function_Reference/get_the_content

3 abr 2011 17:40:24
Comentarios

bien, gracias. Sin embargo, ¡no quiero eso! Necesito párrafos normales. Primero, es marcado semántico y en segundo lugar, es simplemente como debe ser. No quiero tener párrafos vacíos que no tienen sentido. Simplemente porque tengo estilos aplicados a esos párrafos, los párrafos vacíos aparecen con este estilo y mi página se ve rara.

mathiregister mathiregister
3 abr 2011 17:54:39

Realmente me pregunto, ¿por qué mi cosa de add_filter no funciona?

mathiregister mathiregister
3 abr 2011 17:55:00

Entendido. Bueno, una cosa que recomendaría probar es cambiar de HTML a visual y viceversa un par de veces. Creo que cuando el editor WYSIWYG se carga, elimina las etiquetas de párrafo vacías.

cwd cwd
4 abr 2011 06:11:15
0

Esto eliminará recursivamente todas las etiquetas HTML vacías de la cadena

add_filter('the_content', 'remove_empty_tags_recursive', 20, 1);
function remove_empty_tags_recursive ($str, $repto = NULL) {
         $str = force_balance_tags($str);
         //** Retorna si no se proporciona cadena o está vacía.
         if (!is_string ($str)
         || trim ($str) == '')
        return $str;

        //** Etiquetas HTML vacías recursivas.
       return preg_replace (

              //** Patrón escrito por Junaid Atari.
              '/<([^<\/>]*)>([\s]*?|(?R))<\/\1>/imsU',

             //** Reemplaza con nada si la cadena está vacía.
             !is_string ($repto) ? '' : $repto,

            //** Cadena de origen
           $str
);}

El patrón fue tomado de http://codesnap.blogspot.in/2011/04/recursively-remove-empty-html-tags.html

7 may 2014 16:37:39
0

Si tienes etiquetas <p> con espacios en blanco en el contenido, ve a tu entrada o página y edítala no en modo visual.

Encontrarás algunos &nbsp; ahí... Elimínalos y las etiquetas <p> vacías desaparecerán.

15 may 2017 13:33:03
0

Para obtener solo el contenido HTML sin las etiquetas <p></p> podemos usar el siguiente bucle para mostrar únicamente el HTML sin el formato de la entrada o página

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php echo $post->post_content; ?>
<?php endwhile; endif; ?>
19 sept 2018 14:15:56
0

Si estás obteniendo una etiqueta <p> vacía en la parte superior de tu página o publicación, generalmente es causado por envolver <?php the_content();?> en etiquetas de párrafo.

PROBLEMA

Esto es lo que causa la etiqueta <p> perdida en la parte superior de la página/publicación:

<p><?php the_content();?></p>

SOLUCIÓN

Si eliminas las etiquetas <p> y solo dejas la etiqueta de plantilla, resolverás el problema.

<?php the_content();?>

5 ene 2021 00:37:22