WordPress eliminando etiquetas <p>?
Ya me había encontrado con un caso donde WordPress agregaba etiquetas <p>
. Sin embargo, ahora estoy lidiando con la situación opuesta. Cuando agrego shortcodes [] dentro de etiquetas <p>
, WordPress automáticamente elimina las etiquetas <p>
.
<p>[anyshortcode]Hola Mundo[/anyshortcode]</p>
Se convierte en:
Hola Mundo
Agregar dir="ltr" a las etiquetas <p>
parece solucionar el problema, ¿quizás hay una manera de agregarlo programáticamente a todas las etiquetas <p>
?
¿Alguna idea sobre cómo solucionar esto?

Esto es básicamente lo que Foxsk8 mencionó en un comentario, así que el crédito debería ir para él, pero estas instrucciones adicionales serán útiles. El plugin de WordPress llamado TinyMCE Advanced resolverá tu problema.
Este plugin incluye una opción dentro de Ajustes > TinyMCE Advanced
que solucionará el problema de tus etiquetas <p>
que desaparecen. Marca la casilla etiquetada como Dejar de eliminar las etiquetas <p> y <br /> al guardar y mostrarlas en el editor de Texto
y tus etiquetas <p>
se conservarán.

TinyMCE está programado para facilitar la edición (lo cual para los expertos en HTML a menudo no es el caso). Por defecto, no debería aceptar etiquetas <p>
alrededor de [BLOQUES]. Esto se debe a que los "[]" se utilizan para shortcodes no solo en WP sino en una gran cantidad de CMS basados en PHP. Los shortcodes deben tener el envoltorio de contenido apropiado.
Lo que significa que la solución es agregar las etiquetas <p>
en el código de tu shortcode para que tu contenido esté envuelto de la manera que deseas.

Como complemento a Foxsk8 y E. Serrano. Si la publicación contiene <p>
alrededor de los shortcodes, WordPress aún los eliminará. Esto ocurre en el filtro shortcode_unautop que se añade en '\wp-includes\default-filters.php'. Este filtro asegura que los shortcodes no estén envueltos en <p>...</p>
.
Por lo tanto, necesitamos eliminarlos:
remove_filter( 'the_content', 'shortcode_unautop' );

Puedes agregar el siguiente código en tu archivo function.php
function content_formatter($content){
$new_content = '';
$pattern_full = '{(\[raw\].*?\[/raw\])}is';
$pattern_contents = '{\[raw\](.*?)\[/raw\]}is';
$pieces = preg_split($pattern_full, $content, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($pieces as $piece) {
if (preg_match($pattern_contents, $piece, $matches)) {
$new_content .= $matches[1];
} else {
$new_content .= wptexturize(wpautop($piece));
}
}
$array = array(
'<p>[' => '[',
']</p>' => ']',
']<br />' => ']'
);
$new_content = strtr($new_content, $array);
return $new_content;
}
Ahora llama a esta función donde sea necesario, por ejemplo:
<?php echo content_formatter( get_field('nombre_del_campo') ); ?>
