Przekaż wartość logiczną za pomocą krótkiego kodu

16

W jaki sposób mogę przekazywać atrybuty logiczne w skrótach WordPress?
Obie [shortcode boolean_attribute="true"]lub [shortcode boolean_attribute=true]podają wartości ciągu.

EDYTOWAĆ

Użytkownicy korzystający ze sztuczki skomentowanej przez @brasofilo nie mieliby problemu. Ale niektórzy użytkownicy zgubią się, jeśli podadzą falsewartość atrybutu i otrzymają truewartość. Czy jest jakieś inne rozwiązanie?

Sodbileg Gansukh
źródło
2
Po prostu nie przekazuj atrybutu, a będziesz miał false, w przeciwnym razie true.
brasofilo
Dzięki @brasofilo. Ale czy jest jakieś inne rozwiązanie? Myślę, że niektórzy użytkownicy zgubią się, jeśli nadadzą atrybutowi wartość „fałsz”, ale otrzymają wartość „prawda”.
Sodbileg Gansukh

Odpowiedzi:

14

Jest łatwy w użyciu 0i 1wartości, a następnie rzutowanie tekstu wewnątrz funkcji:

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

ale jeśli chcesz, możesz również ściśle sprawdzić 'false'i przypisać go do wartości logicznej, w ten sposób możesz również użyć:

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

Następnie:

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
źródło
To świetna odpowiedź. Ale pomyślałem, że byłoby wspaniale, gdyby użytkownicy mieli prawdziwy lub fałszywy wybór. Niestety nie mogę zaakceptować Twojej odpowiedzi jako zaakceptowanej.
Sodbileg Gansukh
@SodbilegGansukh ten kod działa również z 'true'i'false'
gmazzap
@toscho Właśnie skopiowałem i wkleiłem z kodeksu ;)
gmazzap
3
@SodbilegGansukh Wszystkie argumenty są przekazywane jako ciągi, ponieważ można je wprowadzać (wpisywać) tylko jako ciągi. Nie ma innego sposobu niż ta odpowiedź. Spróbuj wpisać bezstratną wartość logiczną…
fuxia
28

Jako rozszerzenie odpowiedzi @GM (która jest jedynym możliwym sposobem na zrobienie tego), oto nieco skrócona / upiększona i rozszerzona wersja (którą osobiście wolę):

Skrócony / Upiększony wariant

Wystarczy booleansprawdzić zawartą wartość. Jeśli tak true, wynik będzie (bool) true, w przeciwnym razie będzie fałszywy. Daje to jeden przypadek true, wszystko inne falseskutkuje.

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

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

Wariant rozszerzony / bezpieczny dla użytkownika

Powodem, dla którego wolę tę wersję, jest to, że pozwala ona wpisać się on/yes/1jako alias true. Zmniejsza to ryzyko błędów użytkownika, gdy użytkownik nie pamięta, jaka była rzeczywista wartość 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 );
}

Dodatkowe uwagi:

1) Zawsze przekazuj trzeci argument za shortcode_atts(). W przeciwnym razie filtr atrybutów krótkiego kodu nie może być celem.

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

2) Nigdy nie używaj extract(). Nawet rdzeń chce ograniczyć te połączenia. Gorzej jest ze globalzmiennymi, ponieważ IDE nie mają szansy na rozwiązanie wyodrębnionej zawartości i wyrzucą komunikaty o niepowodzeniach.

kajzer
źródło
1
Wow, to świetna odpowiedź. Dziękuję bardzo. Chciałbym mieć wystarczającą reputację, aby zagłosować na twoją odpowiedź. I bardzo dziękuję za radę.
Sodbileg Gansukh
1
Głosowałem w twoim imieniu, Sodbileg. :)
Dero
wp_validate_boolean()funkcja w WordPress 4.0.0 lub nowszym jest pomocna w sprawdzaniu poprawności wartości logicznych. Opis funkcji developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad
@AamerShahzad Jest to (niepotrzebnie dodana imho) alternatywa dla filter_var( $var, FILTER_VALIDATE_BOOLEAN ).tego, co stwierdza nawet sam docblock tej funkcji.
kaiser
@kaiser to tylko dla informacji.
Aamer Shahzad,
0

Oto krótsza prosta wersja oparta na odpowiedzi gmazzap:

Użyj „1” lub „0”, a następnie użyj podwójnego uderzenia „!!” co zmienia wartość „prawda / falsey” na wartość logiczną

zauważ, że to NIE będzie działać z ciągami „prawda” i „fałsz”, tylko „1” i „0”

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
ntheorist
źródło