1. Filtrando el contenido
Aquí hay un filtro de contenido de una sola función para cumplir con los cuatro requisitos anteriores:
add_filter( 'the_content', 'strip_some_paragraphs', 20 );
function strip_some_paragraphs( $content ) {
$content = preg_replace(
'/<p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>/',
'$3',
$content
);
return $content;
}
2. Recursos para expresiones regulares
-
regular-expressions.info - Manual, Basic & Tutoriales Avanzados
-
regexpal.com : es un comprobador de expresiones regulares muy útil
- en cuanto a las funciones de expresiones regulares de php, el manual sigue siendo el mejor recurso
3. El RegEx en 1. explicó
La expresión regular en cuestión es <p>(([\s]*)|[\s]*(<img[^>]*>|\[[^\]]*\])[\s]*)<\/p>
- '
denota el principio y el final de una cadena, como de costumbre, /
es el delimitador de patrón.
Ha mencionado 4 casos en los que desea eliminar las etiquetas <p>
. Entonces, primero que nada, nuestro patrón debe comenzar con una etiqueta <p>
y terminar con su compañero de cierre </p>
. Eso va para los cuatro casos. En el interior, queremos permitir que cuatro opciones diferentes sean coincidencias válidas. Agrupamos esas opciones entre paréntesis y utilizamos el carácter de canal |
para separarlos. |
coincide con cualquiera de los lados y se puede unir entre sí. Puedes considerarlo como "O".
Ahora para las opciones:
Comencemos con los espacios en blanco. \s
denota la clase de caracteres de espacios en blanco (espacios, tabulaciones y saltos de línea). Usamos el cuantificador de estrellas [\s]*
para coincidir con cero o más de la clase de caracteres anterior.
Así que ahora hacemos coincidir todas las etiquetas de párrafo vacío. Y por casualidad disminuyeron los casos para que coincidan con 3; cero o más se ocupa de <p></p>
y <p> </p>
. Niza.
En cuanto a los otros dos, envolveremos ambos en [\s]*
adicional, de modo que no solo <p>[shortcode]</p>
, sino también, por ejemplo,
<p>
[shortcode] </p>
coincide.
Lo que nos queda por hacer ahora es crear patrones que coincidan con los códigos cortos y las etiquetas img
. Aquí hacemos uso de la negación de clase de carácter. La caret ^
al comienzo de una clase de caracteres lo niega. Por lo tanto, [^>]
coincide con cualquier carácter que no sea >
.
Comenzamos el patrón para las imágenes con una etiqueta de apertura <img
y para el shortcode con un corchete \[
. Este último debe escaparse con una barra, ya que es un carácter especial de expresiones regulares.
Ahora usamos la clase de caracteres negados mencionada anteriormente con el cuantificador de estrellas. [^>]*
para el img y [^\]]*
para el shortcode, coincidiendo con cualquier otra cosa que no sea el carácter de cierre respectivo. Luego hacemos coincidir ese personaje final una vez y estamos listos.
Entonces obtenemos <img[^>]*
para las imágenes y \[[^\]]*\]
para el código corto.
Los envolvemos en posibles espacios en blanco múltiples: [\s]*<img[^>]*>[\s]*
y [\s]*\[[^\]]*\][\s]*
Agrupando esos dos y agregando solo espacios en blanco como la primera opción, obtenemos el interior de los corchetes y finalmente los envolvemos en las etiquetas de los párrafos.
Para el reemplazo usamos la referencia inversa $3
que se encarga de que la imagen real y las etiquetas de código abreviado no desaparezcan. Para que los espacios en blanco no permanezcan, hemos creado dos subgrupos de las posibles opciones. Solo img y shortcode están orientados por la referencia posterior.
4. Sidenote
Esta pregunta es el límite del alcance de WPSE, ya que es principalmente en PHP & Expresiones regulares. Podría haber sido mejor preguntado en StackOverflow.
De todos modos, ahora está respondida.