wordpress 元框中的多个复选框

Posted

技术标签:

【中文标题】wordpress 元框中的多个复选框【英文标题】:Multiple check boxes in wordpress metabox 【发布时间】:2018-03-02 15:52:14 【问题描述】:

wordpress元框数组中如何设置多个复选框?

在我的情况下,我的单个复选框可以正常工作,但我的多个复选框不起作用,只是保存最后一项。

我在保存元框和显示元框有一些问题。

我不明白如何使用:

get_post_meta()
checked()
update_post_meta()

代码:

        <?php
    class Canco_Meta_Box 

        protected $_meta_box;

        function __construct( $meta_box ) 

            $this->_meta_box = $meta_box;

            add_action( 'admin_menu', array( &$this, 'add_meta_box' ) );
            add_action( 'save_post', array( &$this, 'save_meta_box' ) );

        

        function add_meta_box() 

            foreach ( $this->_meta_box['pages'] as $page ) 
                add_meta_box( $this->_meta_box['id'], $this->_meta_box['title'], array( &$this, 'show_meta_box'  ), $page, $this->_meta_box['context'], $this->_meta_box['priority'] );
            

        

        function show_meta_box( $post ) 

            echo '<input type="hidden" name="canco_meta_box_nonce" value="', wp_create_nonce( basename( __FILE__ ) ), '" />';

            foreach ( $this->_meta_box['fields'] as $field ) 
                $value = get_post_meta( $post->ID, $field['id'], true );
                $this->meta_box_fields( $field, $value );
            

        

        function save_meta_box( $post_id ) 

            global $post;

            if ( ! wp_verify_nonce( $_POST['canco_meta_box_nonce'], basename( __FILE__ ) ) ) 
                return $post_id;
            

            if ( ! empty( $_POST['canco_page_builder'] ) && $_POST['canco_page_builder'] != "" ) 
                update_post_meta( $post->ID, 'canco_page_builder' , $_POST['canco_page_builder'] );
             else 
                if ( isset( $post->ID ) ) 
                    delete_post_meta( $post->ID, 'canco_page_builder' );
                
            

            if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
                return $post_id;
            

            if ( 'page' == $_POST['post_type'] ) 
                if ( ! current_user_can( 'edit_page', $post_id ) ) 
                    return $post_id;
                
             elseif ( ! current_user_can( 'edit_post', $post_id ) ) 
                return $post_id;
            

            if ( isset ( $this->_meta_box['fields'] ) ) 
                foreach ( $this->_meta_box['fields'] as $field ) 
                    $old = get_post_meta( $post_id, $field['id'], true );
                    $new = $_POST[$field['id']];
                    if ( $new && $new != $old ) 
                        update_post_meta( $post_id, $field['id'], $new );
                     elseif ( '' == $new && $old ) 
                        delete_post_meta( $post_id, $field['id'], $old );
                    
                
            
        

        function meta_box_fields( $field, $value ) 

            echo '<div class="apanel-label">', $field['label'], '</div><div class="apanel-section">';

            switch ( $field['type'] ) 
                case 'checkbox':
                    echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $value ? ' checked="checked"': '', ' />';
                    break;
                case 'multi-checkbox':
                    if ( isset( $field['options'] ) ) 
                        foreach ($field['options'] as $option) 
                            echo '<input type="checkbox" name="', $field['id'],'" value="', $option['value'], '"', in_array( $option['value'], $value ) ? ' checked="checked"': '', ' /><label for="', $option['value'], '">', $option['label'], '</label><br />';
                        
                    
                    break;
            

            echo '</div>';

        

    

    $canco_product_details = array(
        'id'        => 'canco_product_details',
        'title'     => 'details',
        'pages'     => array( 'post' ),
        'context'   => 'normal',
        'priority'  => 'high',
        'fields'    => array(
            array(
                'id'      => 'canco_product_color',
                'type'    => 'multi-checkbox',
                'label'   => 'colors',
                'options' => array(
                    array(
                        'value' => '#0038a8',
                        'label' => 'blue',
                    ),
                    array(
                        'value' => '#ee2b2c',
                        'label' => 'red',
                    ),
                    array(
                        'value' => '#139f49',
                        'label' => 'green',
                    ),
                    array(
                        'value' => '#000000',
                        'label' => 'black',
                    ),
                    array(
                        'value' => '#dd1176',
                        'label' => 'pink',
                    ),
                    array(
                        'value' => '#e25f33',
                        'label' => 'orange',
                    ),
                ),
            ),
        ),
    );

    new Canco_Meta_Box( $canco_product_details );

我正在尝试构建一个带有一堆复选框的元框供我的用户选择,并且我可以让它显示在我的自定义帖子类型编辑屏幕上。但是复选框没有保存...这是构建复选框的代码。

【问题讨论】:

【参考方案1】:

尝试将[] 添加到您的字段名称:

echo '<input type="checkbox" name="', $field['id'],'[]" ...

这将保存所有传入的值,而不是最后一个。原因是同名的表单元素会互相覆盖:

<input type="checkbox" name="mycheck" value="foo"/>
<input type="checkbox" name="mycheck" value="bar"/>

假设两者都被选中,在后端收到表单时,“mycheck”将为bar,但是:

<input type="checkbox" name="mycheck[]" value="foo"/>
<input type="checkbox" name="mycheck[]" value="bar"/>

现在,“mycheck”的值将是一个包含被检查元素值的数组。因此,如果两者都被选中,则值为:

Array(
    'foo',
    'bar'
)

【讨论】:

以上是关于wordpress 元框中的多个复选框的主要内容,如果未能解决你的问题,请参考以下文章

wordpress metabox中的多个复选框

从购物车表单复选框返回字符串(是/否)到 wordpress 元框

Wordpress 自定义元框多张图片上传

Wordpress 自定义 Metabox 复选框保存问题

按元框值自定义帖子类型查询

在特色图片元框中添加或更改内容-Wordpress