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?


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


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.


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)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.