Поддержка массивов в шорткодах
Не так давно я работал над клиентским сайтом, в котором мне потребовалось создать шорткод, принимающий несколько атрибутов. Некоторые из этих атрибутов должны были выступать массивами, поскольку функция, которой они передавались, требовала массивов для некоторых своих переменных.
Таким образом, я начал с создания шорткода и настройки атрибутов, для которых мне нужно было собрать данные. Мой шорткод имел следующий вид:
function chain_select_shortcode( $atts ) { extract( shortcode_atts( array( 'tax' => 'category', 'level' => 1, 'titles' => array( 'Please select…' ), 'labels' => '', 'btn_text' => 'Submit', 'exclude' => '', 'count' => 1 ), $atts ) ); } add_shortcode( 'ajax_chain_select', 'chain_select_shortcode' );
Здесь я установил шорткод и задал стандартные настройки (для тех случаев, когда атрибуты не объявлены в шорткоде).
Поскольку функция, которой я хотел передать информацию, уже существовала в другом плагине, мне нужно было просто возвратить данные. Так как атрибуты заголовков и лейблов принимают массивы, мне понадобился способ преобразования полученных данных в массив, который уже можно было бы передать в функцию.
Я реализовал это так: просто разделил значения в атрибутах с помощью запятой и пробела. Мой шорткод стал выглядеть следующим образом:
[ajax_chain_select tax="competitor" level=2, titles="Select Manufacturer, Select Product" labels="Manufacturer, Product" count=0]
Вы можете видеть, что здесь имеются множественные значения для заголовков и лейблов, как было упомянуто выше.
При передаче этих данных в функцию мы можем использовать explode() для создания массива. Вот, как это будет выглядеть в окончательном варианте:
function chain_select_shortcode( $atts ) { extract( shortcode_atts( array( 'tax' => 'category', 'level' => 1, 'titles' => array( 'Please select…' ), 'labels' => '', 'btn_text' => 'Submit', 'exclude' => '', 'count' => 1 ), $atts ) ); return chainselect_getcategories( $tax, $level, explode( ', ', $titles ), explode( ', ', $labels ), $btn_text, $exclude, $count ); } add_shortcode( 'ajax_chain_select', 'chain_select_shortcode' );
Обратите внимание на функцию chainselect_categories – в ней содержится функция explode, необходимая для создания массива, которая требует, чтобы значения были разделены пробелом и запятой.
Теперь функция получает данные в виде массива и может работать, как положено.
Источник: doitwithwp.com