以编程方式添加自定义设置选项卡以管理WooCommerce中的产品数据

时间:2016-08-17 22:51:06

标签: php wordpress woocommerce product meta-boxes

我想以编程方式将设置选项卡添加到Product data metabox,如下所示:

enter image description here

“Verzendkosten”标签添加了萤火虫 (表示“运费”

如何在woocommerce编辑产品页面设置中以编程方式添加“Verzendkosten”自定义标签?

(我怎样才能用数据填充它?)

1 个答案:

答案 0 :(得分:6)

  

2017年11月更新:

     
      
  • 纠正了一些错误,清理并添加了可用选项
  •   
  • 最后为自定义字段标题添加了'使用''命名约定'
  •   

1)您在自定义帖子类型Metabox中创建自定义选项卡(此处为“产品”),2)然后您可以添加字段以填充此选项卡,使用不同类型的字段(您将找到一个每种类型,所以这是一个非常完整的例子)。

最后,您将找到一个在提交时保存数据的功能。

这是您可视化获得的(对于6种不同的自定义字段类型):

Custom metabox product tab

以下是相关代码:

// Step 1 - Adding a custom tab to the Products Metabox
add_filter( 'woocommerce_product_data_tabs', 'add_shipping_costs_product_data_tab', 99 , 1 );
function add_shipping_costs_product_data_tab( $product_data_tabs ) {
    $product_data_tabs['shipping-costs'] = array(
        'label' => __( 'Shipping costs', 'my_theme_domain' ), // translatable
        'target' => 'shipping_costs_product_data', // translatable
    );
    return $product_data_tabs;
}

