web-dev-qa-db-fra.com

shortcode pour créer des attributs de shortcode sous forme de liste déroulante dynamique

J'essaie de créer un shortcode qui créera une liste déroulante dynamique de liens de fichiers téléchargeables, qui, une fois sélectionné, affichera un lien de téléchargement sous la liste déroulante.

Voici le résultat final du fonctionnement du shortcode: http://jsfiddle.net/KKyE9/

Je me demande comment transformer le tableau en shortcode en tableau multidimensionnel ou si c'est la bonne approche.

Par exemple, via le shortcode, je transmets des attributs qui ne sont pas définis dans la fonction de shortcode, mais doivent être créés dans la fonction.

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

Donc, option1, lien1, label1, option2, lien2, label2 ... etc. doivent être créés lorsque les attributs de shortcode sont extraits.

J'ai un modèle de travail qui crée la liste déroulante et affiche le lien html ci-dessous, mais qui ne fonctionne que pour un seul lien.

Mon défi est de passer les attributs avec clé (option1, option2 du shortcode à la fonction shortcode afin que je puisse les utiliser en boucle et créer dynamiquement les options de la liste déroulante.

Je suis sûr que le code peut être meilleur, mais j'essayais simplement de le faire fonctionner en premier pour un seul attribut.

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

Idéalement, je préférerais configurer le menu déroulant comme celui-ci à partir de la série de codes schort suivante, il est plus facile à lire, mais je reçois 4 menus déroulants.

[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

En vous basant sur votre exemple au bas de votre question et sur l'affirmation selon laquelle vous souhaiteriez une telle lisibilité pour des raisons de lisibilité, je ferais quelque chose comme ceci:

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

Ensuite, vous pouvez créer et afficher votre liste déroulante avec deux codes abrégés:

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

Le premier shortcode construit vos options une à la fois - trois affichées. Le second l'affiche. La valeur dropid devrait vous permettre de placer plusieurs sélections sur la même page, si vous le souhaitez.

1
s_ha_dum

Une solution simple consisterait à utiliser des séparateurs particuliers et la fonction PHPexplode.

Comme [multiarray options="option1a#option1b#option1c%option2a#option2b#option2c"]. Utilisation de%comme séparateur de premier niveau et#comme deuxième niveau.

Cet exemple imprime ceci dans le contenu du message:

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

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

)

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