Passar valor booleano em shortcode

16

Nos códigos de acesso do WordPress, como posso transmitir atributos booleanos?
Ambos [shortcode boolean_attribute="true"]ou [shortcode boolean_attribute=true]estão fornecendo valores de sequência.

EDITAR

Não haveria problema para os usuários que sabem o que estão fazendo se eu usar o truque comentado por @brasofilo. Mas alguns usuários se perderão se atribuírem um falsevalor de atributo e receberem truevalor. Então, existe alguma outra solução?

Sodbileg Gansukh
fonte
2
Simplesmente não passe o atributo e você terá false, caso contrário true.
Brasofilo 18/10/2013
Obrigado @brasofilo. Mas existe alguma outra solução? Eu acho que alguns usuários se perderão se atribuírem um valor "false" ao atributo, mas obterão o valor "true".
Sodbileg Gansukh

Respostas:

14

É fácil de usar 0e 1valores e, em seguida, faz a conversão dentro da função:

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

mas se você quiser, também pode verificar 'false'e atribuir rigorosamente a booleano; dessa maneira, você também pode usar:

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

Então:

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
fonte
Essa é uma ótima resposta. Mas pensei que seria ótimo se os usuários tivessem escolha verdadeira ou falsa. Desculpe, não posso aceitar sua resposta como aceita.
Sodbileg Gansukh
@SodbilegGansukh esse código também funciona com 'true'e'false'
gmazzap
@toscho Acabei de copiar e colar do codex ;)
gmazzap
3
@SodbilegGansukh Todos os argumentos são passados ​​como cadeias, porque podem ser inseridos (digitados) apenas como cadeias. Não há outra maneira senão esta resposta. Tente digitar um valor booleano sem string…
fuxia
28

Como uma extensão da resposta do @GM (que é a única maneira possível de fazer isso), aqui está uma versão um pouco abreviada / embelezada e uma versão estendida (que eu pessoalmente prefiro):

Variante encurtada / embelezada

Basta booleanverificar o valor contido. Se for true, o resultado será (bool) true, caso contrário, será falso. Isso produz um caso true, tudo o mais falseresulta.

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

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

Variante estendida / segura para o usuário

A razão pela qual prefiro esta versão é que ela permite ao usuário digitar on/yes/1como um alias para true. Isso reduz a chance de erros do usuário quando o usuário não se lembra qual era o valor real 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 );
}

Notas Adicionais:

1) Sempre passe o terceiro argumento para shortcode_atts(). Caso contrário, o filtro de atributos de código curto é impossível de segmentar.

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

2) Nunca use extract(). Até o núcleo quer reduzir essas ligações. É igualmente pior para as globalvariáveis, pois os IDEs não têm chance de resolver o conteúdo extraído e lançam mensagens de falha.

kaiser
fonte
1
Uau, essa é uma ótima resposta. Muito obrigado. Eu gostaria de ter reputação suficiente para votar em sua resposta. E muito obrigado pelo seu conselho.
Sodbileg Gansukh
1
Eu votei em seu nome, Sodbileg. :)
Dero 18/10
wp_validate_boolean()A função no WordPress 4.0.0 ou superior é útil na validação de valores booleanos. Referência de função developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad 8/18
@AamerShahzad Esta é uma alternativa (imho desnecessariamente adicionada) ao filter_var( $var, FILTER_VALIDATE_BOOLEAN ).que afirma o próprio bloco de documentos dessa função.
Kaiser #
@ Kaiser isto é apenas para informação.
Aamer Shahzad
0

Aqui está uma versão simples mais curta, baseada na resposta do gmazzap:

Use '1' ou '0' e, em seguida, faça o lançamento usando um toque duplo "!!" que altera um valor "truthy / falsey" para seu equivalente booleano

note que isso NÃO funcionará com cadeias "verdadeiras" e "falsas", apenas "1" e "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
teórico
fonte