web-dev-qa-db-fra.com

Autoriser les codes courts dans les attributs

Je souhaite créer une infobox de type Wikipedia pour certains articles sur un site WP. Je suppose que la chose la plus logique à faire est d'utiliser un shortcode personnalisé - un code renvoyant une balise semblable à une table avec un ordre fixe de champs, chacun avec plus de balises personnalisées, ainsi que des éléments conditionnels pour afficher ou non les champs s'ils ne le sont pas ensemble, imitant quelque chose comme ceci:

 <!--MediaWiki markup-->
 {{infobox-cd
 |name=Abbey Road"
 |cover=[[File:laserdisc.jpg]]
 |artist=[[The Bombay Beach Boys]]
 |country={{flag id=mx}} Argentina<br />{{flag id=dk}} Vanuatu (post-production)
 |rating={{stars no=3}}
 |prev=[[The Wall]]
 |next=[[Born in the U.S.A.]]
 }}

Pourtant, j'ai été empêché de les utiliser dans une approche plus littérale pendant des années en raison de la rupture de codes courts tout en ayant des crochets à l'intérieur d'attributs. Cela devrait théoriquement fonctionner, mais pas parce que la regex shortcode s'arrête à la première occurrence d'un crochet de fermeture (]) dans un shortcode, donc dans ceci:

[foo bar="[baz /]"]content[/foo]

il "sorties":

[foo bar="[baz /]

Je ne sais pas comment faire autrement pour que ce balisage fonctionne ou que quelque chose d'autre poursuive le même objectif.

4
peroyomas

Désolé, les crochets ne sont toujours pas autorisés entre codes abrégés, comme vous pouvez le constater dans l'API Shortcode . Cependant, il est possible d'utiliser des codes courts englobants qui permettent d'utiliser des crochets. Laissez-moi démontrer ceci:

Code court: [foo bar="No brackets here!"]...use [brackets] here[/foo]

Vous pouvez ajouter ce genre de shortcode dans votre functions.php comme ceci:

add_shortcode( 'foo', 'foo_shortcode' );
function foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . $content . '</p>';
}

Il est également possible d'exécuter le contenu entre crochets comme un autre shortcode:

Code court: [foo bar="No shortcodes here!"]...use [shortcodes] here[/foo]

add_shortcode( 'foo', 'execute_foo_shortcode' );
function execute_foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );
  return '<p>' . $bar . ' ' . do_shortcode($content) . '</p>';
}

Mais restons simples. Pourquoi ne pas ajouter les crochets dans le shortcode lui-même?

Code court: [foo bar="shortcode"]

Et dans votre functions.php

add_shortcode( 'foo', 'build_foo_shortcode' );
function build_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    return '<p>' . do_shortcode( '[' . $bar . ']' ) . '</p>';
  endif;
}

Si vous souhaitez conserver votre type de shortcode, vous pouvez contourner les crochets et ajouter quelque chose de similaire, pour le reconnaître et le remplacer via regex:

Code court: [foo bar="Use your ___shortcode___ here"]

Dans votre functions.php, vous pouvez remplacer ___shortcode___ par [shortcode] et l'exécuter à nouveau via do_shortcode().

add_shortcode( 'foo', 'regex_foo_shortcode' );
function regex_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      'bar' => '',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    $foo_bar = preg_replace_callback("/(.*)_{3}(.*)_{3}(.*)/", function($m) {
        return $m[1] . do_shortcode('[' . $m[2] . ']') . $m[3];
    }, $bar);
    return '<p>' . $foo_bar . '</p>';
  endif;
}

Ok, c'est un peu compliqué maintenant, n'est-ce pas? Une autre approche (si vous ne voulez pas continuer à le faire via des codes courts) serait des champs personnalisés. Les champs personnalisés sont disponibles par défaut et peuvent être basculés à l’aide du Options d’écran .

Vous pouvez utiliser the_meta () ou vous le procurer via get_post_meta () function pour les afficher facilement dans votre thème. De plus, il est plus facile (comparé aux codes abrégés) de gérer l'entrée et la sortie et aucun éditeur ne doit se souvenir de tous ces codes abrégés disponibles.

Vous pouvez également générer facilement des champs personnalisés avancés via l'interface d'un plugin ou et les personnaliser vous-même . Quoi qu'il en soit, vous aurez des champs de saisie Nice ci-dessous ou à côté de votre éditeur de texte sans limitations (même téléchargement de fichier, datepicker ...). Cela ressemblera à ceci:

enter image description here

3
Sven