Search code examples
phpwordpresswoocommercehook-woocommercewoocommerce-subscriptions

WooCommerce add admin custom field(s) to simple subscriptions


In WooCommerce, I have enabled WooCommerce Subscriptions plugin and it's working fine as per my expectations.

However, I have a one custom requirement from client. I want to add custom field(s) while creating a product in Variable Subscriptions and Simple Subscriptions.

I have added custom field(s) in Variable Subscriptions using below code and it's working as per my expectations. Here is my code.

<?php

// Showing fields for variable subscriptions 
add_action('woocommerce_product_after_variable_attributes', 'show_WC_Product_Variable_Subscription_Variation_Custom_Fields', 10, 3);

// Saving fields for variable subscriptions 
add_action('woocommerce_save_product_variation', 'save_WC_Product_Variable_Subscription_Variation_Custom_Fields', 10, 2);
    
function show_WC_Product_Variable_Subscription_Variation_Custom_Fields($loop, $variation_data, $variation) {
    woocommerce_wp_text_input(
        array(
            'id'            => "my_text_field{$loop}",
            'name'          => "my_text_field[{$loop}]",
            'value'         => get_post_meta($variation->ID, 'my_text_field', true),
            'label'         => __('Some label', 'woocommerce'),

        )
    );
}

function save_WC_Product_Variable_Subscription_Variation_Custom_Fields($variation_id, $loop) {

    if (empty($variation_id)) return;

    $text_field = $_POST['my_text_field'][$loop];
    update_post_meta($variation_id, 'my_text_field', esc_attr($text_field));
}

And here is how it looks like now working fine.

enter image description here

As you can see in screenshot above, the last field labeled as "Some label" .. my custom field added.

However, I want to add this same field which I set Simple Subscription. Here I mean.

enter image description here

As you can see, I want that same custom fields to show and save here as well ..

I have researched but yet not able to find any hook.

Can someone guide me please how can I achieve this.


Solution

  • Updated:

    To add a custom field to Admin product data settings > general tab on simple subscriptions:

    // Showing custom fields on admin product settings "general" tab
    add_action('woocommerce_product_options_general_product_data', 'add_admin_product_custom_fields', 10, 3);
    function add_admin_product_custom_fields() {
        global $post;
        
        echo '<div class="product_custom_field show_if_simple show_if_subscription">';
        
        woocommerce_wp_text_input( array(
            'id'            => 'my_text_field',
            'name'          => 'my_text_field',
            'label'         => __('Some label', 'woocommerce'),
        ) );
        
        echo '</div>';
    }
    
    // Saving custom fields values from admin product settings
    add_action('woocommerce_admin_process_product_object', 'save_admin_product_custom_fields_values');
    function save_admin_product_custom_fields_values( $product ) {
        if ( isset($_POST['my_text_field']) ) {
            $product->update_meta_data( 'my_text_field', sanitize_text_field($_POST['my_text_field']) );
        }
    }
    

    Code goes in functions.php file of the active child theme (or active theme). Tested and works.


    To display it on simple and variable subscriptions change:

    echo '<div class="product_custom_field show_if_simple show_if_subscription">';
    

    with:

    echo '<div class="product_custom_field">';
    

    Addition for a checkbox field:

    // Showing custom fields on admin product settings "general" tab
    add_action('woocommerce_product_options_general_product_data', 'add_admin_product_custom_checkbox_fields', 10, 3);
    function add_admin_product_custom_checkbox_fields() {
        global $post;
    
        echo '<div class="product_custom_field show_if_simple show_if_subscription">';
    
        echo '<p><strong>' . __("Mindesk e-Commerce", 'woocommerce') . '</strong></p>';
    
        $value = get_post_meta($post->ID, 'mindesk_analytics_opt_out', true);
    
        woocommerce_wp_checkbox(array(
            'id'            => "mindesk_analytics_opt_out",
            'name'          => "mindesk_analytics_opt_out",
            'wrapper_class' => 'show_if_simple',
            'label'         => __('&nbsp; Analytics', 'woocommerce'),
            'value'         => $value,
        ) );
    
        echo '</div>';
    }
    
    // Saving custom fields values from admin product settings
    add_action('woocommerce_admin_process_product_object', 'save_admin_product_custom_checkbox_fields_values');
    function save_admin_product_custom_checkbox_fields_values( $product ) {
        $value = isset($_POST['mindesk_analytics_opt_out']) ? 'yes' : 'no';
        $product->update_meta_data('mindesk_analytics_opt_out', esc_attr($value) );
    }
    

    Code goes in functions.php file of the active child theme (or active theme). Tested and works.