O shortcode de um widget é envolto em p elemento indesejado

2

Estou usando Widget Black Studio TinyMCE como um widget de editor de rich text. Em uma barra lateral, inseri o widget TinyMCE com um [testimonial] shortcode e algum conteúdo depois dele.

Por exemplo:

[testimonial]

Read more client testimonials (as a link)

Quando mudo para a guia HTML desse widget, recebo o seguinte:

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

O shorcode simplesmente exibe uma postagem aleatória de 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 "";
}

No entanto, quando vejo uma página, elementos <p> de stray são inseridos:
Editado graças 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>

O [testimonial] shortcode foi expandido corretamente, no entanto, como foi originalmente agrupado no elemento <p> no widget, ele ainda parece estar envolto nele. Eu tentei excluir o elemento <p> da visualização da guia HTML do widget, no entanto, sempre que o botão Salvar é clicado, o elemento <p> é inserido novamente.

Eu tentei remover o elemento <p> indesejado que encapsula o shortcode com o filtro the_content da seguinte forma:

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

Isso não funcionou. Eu estou supondo que eu tenho o fluxo errado de processar o conteúdo de um widget com um shortcode nele. Estou muito confuso agora. Como posso remover elementos <p> indesejados que encapsulam códigos de acesso?

Eu apreciaria imensamente qualquer ajuda!

Muito obrigado.

    
por dashaluna 15.04.2012 / 15:13

5 respostas

10

Na verdade, existem várias maneiras de lidar com os códigos de acesso do editor do Wordpress em <p> tags.

Este código mostra provavelmente a maneira mais simples de fazê-lo ... apenas uma função simples e curta que você precisa colocar em seu arquivo functions.php . Depois que você fizer isso, não haverá mais tags em seus códigos de acesso que estão em sua própria linha!

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

Fonte: enlace

Espero que ajude alguém!

    
por Trevor 23.10.2012 / 23:23
1

Um blockquote é um elemento block e não deve ser colocado dentro de uma tag <p> , o que você está vendo é o DOM do seu navegador tentando compensar a marcação html inválida. Se você olhar para o código-fonte em si gerado, você não encontrará essas tags de parágrafo dispersas

Remova as tags de agrupamento <p> e certifique-se de que qualquer conteúdo que precise ser agrupado em uma tag <p> seja feito dentro do shortcode.

enlace

A regra geral é que um elemento <p> é um elemento de bloco, mas nunca deve conter elementos de bloco, apenas elementos in-line.

por exemplo:

  • Um elemento p pode conter:
    • span
    • b
    • strong
    • etc
  • Um elemento p não pode conter:
    • div
    • blockquote
    • ul
    • ol
    • h1
    • etc
por Tom J Nowell 15.04.2012 / 15:41
0

Eu sugeriria isso, que move códigos de acesso específicos de 'nível de bloco' para fora dos elementos 'p' sem afetar aqueles em outros lugares que podem estar em linha:

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

Observe também que parece haver uma tentativa fracassada de resolver este tipo de problema dentro do próprio WordPress [4.00], para que seus manipuladores de código de acesso possam receber o conteúdo $ que é prefixado com < / p > e postfixed com < p & gt ;, que você terá que detectar e remover.

Atualização: parece haver algo quebrado dentro do próprio WordPress (relacionado à adição esporádica de < p > e < / p & gt ;, fora do simples wpautop inicial, quando códigos de acesso estão envolvidos, conforme mencionado acima [mas elementos esporádicos não são passados para o seu handler]) o que significa que esta solução pode nem sempre funcionar, embora deva: /

    
por Jake 04.12.2014 / 00:49
0

Este é um problema conhecido desde anos. Por favor, dê uma olhada no Bilhete do Wordpress .

Como outros, talvez mencionados anteriormente, há o Plugin para corrigir esse problema. Ele é chamado de " Correção de parágrafo de shortcode vazio ". Não é a melhor solução, mas não é tão ruim assim.

Eu não sou um fã de colocar um monte de inchaço na minha instalação wp - então eu embrulhei o shortcode em div sem uma aula e resolvi o problema.

<div> [woocommerce_cart] </div>

Espero que a questão seja abordada nos próximos anos;) para que eu possa remover meus divs - na minha opinião, uma maneira mais segura, porque às vezes funções extras no funcitons.php podem causar alguns problemas no futuro.

    
por evavienna 10.12.2017 / 20:32
-1

Talvez isso possa ajudar você (ou outras pessoas também):

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