// Step 2 - Adding and POPULATING (with data) custom fields in custom tab for Product Metabox
add_action( 'woocommerce_product_data_panels', 'add_shipping_costs_product_data_fields' );
function add_shipping_costs_product_data_fields() {
    global $post;

    $post_id = $post->ID;

    echo '<div id="shipping_costs_product_data" class="panel woocommerce_options_panel">';

    ## THE 6 DIFFERENT FIELD TYPES

    # 1. Text imput field
    woocommerce_wp_text_input( array(
        'id'            => '_imput_text',
        // 'name'         => '_imput_text', // (optional) for different ID attribute than name attribute
        // 'class'         => 'some-class', // (optional)
        // 'wrapper_class' => 'show_if_simple', // (optional) example here for simple products type only
        'placeholder'   => __( 'Enter some data', 'theme_domain' ), // (optional)
        'label'         => __( 'Imput text Label', 'theme_domain' ), // (optional)
        'description'   => __( 'Imput text  Description', 'theme_domain' ), // (optional)
        'desc_tip'      => true, // (optional) To show the description as a tip
        // 'data_type'     => '', // (optional formatting options) can be 'price', 'decimal', 'stock' or 'url'
        // 'type'          => '', // (optional additional custom attribute)
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    // 2. Textarea imput field
    woocommerce_wp_textarea_input( array(
        'id'            => '_input_textarea',
        // 'name'         => 'input_textarea', // (optional) for different ID attribute than name attribute
        'class'         => 'widefat', // (optional)
        // 'style'         => '' // (optional)
        // 'wrapper_class' => 'show_if_simple', // (optional) example here for simple products type only
        'placeholder'   => __( 'Enter some data', 'theme_domain' ), // (optional)
        'label'         => __( 'Imput textarea Label', 'theme_domain' ),
        'description'   => __( 'Imput textarea Description', 'theme_domain' ),
        'desc_tip'      => true, // (optional) To show the description as a tip
        // 'rows'          => 2, // (optional) defining number of rows
        // 'cols'          => 20, // (optional) defining number of columns
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    // 3. Checkbox field
    woocommerce_wp_checkbox( array(
        'id'            => '_input_checkbox',
        // 'name'         => 'input_checkbox', // (optional) for different ID attribute than name attribute
        // 'class'         => 'some-class', // (optional)
        // 'wrapper_class' => 'show_if_simple', // (optional) example here for simple products type only
        'label'         => __( 'Imput checkbox Label', 'theme_domain' ),
        'description'   => __( 'Imput checkbox Description', 'theme_domain' ),
        'desc_tip'      => true, // (optional) To show the description as a tip
        // 'cbvalue'       => 'yes', // to make it selected by default
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    // 4. Radio Buttons field
    woocommerce_wp_radio( array(
        'id'            => '_imput_radio',
        // 'name'          => 'input_radio', // (optional) for different ID attribute than name attribute
        // 'class'         => 'some-class', // (optional)
        // 'wrapper_class' => 'show_if_simple', // (optional) example here for simple products type only
        'label'         => __(' ', 'my_theme_domain'),
        'description'   => __( 'Imput Radio Description', 'my_theme_domain' ),
        'desc_tip'      => true,
        'options'       => array(
            'option_value_1'    => __('Displayed option 1'),
            'option_value_2'    => __('Displayed option 2'),
            'option_value_3'    => __('Displayed option 3'),
        ),
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    // 5. Select field
    woocommerce_wp_select( array(
        'id'                => '_select_field',
        // 'name'              => '_select_field', // (optional) for different ID attribute than name attribute
        // 'wrapper_class' => 'show_if_simple', // (optional) example here for simple products type only
        'label'         => __(' ', 'my_theme_domain'),
        'description'   => __( 'Imput Radio Description', 'my_theme_domain' ),
        'desc_tip'      => true,
        'options'       => array(
            ''               => __('Chose an option'), // Default empty value
            'option_value_1' => __('Displayed option 1'),
            'option_value_2' => __('Displayed option 2'),
            'option_value_3' => __('Displayed option 3')
        ),
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    // 6. Hidden imput field
    woocommerce_wp_hidden_input( array(
        'id'            => '_hidden_input',
        // 'name'              => '_hidden_input', // (optional) for different ID attribute than name attribute
        'class'         => 'some_class',
        // 'value'         => $value, // (optional) for a static value (can be conditionally set for $value variable)
    ) );

    echo '</div>';
}

// Step 3 - Saving custom fields data of custom products tab metabox
add_action( 'woocommerce_process_product_meta', 'shipping_costs_process_product_meta_fields_save' );
function shipping_costs_process_product_meta_fields_save( $post_id ){

    // save the text field data
    if( isset( $_POST['_imput_text'] ) )
        update_post_meta( $post_id, '_imput_text', esc_attr( $_POST['_imput_text'] ) );

    // save the textarea field data
    if( isset( $_POST['_imput_textarea'] ) )
        update_post_meta( $post_id, '_imput_textarea', esc_attr( $_POST['_imput_textarea'] ) );

    // save the checkbox field data
    if( isset( $_POST['_imput_checkbox'] ) )
        update_post_meta( $post_id, '_imput_checkbox', esc_attr( $_POST['_imput_checkbox'] ) );

    // save the radio button field data
    if( isset( $_POST['_input_radio'] ) )
        update_post_meta( $post_id, '_input_radio', esc_attr( $_POST['_input_radio'] ) );

    // save the selector field data
    if( isset( $_POST['_select_field'] ) )
        update_post_meta( $post_id, '_select_field', esc_attr( $_POST['_select_field'] ) );

    // save the hidden imput data
    if( isset( $_POST['_hidden_input'] ) )
        update_post_meta( $post_id, '_hidden_input', esc_attr( $_POST['_hidden_input'] ) );
}

当然这会出现在您的活动子主题(或主题)或任何插件文件的function.php文件中。

  

您必须在步骤2和3中使用相同的自定义字段ID (slug名称)

此代码经过测试且功能齐全

  

您可以使用任意数据添加自定义选项,使用自定义代码,自定义变量或任何类型的功能在步骤2

  

<强>用法

     

要获取或检索数据,您将使用get_post_meta()函数定义帖子ID

$custom_field_data = get_post_meta( $post_id, '_custom_field_slug', true );
     

其中:

     
      
  • $post_id 是当前的帖子ID(来自产品,订单,优惠券......后期类型)。
  •   
  • custom_field_slug 是自定义字段的ID(slug)。
  •   
  • true false:是否返回单个值(数据字符串或数组)
  •   
     

各种领域的过程相同

  

建议 - 自定义字段段名称(自定义字段ID)

     

如果您未在 slug名称的开头处使用下划线字符 _slug_name )自定义字段后,在提交数据 (更新按钮)后,自定义字段Metabox中的授权用户将可以访问这些字段。

     

请参阅此屏幕截图(此处为 input_text 自定义字段slug)

     

Custom fields metabox

参考文献: