¿Cómo eliminar párrafos vacíos de the_content?
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?
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í!

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

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.

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

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

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

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

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

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.

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| )*?<\/p>/i
(grupo sin captura que busca cualquier cantidad de espacios en blanco o
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| )*?<\/p>/i', '', $content);
}, 10, 1);

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

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.

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

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

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

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