Passer la valeur booléenne dans le shortcode

16

Dans les shortcodes WordPress, comment puis-je transmettre des attributs booléens?
Les deux [shortcode boolean_attribute="true"]ou [shortcode boolean_attribute=true]donnent des valeurs de chaîne.

ÉDITER

Il n'y aurait aucun problème pour les utilisateurs qui savent ce qu'ils font si j'utilise l'astuce qui a été commentée par @brasofilo. Mais certains utilisateurs se perdront s'ils donnent une falsevaleur d' attribut et reçoiventtrue . Y a-t-il donc une autre solution?

Sodbileg Gansukh
la source
2
Ne transmettez simplement pas l'attribut et vous aurez false, sinon true.
brasofilo
Merci @brasofilo. Mais existe-t-il une autre solution? Je pense que certains utilisateurs se perdront s'ils donnent une valeur "fausse" à un attribut, mais ils obtiendront une valeur "vraie".
Sodbileg Gansukh

Réponses:

14

Est facile à utiliser 0et1 valoriser, puis à transtyper dans la fonction:

[shortcode boolean_attribute='1'] ou [shortcode boolean_attribute='0']

mais si vous voulez, vous pouvez également vérifier strictement 'false' et l'affecter à booléen, de cette façon, vous pouvez également utiliser:

[shortcode boolean_attribute='false'] ou [shortcode boolean_attribute='true']

Alors:

add_shortcode( 'shortcode', 'shortcode_cb' );

function shortcode_cb( $atts ) {
  extract( shortcode_atts( array(
    'boolean_attribute' => 1
  ), $atts ) );
  if ( $boolean_attribute === 'false' ) $boolean_attribute = false; // just to be sure...
  $boolean_attribute = (bool) $boolean_attribute;
}
gmazzap
la source
C'est une excellente réponse. Mais je pensais que ce serait génial si les utilisateurs avaient un choix vrai ou faux. Désolé, je ne peux pas accepter votre réponse comme acceptée.
Sodbileg Gansukh
@SodbilegGansukh ce code fonctionne aussi avec 'true'et'false'
gmazzap
@toscho Je viens de copier et coller à partir du codex ;)
gmazzap
3
@SodbilegGansukh Tous les arguments sont transmis sous forme de chaînes, car ils ne peuvent être entrés (tapés) que sous forme de chaînes. Il n'y a pas d'autre moyen que cette réponse. Essayez de taper une valeur booléenne sans chaîne…
fuxia
28

En tant qu'extension de la réponse @GM (qui est le seul moyen possible de le faire), voici une version légèrement raccourcie / embellie et une version étendue (que je préfère personnellement):

Variante raccourcie / embellie

Il suffit de booleanvérifier la valeur contenue. Si c'est le cas true, le résultat sera (bool) true, sinon ce sera faux. Cela produit un seul cas true, tout le reste falserésulte.

add_shortcode( 'shortcodeWPSE', 'wpse119294ShortcodeCbA' );
function wpse119294ShortcodeCbA( $atts ) {
    $args = shortcode_atts( array(
        'boolAttr' => 'true'
    ), $atts, 'shortcodeWPSE' );

    $args['boolAttr'] = 'true' === $args['boolAttr'];
}

Variante étendue / sécurisée pour l'utilisateur

La raison pour laquelle je préfère cette version est qu'elle permet à l'utilisateur de taper on/yes/1un alias pour true. Cela réduit le risque d'erreurs utilisateur lorsque l'utilisateur ne se souvient pas de la valeur réelle true.

add_shortcode( 'shortcodeWPSE', 'wpse119294ShortcodeCbA' );
function wpse119294ShortcodeCbA( $atts ) {
    $args = shortcode_atts( array(
        'boolAttr' => 'true'
    ), $atts, 'shortcodeWPSE' );

    $args['boolAttr'] = filter_var( $args['boolAttr'], FILTER_VALIDATE_BOOLEAN );
}

Notes complémentaires:

1) Passez toujours le 3e argument pour shortcode_atts(). Sinon, le filtre des attributs de shortcode est impossible à cibler.

// The var in the filter name refers to the 3rd argument.
apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

2) Ne jamais utiliser extract(). Même le cœur veut réduire ces appels. C'est également pire pour les globalvariables, car les IDE n'ont aucune chance de résoudre le contenu extrait et lancent des messages d'échec.

kaiser
la source
1
Wow, c'est une excellente réponse. Merci beaucoup. J'aimerais avoir assez de réputation pour voter pour votre réponse. Et merci beaucoup pour vos conseils.
Sodbileg Gansukh
1
J'ai voté en votre nom, Sodbileg. :)
Dero
wp_validate_boolean()dans WordPress 4.0.0 ou supérieur est utile pour valider les valeurs booléennes. Référence des fonctions developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad
@AamerShahzad Ceci est une alternative (à mon humble avis inutilement ajoutée) à filter_var( $var, FILTER_VALIDATE_BOOLEAN ).ce que même le docblock de cette fonction déclare.
kaiser
@kaiser c'est juste pour information.
Aamer Shahzad,
0

Voici une version simple plus courte, s'appuyant sur la réponse de gmazzap:

Utilisez '1' ou '0', puis lancez en utilisant un double coup "!!" qui change une valeur "truey / falsey" en son équivalent booléen

notez que cela ne fonctionnera PAS avec les chaînes "true" et "false", seulement "1" et "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
nthéoriste
la source