2016-04-21 17 views
0

Ich baue ein Wordpress-Widget, das verwendet werden kann, um Anführungszeichen am Frontend anzuzeigen. Die Zitate können mit dem Autorennamen und dem Zitattext eingefügt werden.Multidimensionales Array in Wordpress Widget erstellen

Meine Widget-Datei sieht wie folgt aus:

class random_quotes extends WP_Widget { 

    function random_quotes(){ 
     $widget_ops = array(
      'classname' => 'random-quotes', 
      'description' => __('Fill in quotes to display random on your site with every new pageload.', 'onm_textdomain'), 
     ); 
     $control_ops = array(
      'id_base' => 'random-quotes', 
     ); 
     $this->WP_Widget('random-quotes', __('Random Quotes', 'onm_textdomain'), $widget_ops, $control_ops); 
    } 

    function widget($args, $instance){ 
     extract($args); 
     $title = apply_filters('widget_title', $instance['title']); 
     $quote = isset($instance['quote'])?$instance['quote']:''; 

     if($title){ 
      echo $before_title.$title.$after_title; 
     } 

     echo $before_widget;   

     ?> 
     <div class='random_quotes_widget'> 
      <div class="quote"> 
       <blockquote> 
        <?php function get_random_quote($quotes) { 
         $quote = $quotes; 
         $random_quote = array_rand($quote); 
         $random = $quote[$random_quote]; 
         return '<p>' . $random["quote"] . '.</p>'.'<cite>' . $random["name"] . '</cite>'; 
        } 
        echo get_random_quote($quotes); ?> 
       </blockquote> 
      </div> 
     </div> 
     <?php 
     echo $after_widget; 
    } 

    function update($new_instance, $old_instance) { 
     $instance   = $old_instance; 
     $instance['title'] = esc_html($new_instance['title']); 
     $instance['quotes'] = array(); 

     if (isset ($new_instance['quotes'])) { 
      foreach ($new_instance['quotes'] as $value_quote) { 
       if ('' !== trim($value_quote)) 
        $instance['quotes'][] = $value_quote; 
      } 
     } 

     return $instance; 
    } 

    function form($instance){ 
     $defaults = array('title' => __('Quotes', 'onm_textdomain')); 
     $instance = wp_parse_args((array) $instance, $defaults); 

     $quotes = isset ($instance['quotes']) ? $instance['quotes'] : array(); 
     $quotes[ count($quotes) + 1 ] = ''; 
     $quotes_html = array(); 
     $quotes_counter = 0; 

     foreach ($quotes as $quote => $value_quote) { 
      $quotes_html[] = sprintf(
       '<tr id="postcustomstuff"> 
        <td> 
         <table id="single-quote" width="100"> 
          <thead> 
           <tr> 
            <th style="line-height: 28px;">'.__('Quote', 'onm_textdomain').'<a class="button remove-row right" href="#">-</a></th> 
           </tr> 
          </thead> 
          <tbody> 
           <td> 
           <input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat" placeholder="'.__('Name', 'onm_textdomain').'" /> 
           <textarea class="widefat" rows="5" cols="20" name="%1$s[%2$s]" placeholder="'.__('Quote', 'onm_textdomain').'" />%3$s</textarea> 
          </td> 
          </tbody> 
         </table> 
        </td> 
       </tr>', 
       $this->get_field_name('quotes'), 
       $quotes_counter, 
       esc_attr($value_quote) 
      ); 
      $quotes_counter += 1; 
     } 
     ?> 
     <p> 
      <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php _e('Title:', 'onm_textdomain');?></label> 
      <input type="text" class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" value="<?php echo esc_attr($instance['title']); ?>" /> 
     </p> 

     <table id="publication-downloadset-one" width="100%"> 
      <tbody> 
       <?php print join($quotes_html); ?> 
       <tr class="add-row"> 
        <td> 
         <p><input type="submit" name="savewidget" class="button widget-control-save" value="+"></p> 
        </td> 
       </tr> 
      </tbody> 

    </table> 

    <script type="text/javascript"> 
    jQuery(document).ready(function($){ 
     $('.widget').click(function() { 
      if (!$(this).hasClass('open')) { 
       $(this).css({"z-index": "100", "margin-left": "-146px"}); 
      } 
     });  

     $('.remove-row').on('click', function() { 
      $(this).parents('tr').remove(); 
      return false; 
     }); 

     $('#single-quote thead').click(function() { 
      $(this).next('tbody').toggleClass('hidden'); 
     }); 

    }); 
    </script> 

    <?php 
    } 
} 

function random_quotes_widget(){ 
    register_widget('random_quotes'); 
} 

add_action('widgets_init', 'random_quotes_widget'); 

Basierend auf der Antwort von @toscho auf this question ich einen Weg gefunden habe meine Widget Felder Daten als Array zu speichern. So dank seine Antwort erhalte ich den folgenden Array-Ausgang:

Array ( 
    [0] => Quote text 1 
    [1] => Quote text 2 
    [3] => Quote text 3 
) 

Aber was ich suche ist die folgende Ausgabe:

Array ( 
    [0] => Array ( 
     [quote] => Quote text 1 
     [author] => Author of the quote 1 
    ) 
    [1] => Array ( 
     [quote] => Quote tekst 2 
     [author] => Author of the quote 2 
    ) 
) 

Gibt es eine Möglichkeit, dieses mehrdimensionales Array zu erstellen? Danke schon für eure Hilfe!

Antwort

0

Möglicherweise haben Sie es anpassen, damit es richtig funktioniert, aber so etwas wie dies funktionieren könnte:

if (isset ($new_instance['quotes'])) { 
     $index = 0; 
     foreach ($new_instance['quotes'] as $value_quote) { 
      if ('' !== trim($value_quote)) { 
       $instance['quotes'][ $index ] = array(); 
       $instance['quotes'][ $index ]['quote'] = $value_quote; 
       $instance['quotes'][ $index ]['author'] = 'name author'; 
       $index++; 
      } 
     } 
    } 
+0

Dank @RST, diese legit scheint. Aber weißt du, wie ich diese Arrays in meinem Widget füllen und anzeigen kann? – Nick

+0

Dieser Code sollte die 'if'-Schleife in Ihrer' update' Funktion ersetzen – RST

+0

Danke @RST, und wie kann ich diese in einer foreach-Schleife ausgeben? Ich habe Probleme, die Werte auf meiner Website zu finden. – Nick