web-dev-qa-db-fra.com

Détection de shortcode imbriqué

Si vous connaissez ce code

<?php
  $pattern = get_shortcode_regex();
  preg_match('/'.$pattern.'/s', $posts[0]->post_content, $matches);
  if (is_array($matches) && $matches[2] == 'YOURSHORTCODE') {
    //shortcode is being used
  }
?>

depuis ce site Web , mais cela ne fonctionne pas pour les codes abrégés imbriqués.

Est-ce que quelqu'un sait comment le faire fonctionner pour les codes courts imbriqués?

4
meosoft

De: http://codex.wordpress.org/Shortcode_API#Limitations

L'analyseur de shortcode traite correctement les macros de shortcode imbriquées, à condition que leurs fonctions de gestionnaire le supportent en appelant récursivement do_shortcode ().

Cela ne vous laissera pas imbriquer le même shortcode dans un autre:

Cependant, l'analyseur échouera si une macro shortcode est utilisée pour inclure une autre macro du même nom.

En supposant que vous ne le fassiez pas, voici un exemple artificiel de ce que vous devez faire dans votre rappel de shortcode:

function paragraph_wrap($atts, $content) {

     // if there are nested shortcodes - handle them
     $content = do_shortcode($content);

     // wrap content in a paragraph tag
     $paragraphed = '<p>' . $content . '</p>';

     return $paragraphed;
}
add_shortcode('wrap_p', 'paragraph_wrap');

J'espère que cela t'aides.

8
Jeff Stieler

Juste une supposition. get_shortcode_regex () ne fonctionne que pour les shortcodes enregistrés. Donc, juste au cas où vous n'avez pas enregistré "votre" shortcode, cela ne fonctionne même pas pour les shortcodes simples. Donc, ceci pourrait être - au cas où vous ne l'auriez pas enregistré - la cause de votre problème à la fin.

La gestion des codes courts est spécifiée dans la API Shortcode , des exemples pour enregistrer des codes courts sont donnés sur la page du codex aussi.

function baztag_func($atts, $content=) {
    return "content = $content";
}
add_shortcode('baztag', 'baztag_func');

Pour les codes imbriqués, Jeff a déjà expliqué comment cela fonctionne. Il s’agit donc d’un exemple plus petit qui montre comment ajouter un shortcode. Après avoir utilisé add_shortcode(), get_shortcode_regex() retournera une expression régulière qui recouvre en réalité le nom de code abrégé enregistré. Sinon, ça ne correspondra pas.

3
hakre

La correspondance de shortcode est implémentée de manière déficiente ( shortcodes.php , ll174). Fondamentalement, les expressions régulières sont utilisées pour décrire ce qui devrait être un langage non régulier (par exemple, des codes courts avec imbrication arbitraire).

En effet,

[a]
  [a]
  [/a]
[/a]

sera analysé de sorte que l'étiquette d'ouverture de la ligne 1 corresponde à l'étiquette de fermeture de la ligne 3; évidemment, cela ne conduit pas au comportement souhaité.

1
Raphael