shortcode для создания динамических раскрывающихся списков с атрибутами shortcode

Я пытаюсь создать короткий код, который будет создавать динамический раскрывающийся список загружаемых ссылок на файлы, который после выбора html покажет ссылку для загрузки ниже раскрывающегося списка.

Вот конечный результат работы короткого кода: http://jsfiddle.net/KKyE9/

Я борюсь с тем, как превратить массив коротких кодов в многомерный массив или если это правильный подход.

Например, через короткий код я передаю атрибуты, которые не определены в функции короткого кода, но должны быть созданы внутри функции.

[sc total_options="10" option1="module 1" link1="http://cisco.com" label1="Click Here to download Module 2 audio file" option2="module 2" link2="http://wordpress.com" label2="Click Here to download Module 2 audio file" option3="module 3" label3="Click Here to download Module 3 audio file" link3="http://cisco.com" option4="module 4" label4="Click Here to download Module 4 audio file" link4="http://wordpress.com"] 

Итак, option1, link1, label1, option2, link2, label2 … и т. Д. необходимо создать при извлечении атрибутов короткого кода.

У меня есть рабочая модель, которая создает раскрывающийся список и отображает ссылку html ниже, но работает только для одной ссылки.

Моя задача – передать атрибуты с ключами (option1, option2 из короткого кода в функцию shortcode, чтобы я мог использовать их в цикле и динамически создавать варианты раскрывающегося списка.

Я уверен, что код может быть лучше, но я просто пытался заставить его работать сначала для одного атрибута.

 function shortcode_dd_list($atts, $content = null) { extract(shortcode_atts(array( "total_options" => '', "option" => '', "label" => '', "link" => '' ), $atts)); $output = ''; $output .= '<select id="wlmm-select-dropdown">'; $output .= '<option value="option0">Please select a module to download</option>'; $i = 1; while ( $i <= $total_options ) { $output .= '<option value="'.$option'">'.$option.'</option>'; $i++; } $output .= '</select>'; $i = 1; while ( $i <= $total_options ) { $output .='<div id="'.$option.'" class="wlmm-select-dropdown-group">'.'<a href="'.$link.'">'.$label.'</a></div>'; $i++; } return $output; } add_shortcode("sc", "shortcode_dd_list"); 

В идеале я предпочел бы настроить раскрывающийся список, как это, из следующей серии шорткодов, ее легче читать, но я продолжаю получать 4 раскрывающихся окна.

 [sc total_options="4"] [sc option1="Module 1" label1="Module 1 download" link1="http://bitBucket.com"] [sc option2="Module 2" label2="Module 2 download" link="http://lostInSpace"] [sc option3="Module 3" label3="Module 3 download" link="http://null"] [sc option4="Module 4" label4="Module 4 download" link="http://error.com"] 

Основываясь на вашем примере в нижней части вашего вопроса и вашем заявлении о том, что вы хотите что-то подобное для удобочитаемости, я бы сделал что-то вроде этого:

 function dropdown_option($atts) { $dropid = (isset($atts['dropid'])) ? $atts['dropid'] : ''; global $sco_array; if (!empty($atts['value']) && !empty($atts['text'])) { $sco_array[$dropid][$atts['value']] = $atts['text']; } } add_shortcode('sco','dropdown_option'); function sc_dropdown($atts) { $id = (isset($atts['id'])) ? $atts['id'] : 'sc_dropdown'; $dropid = (isset($atts['dropid'])) ? $atts['dropid'] : ''; global $sco_array; $sel = ''; if (!empty($sco_array[$dropid])) { $sel .= '<select id="'.$id.'" >'; $sel .= '<option value="option0">Please select a module to download</option>'; foreach($sco_array[$dropid] as $k=>$v) { $sel .= '<option value="'.$k.'">'.$v.'</option>'; } $sel .= '</select>'; } return $sel; } add_shortcode('scd','sc_dropdown'); 

Затем вы можете создавать и отображать выпадающее меню с помощью двух коротких кодов:

 [sco dropid="one" value="http://example.com" text="Option1"] [sco dropid="one" value="http://example1.com" text="Option2"] [sco dropid="one" value="http://example2.com" text="Option3"] [scd dropid="one" id="wlmm-select-dropdown"] 

Первый короткий код строит ваши варианты по одному – три показаны. Второй отображает его. Значение dropid должно позволить вам поместить несколько dropid на одну страницу, если хотите.

Простое решение будет использовать специальные разделители и функция PHP explode .

Как [multiarray options="option1a#option1b#option1c%option2a#option2b#option2c"] . Использование % качестве разделителя первого уровня, а # – второго уровня.

Этот пример печатает это в сообщении:

 Array ( [0] => Array ( [0] => option1a [1] => option1b [2] => option1c ) [1] => Array ( [0] => option2a [1] => option2b [2] => option2c ) ) 

Код для короткого кода

 add_shortcode( 'multiarray', 'shortcode_wpse_85159' ); /** * Shortcode options to Multidimensional Array * Usage: [multiarray options="one#two#three%four#five#six%seven#eight#nine"] */ function shortcode_wpse_85159( $atts, $content = null ) { // options not defined, do nothing if( !$atts['options'] ) return; $first_level = explode( '%', $atts['options'] ); $final_array = array(); foreach( $first_level as $level ) { $second_level = explode( '#', $level ); $final_array[] = $second_level; } // Returns a <pre> block of human readable variable value // http://www.php.net/manual/en/function.print-r.php return '<pre>' . print_r( $final_array, true ) . '</pre>'; }