Передайте булеве значення у короткому коді


16

Як у шорт-кодах WordPress можна передавати булеві атрибути?
Обидва [shortcode boolean_attribute="true"]або [shortcode boolean_attribute=true]дають рядкові значення.

EDIT

Користувачам, які знають, що роблять, не виникне жодних проблем, якщо я використовую трюк, який прокоментував @brasofilo. Але деякі користувачі загубляться, якщо дадуть falseзначення атрибуту та отримають trueзначення. То чи є якесь інше рішення?


2
Просто не передайте атрибут false, інакше ви отримаєте true.
brasofilo

Дякую @brasofilo Але чи є якесь інше рішення? Я думаю, що деякі користувачі загубляться, якщо дадуть атрибут "false" значення, але вони отримають "true" значення.
Содбілег Гансух

Відповіді:


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


Це чудова відповідь. Але я подумав, що було б чудово, якби користувачі мали правдивий чи помилковий вибір. Вибачте, я не можу прийняти вашу відповідь як прийняту.
Содбілег Гансух

@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) Завжди передайте 3-й аргумент для 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
Я голосував від вашого імені, Содбілег. :)
Dero

wp_validate_boolean()Функція в WordPress 4.0.0 або новішої версії корисна для перевірки булевих значень. Функція Довідник developer.wordpress.org/reference/functions/wp_validate_boolean
Аамер Шахзад

@AamerShahzad Це (неможливо додавати) альтернативу тому filter_var( $var, FILTER_VALIDATE_BOOLEAN )., про що говорить навіть сам докблок цієї функції.
кайзер

@kaiser це лише для інформації.
Аамер Шахзад

0

Ось коротша проста версія, спираючись на відповідь gmazzap:

Використовуйте "1" або "0", а потім киньте за допомогою подвійного удару "!!" яка змінює значення "truthy / falsey" на булевий еквівалент

зауважте, це НЕ буде працювати з рядками "true" і "false", лише "1" і "0"

[myshortcode myvar="0"]

myshortcodefunction( $args )
{
   $myvar = !! $args['myvar'];
   var_dump($myvar); // prints bool(false)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.