单个产品领域的WooCommerce Multi Select

Vig*_*ani 2 php wordpress woocommerce

我想在单个产品页面上添加列表框,我想知道在woocommerce中没有多选的选项,对于get_option支持multiselect的字段woocommerce但是对于post_metawoocommerce支持只有单选,不确定在woocommerce中是否有任何限制或者我可能会错过某些东西获得多选?这是我试过的下面的代码

 function create_multiselect() { 

    woocommerce_wp_select(array(
                'id' => 'newoptions',
                'class' => 'newoptions',
                'label' => __('Testing Multiple Select', 'woocommerce'),
                'options' => array(
                    '1' => 'User1',
                    '2' => 'User2',
                    '3' => 'User3',
                ))
            );

    }

    add_action("woocommerce_product_options_pricing","create_multiselect");
Run Code Online (Sandbox Code Playgroud)

任何建议都会很棒.

Dan*_*jel 5

woocommerce_wp_select()函数不支持multiselect,可以wc-meta-box-functions.php/woocommerce/includes/admin目录中打开文件以查看默认行为.

但是什么阻止你创建自己的函数,它将基于默认的Woo函数,并添加所需的功能,甚至更改默认函数(但仍然,修改插件文件不是最佳做法).下面是如何编写具有多个支持的新函数的示例,从原始的唯一更改是添加对名称和多个属性的支持,以及所选项的不同逻辑(因为post meta现在是一个数组).

function woocommerce_wp_select_multiple( $field ) {
    global $thepostid, $post, $woocommerce;

    $thepostid              = empty( $thepostid ) ? $post->ID : $thepostid;
    $field['class']         = isset( $field['class'] ) ? $field['class'] : 'select short';
    $field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : '';
    $field['name']          = isset( $field['name'] ) ? $field['name'] : $field['id'];
    $field['value']         = isset( $field['value'] ) ? $field['value'] : ( get_post_meta( $thepostid, $field['id'], true ) ? get_post_meta( $thepostid, $field['id'], true ) : array() );

    echo '<p class="form-field ' . esc_attr( $field['id'] ) . '_field ' . esc_attr( $field['wrapper_class'] ) . '"><label for="' . esc_attr( $field['id'] ) . '">' . wp_kses_post( $field['label'] ) . '</label><select id="' . esc_attr( $field['id'] ) . '" name="' . esc_attr( $field['name'] ) . '" class="' . esc_attr( $field['class'] ) . '" multiple="multiple">';

    foreach ( $field['options'] as $key => $value ) {

        echo '<option value="' . esc_attr( $key ) . '" ' . ( in_array( $key, $field['value'] ) ? 'selected="selected"' : '' ) . '>' . esc_html( $value ) . '</option>';

    }

    echo '</select> ';

    if ( ! empty( $field['description'] ) ) {

        if ( isset( $field['desc_tip'] ) && false !== $field['desc_tip'] ) {
            echo '<img class="help_tip" data-tip="' . esc_attr( $field['description'] ) . '" src="' . esc_url( WC()->plugin_url() ) . '/assets/images/help.png" height="16" width="16" />';
        } else {
            echo '<span class="description">' . wp_kses_post( $field['description'] ) . '</span>';
        }

    }
    echo '</p>';
}
Run Code Online (Sandbox Code Playgroud)

如何使用该功能的示例:

woocommerce_wp_select_multiple( array(
    'id' => 'newoptions',
    'name' => 'newoptions[]',
    'class' => 'newoptions',
    'label' => __('Testing Multiple Select', 'woocommerce'),
    'options' => array(
        '1' => 'User1',
        '2' => 'User2',
        '3' => 'User3',
    ))
);
Run Code Online (Sandbox Code Playgroud)


Meg*_*s91 5

没有必要创建一个新函数。在woocommerce_wp_select处理此开箱。可用的属性之一是custom_attributes可以接受数组的属性。如果您传入 an ,array('multiple'=>'multiple)则它会呈现多选。为了序列化和处理输入,您只需name[]在名称字段中提供一个,它就像魔术一样工作。这是一个例子——

woocommerce_wp_select(
    array(
        'id' => '_cb_days_available',
        'name' => '_cb_days_available[]',
        'label' => __('Days Offered', 'woocommerce'),
        'description' => 'Which days of the week is this charter available?',
        'default' => get_option('cb_open_days'),
        'desc_tip' => 'true',
        'class' => 'cb-admin-multiselect',
        'options' => array(
            'Mon' => 'Monday',
            'Tue' => 'Tuesday',
            'Wed' => 'Wednesday',
            'Thu' => 'Thursday',
            'Fri' => 'Friday',
            'Sat' => 'Saturday',
            'Sun' => 'Sunday'
        ),
        'custom_attributes' => array('multiple' => 'multiple')
    )
);
Run Code Online (Sandbox Code Playgroud)