Передать логическое значение в шорткоде

16

В шорткодах WordPress как передать логические атрибуты?
Оба [shortcode boolean_attribute="true"]или [shortcode boolean_attribute=true]дают строковые значения.

РЕДАКТИРОВАТЬ

Не будет проблем для пользователей, которые знают, что делают, если я использую трюк, который прокомментировал @brasofilo. Но некоторые пользователи будут потеряны, если они дадут falseзначение атрибута и получат trueзначение. Так есть ли другое решение?

Содбилег Гансух
источник
2
Просто не передавайте атрибут, и вы будете иметь false, в противном случае true.
brasofilo
Спасибо @brasofilo. Но есть ли другое решение? Я думаю, что некоторые пользователи будут потеряны, если они дадут атрибуту «ложное» значение, но они получат «истинное» значение.
Содбилег Гансух

Ответы:

14

Прост в использовании 0и 1значения, а затем приведение типов внутри функции:

[shortcode boolean_attribute='1'] или [shortcode boolean_attribute='0']

но если вы хотите, вы также можете строго проверить 'false'и присвоить его логическому значению, таким образом вы также можете использовать:

[shortcode boolean_attribute='false'] или [shortcode boolean_attribute='true']

Потом:

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
источник
Это отличный ответ. Но я подумал, что было бы здорово, если бы у пользователей был истинный или ложный выбор. Извините, я не могу принять ваш ответ как принятый.
Содбилег Гансух
@SodbilegGansukh этот код работает также с 'true'и'false'
gmazzap
@ toscho Я только что скопировал и вставил из кодекса ;)
gmazzap
3
@SodbilegGansukh Все аргументы передаются в виде строк, поскольку их можно вводить (вводить) только в виде строк. Нет другого пути, кроме этого ответа. Попробуйте ввести логическое значение без строки ...
fuxia
28

В качестве дополнения к ответу @GM (который является единственным возможным способом сделать это), вот немного укороченная / украшенная и расширенная версия (которую я лично предпочитаю):

Укороченный / украшенный вариант

Для этого достаточно booleanпроверить наличие содержимого. Если это так true, результат будет (bool) true, иначе он будет ложным. Это приводит к одному случаю true, все остальное - falseрезультат.

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

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

Расширенный / безопасный для пользователя вариант

Причина, по которой я предпочитаю эту версию, заключается в том, что она позволяет пользователю вводить on/yes/1псевдоним для true. Это уменьшает вероятность ошибок пользователя, когда пользователь не помнит, каково было фактическое значение 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 );
}

Дополнительные замечания:

1) Всегда передавайте третий аргумент для shortcode_atts(). В противном случае фильтр атрибутов шорткода невозможно нацелить.

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

2) Никогда не используйте extract(). Даже ядро ​​хочет уменьшить эти звонки. В равной степени хуже для globalпеременных, так как у IDE нет шансов разрешить извлеченное содержимое и будут выдаваться сообщения об ошибках.

кайзер
источник
1
Вау, это отличный ответ. Огромное спасибо. Хотел бы я иметь достаточно репутации, чтобы проголосовать за ваш ответ. И большое спасибо за ваш совет.
Содбилег Гансух
1
Я голосовал за тебя, Содбилег. :)
Деро
wp_validate_boolean()Функция в WordPress 4.0.0 или выше полезна при проверке логических значений. Справочник по функциям developer.wordpress.org/reference/functions/wp_validate_boolean
Аамер Шахзад,
@AamerShahzad Это (без необходимости добавленная имхо) альтернатива тому filter_var( $var, FILTER_VALIDATE_BOOLEAN )., о чем заявляет даже докблок этой функции.
Кайзер
@ Кайзер это только для информации.
Аамер Шахзад
0

Вот более короткая простая версия, основанная на ответе gmazzap:

Используйте '1' или '0', затем применяйте двойной удар "!!" который изменяет значение "истина / фальси" на его логический эквивалент

обратите внимание, что это НЕ будет работать со строками «истина» и «ложь», только «1» и «0»

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
ntheorist
источник