在Wordpress Widget中创建多维数组


Create multidimensional array in Wordpress Widget

我正在构建一个Wordpress小部件,它可以用来在前端显示引号。引号可以插入作者姓名和引号文本。

我的小部件文件如下:

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

根据@toscho对这个问题的回答,我找到了一种将小部件字段数据存储为数组的方法。因此,多亏了他的回答,我得到了以下数组输出:

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

但我正在寻找以下输出:

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

有办法创建这个多维数组吗?已经谢谢你们的帮助了!

您可能需要对其进行调整以使其正常工作,但类似的操作可能会起作用:

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