web-dev-qa-db-ja.com

動的ドロップダウンボックスフォームのショートコード属性を作成するためのショートコード

ダウンロード可能なファイルリンクの動的なドロップダウンリストを作成するショートコードを作成しようとしています。一度選択すると、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から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");

理想的には、私は以下の一連のschortcodeからこのようにドロップダウンを設定したいと思います、それは読みやすいですが、私は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"]
1
Jason

あなたの質問の一番下にあるあなたの例とあなたが読みやすくするためにそのようなものが欲しいというあなたの声明に基づいて、私はこのようなことをするつもりです:

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');

それからあなたは2つのショートコードであなたのドロップダウンを構築して表示することができます:

[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"]

最初のショートコードは一度に一つずつあなたのオプションを構築します - 3つは示されています。 2番目のものはそれを表示します。必要に応じて、dropidの値によって、同じページに複数の選択項目を配置できます。

1
s_ha_dum

簡単な解決策は、特別な区切り文字とPHP関数explodeを使うことです。

[multiarray options="option1a#option1b#option1c%option2a#option2b#option2c"]のように。第1レベルの区切り文字として%を使い、第2レベルとして#を使う。

この例では投稿内容にこれを印刷します。

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>';
}
1
brasofilo