简体   繁体   English

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

[英]Adding programmatically a custom settings tab to admin product data in WooCommerce

I want to programmatically add a settings tab to Product data metabox like this:我想以编程方式将设置选项卡添加到产品数据元框,如下所示:

在此处输入图片说明

The "Verzendkosten" tab was added with firebug (which means "Shipping costs) . “Verzendkosten”标签添加了萤火虫(意思是“运费)

How would I programmatically add the "Verzendkosten" custom tab in woocommerce edit-product pages settings?我将如何在 woocommerce 编辑产品页面设置中以编程方式添加“Verzendkosten”自定义选项卡?

(and How would I be abled to populate it with data?) (以及我如何能够用数据填充它?)

Updated on November 2017: 2017 年 11 月更新:

  • Corrected some mistakes, cleaned and added available options更正了一些错误,清理并添加了可用选项
  • Added 'Usage' and 'naming conventions' for custom fields slugs, at the end.最后为自定义字段 slug 添加了“用法”“命名约定”

1) You create a custom tab in the custom post type Metabox (Here for "product"), 1)您在自定义帖子类型Metabox(此处为“产品”)中创建自定义选项卡,
2) then you can add fields to populate this tab, with different kind of fields (You will find one of each type, so this is a very complete example). 2)然后您可以添加字段来填充此选项卡,使用不同类型的字段(您会发现每种类型中的一个,所以这是一个非常完整的示例)。

And finally you will find a function that save the data when submitted.最后你会发现一个在提交时保存数据的功能。

Here it is what you will get visually (for the 6 different custom fields types):这是您将获得的视觉效果(对于 6 种不同的自定义字段类型):

自定义元盒产品选项卡

Here is the related code:下面是相关代码:

// 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 input field
    woocommerce_wp_text_input( array(
        'id'            => '_input_text',
        // 'name'         => '_input_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'         => __( 'input text Label', 'theme_domain' ), // (optional)
        'description'   => __( 'input 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 input 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'         => __( 'input textarea Label', 'theme_domain' ),
        'description'   => __( 'input 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'         => __( 'input checkbox Label', 'theme_domain' ),
        'description'   => __( 'input 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'            => '_input_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'   => __( 'input 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'   => __( 'input 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 input 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['_input_text'] ) )
        update_post_meta( $post_id, '_input_text', esc_attr( $_POST['_input_text'] ) );

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

    // save the checkbox field data
    if( isset( $_POST['_input_checkbox'] ) )
        update_post_meta( $post_id, '_input_checkbox', esc_attr( $_POST['_input_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 input data
    if( isset( $_POST['_hidden_input'] ) )
        update_post_meta( $post_id, '_hidden_input', esc_attr( $_POST['_hidden_input'] ) );
}

Naturally this goes on function.php file of your active child theme (or theme) or in any plugin file.当然,这会在您的活动子主题(或主题)或任何插件文件的 function.php 文件中进行。

You have to use the same custom field ID (slug names) in Step 2 and 3.您必须在第 2 步和第 3 步中使用相同的自定义字段 ID (slug 名称)

This code is tested and fully functional此代码经过测试且功能齐全

You can add custom options with ANY DATA, using custom code, custom variables, or any kind of functions in Step 2 .您可以使用任何数据添加自定义选项,使用自定义代码、自定义变量或步骤 2 中的任何类型的函数。


Usage用法

To get or retrieve the data you will use get_post_meta() function for a defined Post ID :要获取或检索数据,您将对定义的Post ID使用get_post_meta()函数:

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

Where:哪里:

  • $post_id is the current post ID (from product, order, coupon… post-types). $post_id是当前的帖子 ID(来自产品、订单、优惠券……帖子类型)。
  • custom_field_slug is the ID (the slug) of your custom field. custom_field_slug是您的自定义字段的 ID(slug)。
  • true or false : Whether to return a single value (data string or arrays) truefalse :是否返回单个值(数据字符串或数组)

It's the same process each kind of fields每种字段都是相同的过程


Advice - Custom field slug names (Custom field ID)建议 - 自定义字段段名称(自定义字段 ID)

If you don't use an underscore character ( _slug_name ) at the beginning of the slug names of your custom fields , they will appear and be accessible to authorized users in the custom fields Metabox, after submitting the data (Update button) .如果您不在自定义字段slug 名称开头使用下划线字符( _slug_name ) ,则在提交数据(更新按钮)自定义字段 Metabox中的授权用户将显示这些名称并可供授权用户访问。

See this screen shot (here we get input_text custom field slug) :看到这个屏幕截图(在这里我们得到input_text自定义字段 slug)

自定义字段元框


References:参考资料:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM