web-dev-qa-db-fra.com

Le shortcode d'un widget est encapsulé dans un élément <p> indésirable

J'utilise Widget Black Studio TinyMCE en tant que widget éditeur de texte enrichi. Dans une barre latérale, j'ai inséré le widget TinyMCE avec un shortcode [testimonial] et du contenu après celui-ci.

Par exemple:

[testimonial]

Read more client testimonials (as a link)

Lorsque je passe à l'onglet HTML de ce widget, j'ai les éléments suivants:

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

Le code court affiche simplement un message au hasard 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 "";
}

Cependant, lorsque je visualise une page, des éléments <p> errants sont insérés:
Edité grâce à 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>

Le shortcode [testimonial] a été développé correctement, cependant, comme il était initialement encapsulé dans l'élément <p> du widget, il semble toujours y être encapsulé. J'ai essayé de supprimer l'élément <p> de la vue d'onglet HTML du widget. Cependant, chaque fois que vous cliquez sur le bouton Enregistrer, l'élément <p> est de nouveau inséré.

J'ai essayé de supprimer l'élément <p> indésirable qui enveloppe le shortcode avec le filtre the_content comme suit:

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

Ça n'a pas marché. J'imagine que j'ai tort de traiter le contenu d'un widget avec un shortcode. Je suis très confus maintenant. Comment puis-je supprimer les éléments <p> indésirables qui enveloppent les codes courts?

J'apprécierais énormément toute aide!

Merci beaucoup.

2
dashaluna

Il existe en fait plusieurs manières de gérer les codes courts de wrapping de l'éditeur Wordpress dans les balises <p>.

Ce code montre probablement le moyen le plus simple de le faire ... juste une fonction simple et courte que vous devez insérer dans votre functions.php fichier. Une fois que vous avez fait, plus de balises autour de vos codes courts qui sont sur leur propre ligne!

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

Source: http://www.wpexplorer.com/snippet/clean-wordpress-shortcodes

J'espère que ça aide quelqu'un!

10
Trevor

Un blockquote est un élément de bloc et ne doit pas être placé dans une balise <p>. Ce que vous voyez, c'est le DOM de votre navigateur qui tente de compenser le balisage HTML non valide. Si vous regardez le code source brut lui-même généré, vous ne trouverez pas ces balises de paragraphe parasites

Supprimez vos balises d'habillage <p> et assurez-vous que tout le contenu qui nécessite une habillage dans une balise <p> est placé dans le shortcode.

https://stackoverflow.com/questions/3428828/p-tag-is-a-block-level-element-in-xhtml

La règle générale est qu'un élément <p> est un élément de bloc, mais il ne doit jamais contenir d'éléments de bloc, mais uniquement des éléments en ligne.

par exemple.:

  • Un élément p peut contenir:
    • span
    • b
    • strong
    • etc
  • Un élément p ne peut pas contenir:
    • div
    • blockquote
    • ul
    • ol
    • h1
    • etc
1
Tom J Nowell

Je suggérerais ceci, qui déplace des codes abrégés spécifiques au niveau du bloc en dehors des éléments 'p' sans affecter ceux situés ailleurs qui peuvent être supposés être en ligne:

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

Notez également qu'il semble y avoir une tentative infructueuse de résolution de ce type de problème dans WordPress [4.00] lui-même. Par conséquent, vos gestionnaires de codes abrégés peuvent être passés de $ contenu précédé de </ p> et postfixé par <p>, ce que vous ferez. avoir à détecter et à supprimer.

Mise à jour: il semble y avoir quelque chose de cassé dans WordPress lui-même (concernant l'addition sporadique de <p> et </ p>, en dehors du simple wpautop initial, lorsque des codes courts sont impliqués, comme mentionné ci-dessus [mais ces éléments sporadiques ne sont pas supprimés à votre gestionnaire]), ce qui signifie que cette solution peut ne pas toujours fonctionner, même si elle devrait: /

0
Jake

C'est un problème connu depuis des années. S'il vous plaît jeter un oeil à Wordpress Ticket .

Comme d'autres l'ont peut-être déjà mentionné, il existe un plugin pour résoudre ce problème. Il s’appelle " Shortcode Vide Paragraphe Fix ". Ce n'est pas la meilleure solution mais pas si mal.

Je ne suis pas fan de mettre beaucoup d'obstacles dans mon installation de wp - j'ai donc enveloppé le shortcode dans div sans classe et résolu le problème.

<div> [woocommerce_cart] </div>

J'espère que le problème sera résolu dans les prochaines années;) afin que je puisse retirer mes divs - à mon avis, une façon plus économique, car parfois des fonctions supplémentaires dans funcitons.php peuvent causer des problèmes par la suite.

0
evavienna