我正在尝试制作一个快捷代码,它将创建一个可下载文件链接的动态下拉列表,一旦选中,html将在下拉列表下方显示一个下载链接。
以下是快捷码如何工作的最终结果:http://jsfiddle.net/KKyE9/
我正在努力研究如何将短码数组转换为多维数组,或者这是否是正确的方法。
例如,通过shortcode,我传递的属性不是在shortcode函数中定义的,而是要在函数中创建的。
[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"]
所以选项1,链接1,标签1,选项2,链接2,标签2。。。提取短代码属性时需要创建等。
我有一个工作模型,可以创建下拉列表并显示下面的html链接,但它只适用于单个链接。
我的挑战是将键控属性(option1、option2)从短代码传递到短代码函数中,以便我可以在循环中使用它们并动态创建下拉列表选项。
我相信代码可以更好,但我只是想让它首先为单个属性工作。
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");
理想情况下,我宁愿从下面的一系列schortcodes中设置这样的下拉列表,它更容易阅读,但我一直得到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"]
最合适的回答,由SO网友:s_ha_dum 整理而成
根据您问题底部的示例,以及您希望这样做以提高可读性的声明,我会这样做:
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
如果愿意,值应允许您在同一页上放置多个选择。
SO网友:brasofilo
一个简单的解决方案是使用特殊的分隔符和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
)
)
Code for the shortcodeadd_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>\';
}