用于创建动态下拉框表单快捷代码属性的快捷代码

时间:2013-02-08 作者:Jason

我正在尝试制作一个快捷代码,它将创建一个可下载文件链接的动态下拉列表,一旦选中,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"]

2 个回复
最合适的回答,由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 shortcode

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

结束

相关推荐

Why posts array is empty?

我尝试获取没有自定义字段集的帖子,或者if set的值与给定的参数不同。这是我的代码: $args_included = array( \'numberposts\' => 1, \'post_type\' => \'post\', \'post_status\' => \'published\', \'meta_query\' => array(&#x