Create multidimensional array in WordPress Widget

I’m building a WordPress widget which can be used to show quotes on the frontend. The quotes can be insert with the author name and the quote text.

My widget file looks like this:

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

Based on the answer of @toscho on this question I’ve found a way to store my widget fields data as an array. So thanks to his answer I get the following array output:

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

But what I’m looking for is the following output:

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

Is there a way to create this multidimensional array? Thanks already for your help guys!

Related posts

1 comment

  1. You may have to adjust it to make it work properly but something like this could work:

        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++;
                }
            }
        }
    

Comments are closed.