Übergeben Sie einen booleschen Wert als Shortcode

16

Wie kann ich in WordPress-Shortcodes boolesche Attribute übergeben?
Beide von [shortcode boolean_attribute="true"]oder [shortcode boolean_attribute=true]geben Zeichenfolgenwerte an.

BEARBEITEN

Es wäre kein Problem für Benutzer, die wissen, was sie tun, wenn ich den von @brasofilo kommentierten Trick verwende. Einige Benutzer gehen jedoch verloren, wenn sie einen Attributwert falseangeben und einen trueWert erhalten . Gibt es also eine andere Lösung?

Sodbileg Gansukh
quelle
2
Übergeben Sie das Attribut einfach nicht und Sie werden es falsesonst haben true.
Brasofilo
Vielen Dank @brasofilo. Aber gibt es eine andere Lösung? Ich denke, einige Benutzer gehen verloren, wenn sie ein Attribut mit dem Wert "false" angeben, aber sie erhalten den Wert "true".
Sodbileg Gansukh

Antworten:

14

Ist einfach zu bedienen 0und 1Werte und dann Typumwandlung innerhalb der Funktion:

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

Wenn Sie möchten, können Sie auch streng 'false'nach Booleschen Werten suchen und diese zuweisen. Auf diese Weise können Sie auch Folgendes verwenden:

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

Dann:

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
quelle
Das ist eine gute Antwort. Aber ich dachte, es wäre großartig, wenn die Benutzer die richtige oder falsche Wahl hätten. Entschuldigung, ich kann Ihre Antwort nicht als angenommen akzeptieren.
Sodbileg Gansukh
@ SodbilegGansukh dieser Code funktioniert auch mit 'true'und'false'
gmazzap
@toscho Ich habe gerade aus dem Codex kopiert und eingefügt ;)
gmazzap
3
@SodbilegGansukh Alle Argumente werden als Zeichenfolgen übergeben, da sie nur als Zeichenfolgen eingegeben (eingegeben) werden können. Es gibt keinen anderen Weg als diese Antwort. Versuchen Sie, einen stringlosen booleschen Wert
einzugeben
28

Als Erweiterung zu @GM answer (das ist der einzig mögliche Weg, dies zu tun), hier eine leicht verkürzte / verschönerte und eine erweiterte Version (die ich persönlich bevorzuge):

Verkürzte / Verschönerte Variante

Es reicht aus, booleanden enthaltenen Wert zu überprüfen. Wenn ja true, ist das Ergebnis (bool) true, sonst ist es falsch. Dies ergibt einen Einzelfall true, alles andere falseergibt sich.

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

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

Erweiterte / Benutzersichere Variante

Der Grund, warum ich diese Version bevorzuge, ist, dass der Benutzer sie on/yes/1als Alias ​​für eingeben kann true. Dies verringert die Wahrscheinlichkeit von Benutzerfehlern, wenn sich der Benutzer nicht an den tatsächlichen Wert erinnert 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 );
}

Zusätzliche Bemerkungen:

1) Übergeben Sie immer das 3. Argument für shortcode_atts(). Andernfalls kann der Filter für Kurzwahlattribute nicht ausgewählt werden.

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

2) Niemals verwenden extract(). Auch Kern will diese Anrufe reduzieren. Dies ist für globalVariablen ebenso schlimmer , da IDEs keine Chance haben, den extrahierten Inhalt aufzulösen, und Fehlermeldungen auslösen.

Kaiser
quelle
1
Wow, das ist eine großartige Antwort. Ich danke dir sehr. Ich wünschte, ich hätte genug Ruf, um für Ihre Antwort zu stimmen. Und vielen Dank für Ihren Rat.
Sodbileg Gansukh
1
Ich habe für Sie gestimmt, Sodbileg. :)
Dero
wp_validate_boolean()Funktion in WordPress 4.0.0 oder höher ist hilfreich bei der Überprüfung von Booleschen Werten. Funktionsreferenz developer.wordpress.org/reference/functions/wp_validate_boolean
Aamer Shahzad
@AamerShahzad Dies ist eine (imho unnötigerweise hinzugefügte) Alternative zu dem filter_var( $var, FILTER_VALIDATE_BOOLEAN )., was selbst der doc-Block dieser Funktion selbst angibt.
Kaiser
@kaiser das ist nur zur information.
Aamer Shahzad
0

Hier eine kürzere, einfache Version, die auf der Antwort von gmazzap aufbaut:

Benutze '1' oder '0' und wirke dann mit einem Doppelknall "!!" Das ändert einen "truthy / falsey" -Wert in ein boolesches Äquivalent

Beachten Sie, dass dies NICHT mit "true" und "false" Zeichenfolgen funktioniert, sondern nur mit "1" und "0".

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
Theoretiker
quelle