Cómo detener el editor html de etiquetas addig p a códigos cortos, imágenes, etc.

4

Sé que esto está cubierto como temas individuales, pero lo que estoy buscando es una función única que evita que las etiquetas <p> se envuelvan a través del editor de Wordpress a códigos cortos e imágenes y también elimina <p> tages vacíos, por ejemplo. ejemplo:

  • elimina las etiquetas <p> que se envuelven alrededor de los códigos cortos, es decir, <p>[shortcode]</p>
  • eliminar etiquetas <p></p> vacías
  • elimine las etiquetas <p> con espacios en blanco, es decir, <p> </p> o <p> </p> etc.
  • elimina las etiquetas <p> que se envuelven alrededor de las etiquetas <img> , es decir, <p><img blabla /></p>

He estado usando algunas funciones diferentes que toman $content y eliminan las etiquetas <p> a través de preg_replace() pero no puedo averiguar cómo lograr que los cuatro requisitos funcionen en una sola función.

Parece una sobrecarga excesiva para ejecutar $content a través de cuatro funciones diferentes antes de que se muestre $content .

¿También puede recomendar una buena fuente para aprender a usar todos los acuerdos para preg_replace ()?

    
pregunta Jason 30.09.2012 - 21:42

3 respuestas

3

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

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.

    
respondido por el Johannes Pille 30.09.2012 - 22:28
0

Creo que eliminar todas las etiquetas p es una mala práctica. Para las etiquetas p vacías, hay una regla css que puede usar que funciona bien. p: vacío {display: none} debería funcionar.

    
respondido por el Jamie 30.09.2012 - 21:53
0

puede utilizar el filtro shortcode_unautop: enlace

    
respondido por el paramir 17.12.2016 - 17:50

Lea otras preguntas en las etiquetas