El código corto de un widget está envuelto en un elemento p no deseado

2

Estoy usando Widget TinyMCE de Black Studio como un widget de editor de texto enriquecido. En una barra lateral inserté el widget TinyMCE con un shortcode [testimonial] y algo de contenido después.

Por ejemplo:

[testimonial]

Read more client testimonials (as a link)

Cuando cambio a la pestaña HTML de ese widget, obtengo lo siguiente:

<p>[testimonial]</p>
<p><a title="Testimonials" href="http://mm.dev/testimonials/">Read more client testimonials</a></p>

El código corto simplemente muestra una publicación aleatoria Testimonial CPT:

add_shortcode("testimonial", "dlma_testimonial_shortcode");
function dlma_testimonial_shortcode($atts, $content = null){
    $args = array(
        'post_type' => 'testimonial',
        'post_status' => 'publish',
        'posts_per_page' => '1',
        'orderby' => 'rand'
    );
    $testimonial = new WP_Query($args);

    if($testimonial){
        return apply_filters('the_content', $testimonial->posts[0]->post_content);
    }
    return "";
}

Sin embargo, cuando veo una página, se insertan elementos perdidos <p> :
Editado gracias a Tom J Nowell

<div class="textwidget">
  <p>
    <blockquote>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vestibulum velit convallis sem pulvinar vitae lobortis metus varius.” <em>Person name, Person job</em></p>
    </blockquote>
  </p>
  <p>
    <a href="http://mysite.com/testimonials/" title="Testimonials">Read more client testimonials</a>
  </p>
</div>

Sin embargo, el código corto [testimonial] se expandió correctamente, ya que originalmente se envolvió en el elemento <p> en el widget que aún parece estar envuelto en él. He intentado eliminar el elemento <p> de la vista de la pestaña HTML del widget, sin embargo, cada vez que se hace clic en el botón Guardar, el elemento <p> se inserta nuevamente.

He intentado eliminar el elemento <p> no deseado que envuelve el shortcode con el filtro the_content de la siguiente manera:

remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop' , 12);

Eso no funcionó. Supongo que tengo el flujo incorrecto de procesar el contenido de un widget con un código corto en él. Estoy muy confundido ahora. ¿Cómo puedo eliminar los elementos no deseados <p> que contienen códigos cortos?

¡Apreciaría enormemente cualquier ayuda!

Muchas gracias.

    
pregunta dashaluna 15.04.2012 - 15:13

5 respuestas

10

En realidad, hay varias formas de manejar el editor de Wordpress ajustando los códigos cortos en las etiquetas <p> .

Este código muestra probablemente la forma más sencilla de hacerlo ... solo una función simple y breve que necesita colocar en su archivo functions.php . Una vez que lo haga, ¡no habrá más etiquetas alrededor de sus códigos cortos que estén en su propia línea!

function wpex_clean_shortcodes($content){   
$array = array (
    '<p>[' => '[', 
    ']</p>' => ']', 
    ']<br />' => ']'
);
$content = strtr($content, $array);
return $content;
}
add_filter('the_content', 'wpex_clean_shortcodes');

Fuente: enlace

Espero que ayude a alguien!

    
respondido por el Trevor 23.10.2012 - 23:23
1

Un blockquote es un elemento de bloque, y no debe colocarse dentro de una etiqueta <p> , lo que está viendo es el DOM de su navegador intentando compensar el marcado html no válido. Si observa el propio código fuente sin procesar generado, no encontrará esas etiquetas de párrafos perdidos

Elimine sus etiquetas de ajuste <p> y asegúrese de que todo el contenido que necesita envolverse en una etiqueta de <p> se realice dentro del shortcode.

enlace

La regla general es que un elemento <p> es un elemento de bloque, pero nunca debe contener elementos de bloque, solo elementos en línea.

por ejemplo:

  • Un elemento p puede contener:
    • span
    • b
    • strong
    • etc
  • Un elemento p no puede contener:
    • div
    • blockquote
    • ul
    • ol
    • h1
    • etc
respondido por el Tom J Nowell 15.04.2012 - 15:41
0

Sugeriría esto, que mueve los códigos cortos específicos de "bloque a nivel" fuera de los elementos "p" sin afectar a los demás en otros lugares que pueden estar en línea:

function my_fix_shortcodes($content){  
  if (strpos($content, '<p>') !== false) {
    /* Move 'block level' shortcode tags outside <p> elements by surrounding with </p>...<p>
       If they have content, this will be put inside a new <p>
       - you could use a final regex to remove this if needed... */
    $block_level_shortcodes = array(
      'testimonial',
      'another_shortcode'
    );
    $regex_shortcode = '(' . implode('|', $block_level_shortcodes) . ')';
    // Match opening/standalone or closing shortcode tags
    $regex = '/(\[' . $regex_shortcode . '[^\]]*\]|\[\/' . $regex_shortcode . '\])/';
    $regex_count = 0;
    $content = preg_replace($regex, '</p>$1<p>', $content, -1, $regex_count);
    if ($regex_count > 0) {
      /* Remove <br/>s at start or end of <p> which might now be present,
         then any empty <p>s which quite probably are */
      $content = preg_replace(
        array('/<p>\s*<br *\/>/s', '/<br *\/>\s*<\/p>/s', '/<p>\s*<\/p>/s'),
        array('<p>', '</p>', ''),
        $content
      );                    
    }
  }
  return $content;
}
add_filter('the_content', 'my_fix_shortcodes');

También tenga en cuenta que parece haber un intento fallido para resolver este tipo de problema dentro de WordPress [4.00], por lo que a sus manejadores de código abreviado se les puede pasar $ contenido que está precedido por < / p > y postfixed con < p & gt ;, que tendrá que detectar y eliminar.

Actualización: parece que hay algo roto dentro de WordPress (relacionado con la adición esporádica de < p > y < / p & gt ;, fuera del wpautop inicial sencillo, cuando están involucrados los códigos cortos, como se mencionó anteriormente [pero aquellos los elementos esporádicos no se pasan a su controlador]) lo que significa que esta solución puede no funcionar siempre, aunque debería: /

    
respondido por el Jake 04.12.2014 - 00:49
0

Este es un problema conocido desde hace años. Echa un vistazo a Wordpress Ticket .

Como tal vez se mencionó anteriormente, hay un complemento para solucionar este problema. Se llama " Corrección de párrafo vacío de código abreviado ". No es la mejor solución, pero no es tan mala.

No soy un fan de poner mucha información sobre la instalación de mi wp, así que envolví el shortcode en div sin una clase y solucioné el problema.

<div> [woocommerce_cart] </div>

Espero que el problema se resuelva en los próximos años;) para poder eliminar mis divs, en mi opinión de una manera más segura, porque a veces las funciones adicionales en la función.php pueden causar algunos problemas en el futuro.

    
respondido por el evavienna 10.12.2017 - 20:32
-1

Tal vez esto pueda ayudarte (u otros también):

// remove <br> tags from text widget content, from 4.8 version WP adds these tags
remove_filter('widget_text_content', 'wpautop');
    
respondido por el Harkály Gergő 22.06.2017 - 22:39

Lea otras preguntas en las etiquetas