eliminar párrafos vacíos del_contenido?

33

Hola chicos, simplemente quiero evitar la creación de párrafos vacíos en mi publicación de WordPress. Eso sucede con bastante frecuencia cuando se intenta espaciar manualmente el contenido.

No sé por qué esto no tiene efecto.

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

editar / actualizar:

Parece que el problema es este:

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

Hice esta función para filtrar un tipo de patrón de código corto en mis publicaciones y páginas. Aunque en mi backend la publicación 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 provienen estas p vacías?

Mathiregister
fuente
1
Intente ejecutar su filtro antes de wpautopque sea una cosa, por ejemplo add_filter('the_content', 'qanda', 7 );..
t31os
@ t31os: ¿Puedes mover tu comentario a una respuesta para que podamos votarlo?
Jan Fabry

Respuestas:

20

WordPress insertará <p>y </p>etiquetará automáticamente los saltos de contenido separados dentro de una publicación o página. Si, por algún motivo, desea o necesita eliminarlos, puede usar cualquiera de los siguientes fragmentos de código.

Para deshabilitar completamente el filtro wpautop, puede usar:

remove_filter('the_content', 'wpautop');

Si aún desea que esto funcione, intente agregar un valor de prioridad posterior a su filtro, como:

add_filter('the_content', 'removeEmptyParagraphs',99999);
Bainternet
fuente
2
¡gracias! Sé que WordPress inserta automáticamente las etiquetas p. Sin embargo, suceden algunos casos en los que solo hay etiquetas <p> </p> vacías en algún lugar de mi contenido (cuando lo inspecciono con alguna herramienta) ... eso sucede cuando elimino y edito muchas publicaciones. Simplemente no quiero tener párrafos vacíos en mi contenido, eso es todo. Necesito párrafos, solo que no vacíos. El 99999 no hace la diferencia. Simplemente no funciona. El filtro wpautop no es lo que quiero. Evita todos los <p> 's y autoformatos. ¡Simplemente no quiero ninguna p vacía!
mathiregister
¡Actualicé mi publicación para que vean lo que quiero decir! 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. ¿algunas ideas?
mathiregister
21

Tuve el mismo problema que tú. Acabo de hacer una ... digamos ... una solución no muy hermosa, pero funciona y hasta ahora es la única solución que tengo. Agregué una pequeña línea de JavaScript. Necesita jQuery, pero estoy seguro de que puede resolverlo sin él.

Este es mi pequeño JS:

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

Esto funciona para mi!

David Faber
fuente
¡Oh, no es un número pequeño y dulce! Gracias por el consejo: funciona para mí y en caso de que alguien más se pregunte cómo usarlo, simplemente colóquelo en el archivo JS personalizado de su tema.
Sol
11
También puede hacer esto con CSS:p:empty { display:none; }
@D_N Usar CSS para ocultar etiquetas de párrafo vacías solo funciona <p></p>pero no funciona <p>\n</p>.
Michael Ecklund
11

Sé que esto ya está marcado como 'resuelto', pero solo como referencia, aquí hay una función que hace exactamente lo que desea sin tener que agregar ningún marcado a las publicaciones. Simplemente ponga esto en las funciones de su tema.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);
}

Esto es de esta esencia: https://gist.github.com/1668216

Michelle
fuente
66
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 (JS provenía de Gravity Forms cuando usaba ajax en un formulario). Hay problemas conocidos con force_balance_tagscuando se encuentra con el <personaje en ciertas situaciones. Vea el boleto [9270] ( core.trac.wordpress.org/ticket/9270 ) para más detalles.
Dave Romsey
Tenía el mismo problema resaltado por Dave: el fragmento eliminó el video incrustado de YouTube y eso también causó problemas de validación en las páginas de amplificadores.
Marco Panichi
11

Simplemente usa CSS

p:empty {
  display: none;
}
al menos tres personajes
fuente
Agregue una explicación a su respuesta
Pieter Goosen
44
@PieterGoosen ya se explica por sí mismo
al menos tres caracteres el
Si solo desea evitar mostrarlos con fines de espaciado, esto funciona bien hasta IE9. caniuse.com/#feat=css-sel3 y developer.mozilla.org/en-US/docs/Web/CSS/%3Aempty para obtener más información.
Will
1
Buena opción con el método selector CSS, no sabía que existía. ¡Gracias!
i_a
1
FYI: Si hay &nbsp;dentro de la etiqueta <p> esto no funcionará.
RynoRn
5

Podrías ejecutar tu filtro antes de que ese desagradable wpautopenganche y se meta con el marcado.

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

De esa manera, ya ha convertido lo que necesita para cuando se conecta, lo que ayuda en algunos casos.

t31os
fuente
3

El mismo enfoque que 2 respuestas antes que yo, pero 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 número de espacios en blanco o &nbsp;s dentro de la etiqueta p, sin distinción entre mayúsculas y minúsculas.

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

Encontré esto extraño, pero en realidad llamar the_content()inserta párrafos de la manera que usted describe. Si desea el código html, básicamente como lo ingresó (lo mismo que "ver HTML" al editar), useget_the_content() que devuelve el contenido sin formato ni etiquetas de párrafo.

Como lo devuelve, asegúrese de usar algo como:

echo get_the_content ();

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

cwd
fuente
bueno, gracias. Sin embargo, no quiero eso! Necesito párrafos normales En primer lugar, su marcado semántico y, en segundo lugar, es exactamente como se supone que debe hacerlo. ¡Simplemente no tengo párrafos vacíos que no tienen sentido! Simplemente porque tengo un estilo aplicado a esos párrafos, también aparecen párrafos vacíos con este estilo y mi página se ve rara.
mathiregister
Realmente me pregunto por qué mi cosa add_filter no funciona.
mathiregister
Gotcha Bueno, una cosa que recomendaría probar es cambiar de HTML a visual y viceversa una o dos veces. Creo que cuando el editor WYSIWYG carga, elimina las etiquetas de párrafo vacías.
cwd
0

Esto eliminará de forma recursiva 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);
         //** 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
);}

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

usuario2914440
fuente
0

Si usted tiene <p> etiquetas con espacios en blanco en el contenido, vaya a su publicación o página y edítelo sin estilo visual.

encontrará algunos &nbsp;allí. Elimínelos y las <p>etiquetas vacías desaparecerán.

Christian Isak
fuente
0

Para tener solo contenido html sin

podemos usar el siguiente bucle para colocar solo el html sin formatear la publicación o la página

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