Свойство shortcode empty

Есть ли способ создать пустой атрибут для короткого кода?

Пример:

function paragraph_shortcode( $atts, $content = null ) { return '<p class="super-p">' . do_shortcode($content) . '</p>'; } add_shortcode('paragraph', 'paragraph_shortcode'); 

Типы пользователей

[пункт] что-то [/ пункт]

и оно показывает

<p class="super-p"> something </p>

Как добавить пустую функцию атрибута к моему первому коду? Поэтому, когда пользовательские типы

[абзац последний] что-то [/ paragraph]

Он будет выводить:

 <p class="super-p last"> something </p> 

Я считаю, добавление:

 extract( shortcode_atts( array( 'last' => '', ), $atts ) ); 

является хорошим началом, но как проверить, пользовался ли пользователь «последним» атрибутом, пока он не имеет значения?

Там может быть несколько способов сделать это. К сожалению, я не думаю, что это приведет к тому, что вы собираетесь делать. ( [paragraph last] )

  1. Вы могли бы просто создать отдельные короткие коды для [paragraph_first] [paragraph_last] [paragraph_foobar] которые обрабатывают $ content без каких-либо атрибутов

  2. Вы можете установить для значения по умолчанию значение last вместо false а затем потребовать от пользователя [paragraph last=""]content[/paragraph]

  3. Вы можете добавить более значимый атрибут, такой как position которая затем может использоваться как [paragraph position="first"] или [paragraph position="last"]

Из-за того, что WordPress отбрасывает какие-либо atts не заданные значения по умолчанию, и тот факт, что att без a ="value" присваивается значение по умолчанию так же, как если бы оно вообще не отображалось, я не вижу никакого способа достичь [paragraph last]

Надеюсь, что один из моих трех способов решения окажется полезным. Удачи!

WordPress не отбрасывает атрибуты без значений, как это предлагает SethMerrick, но он не обрабатывает его так, как вы ожидали. В вашем примере вы не сможете проверить isset($atts['last']) , но «last» передается как значение для неназванного атрибута. В этом случае это приведет к TRUE: ($atts[0] == 'last') . Таким образом, вы можете сделать цикл foreach для проверки любого атрибута со значением «last».

Когда [example attr1="value1" attr2 attr3="value3" attr4] анализируется, параметр $atts дает:

 $atts = array ( 'attr1' => 'value1', 0 => 'attr2', 'attr3' => 'value3', 1 => 'attr4' ); 

Вы можете нормализовать это так, тогда вы можете называть shortcode_atts .

 if (!function_exists('normalize_empty_atts')) { function normalize_empty_atts ($atts) { foreach ($atts as $attribute => $value) { if (is_int($attribute)) { $atts[strtolower($value)] = true; unset($atts[$attribute]); } } return $atts; } } function paragraph_shortcode ($atts, $content = null) { extract(shortcode_atts( array ( 'last' => '' ), normalize_empty_atts($atts) )); return '<p class="super-p' .($last ? ' last' : '') .'">' .do_shortcode($content) .'</p>'; } add_shortcode('paragraph', 'paragraph_shortcode'); не if (!function_exists('normalize_empty_atts')) { function normalize_empty_atts ($atts) { foreach ($atts as $attribute => $value) { if (is_int($attribute)) { $atts[strtolower($value)] = true; unset($atts[$attribute]); } } return $atts; } } function paragraph_shortcode ($atts, $content = null) { extract(shortcode_atts( array ( 'last' => '' ), normalize_empty_atts($atts) )); return '<p class="super-p' .($last ? ' last' : '') .'">' .do_shortcode($content) .'</p>'; } add_shortcode('paragraph', 'paragraph_shortcode'); 

Другие примечания:

  • [paragraph last] сделает $last = true . [paragraph last="1"] сделает $last = '1' .
  • Атрибуты не чувствительны к регистру, поэтому [paragraph LAST] эквивалентен [paragraph last] .
  • Атрибуты не могут быть чисто числовыми, поэтому созданный мной цикл foreach безопасен для атрибутов с индексом с целыми числами.

Я знаю, что это старо, но я не чувствовал, что ответы на них были полными, компактными ответами. Многие люди предлагают запустить массив $atts через foreach, чтобы узнать, существует ли ваше значение. На самом деле я не чувствую, что это должно быть так сложно; array_search может использоваться вместо этого для упрощения.

В случае вашего примера вы можете использовать это:

[paragraph last] something [/paragraph]

затем, чтобы определить, предоставлен ли пустой атрибут, используйте базовое условие для проверки и проверьте, вернул ли ключ null или как целое число (включая ноль):

 // Returns the array key, if empty attribute is found $last_key = array_search('last', $atts); // Determine if the key is an integer, zero or greater // (In the event you're passing multiple empty attributes) if(is_int($last_key)) { // Do something, your attribute is set } 

Я нашел это: http://richjenks.com/wp-shortcode-attributes-without-values/

КОД

 function get_flags($atts) { $flags = array(); if (is_array($atts)) { foreach ($atts as $key => $value) { if ($value != '' && is_numeric($key)) { array_push($flags, $value); } } } return $flags; } 

ПРИМЕНЕНИЕ

 $flags = get_flags($atts); if (in_array('your_flag', $flags) { // Flag is present }