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?


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;
}


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.


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)
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.