Adding custom field to product category Adding custom field to product category wordpress wordpress

Adding custom field to product category


You can add custom fields to WooCommerce product category by using following action :

  • product_cat_add_form_fields
  • product_cat_edit_form_fields
  • edited_product_cat
  • create_product_cat

UPDATED on 17-Feb-2017###For WP version 4.4 and above.
As of WordPress 4.4, update_term_meta() and get_term_meta() functions have been added. This means that now we don't have to save the data in wp_options table anymore, rather they are now stored in wp_termmeta table.

Here is my updated code.

//Product Cat Create pagefunction wh_taxonomy_add_new_meta_field() {    ?>            <div class="form-field">        <label for="wh_meta_title"><?php _e('Meta Title', 'wh'); ?></label>        <input type="text" name="wh_meta_title" id="wh_meta_title">        <p class="description"><?php _e('Enter a meta title, <= 60 character', 'wh'); ?></p>    </div>    <div class="form-field">        <label for="wh_meta_desc"><?php _e('Meta Description', 'wh'); ?></label>        <textarea name="wh_meta_desc" id="wh_meta_desc"></textarea>        <p class="description"><?php _e('Enter a meta description, <= 160 character', 'wh'); ?></p>    </div>    <?php}//Product Cat Edit pagefunction wh_taxonomy_edit_meta_field($term) {    //getting term ID    $term_id = $term->term_id;    // retrieve the existing value(s) for this meta field.    $wh_meta_title = get_term_meta($term_id, 'wh_meta_title', true);    $wh_meta_desc = get_term_meta($term_id, 'wh_meta_desc', true);    ?>    <tr class="form-field">        <th scope="row" valign="top"><label for="wh_meta_title"><?php _e('Meta Title', 'wh'); ?></label></th>        <td>            <input type="text" name="wh_meta_title" id="wh_meta_title" value="<?php echo esc_attr($wh_meta_title) ? esc_attr($wh_meta_title) : ''; ?>">            <p class="description"><?php _e('Enter a meta title, <= 60 character', 'wh'); ?></p>        </td>    </tr>    <tr class="form-field">        <th scope="row" valign="top"><label for="wh_meta_desc"><?php _e('Meta Description', 'wh'); ?></label></th>        <td>            <textarea name="wh_meta_desc" id="wh_meta_desc"><?php echo esc_attr($wh_meta_desc) ? esc_attr($wh_meta_desc) : ''; ?></textarea>            <p class="description"><?php _e('Enter a meta description', 'wh'); ?></p>        </td>    </tr>    <?php}add_action('product_cat_add_form_fields', 'wh_taxonomy_add_new_meta_field', 10, 1);add_action('product_cat_edit_form_fields', 'wh_taxonomy_edit_meta_field', 10, 1);// Save extra taxonomy fields callback function.function wh_save_taxonomy_custom_meta($term_id) {    $wh_meta_title = filter_input(INPUT_POST, 'wh_meta_title');    $wh_meta_desc = filter_input(INPUT_POST, 'wh_meta_desc');    update_term_meta($term_id, 'wh_meta_title', $wh_meta_title);    update_term_meta($term_id, 'wh_meta_desc', $wh_meta_desc);}add_action('edited_product_cat', 'wh_save_taxonomy_custom_meta', 10, 1);add_action('create_product_cat', 'wh_save_taxonomy_custom_meta', 10, 1);

USAGE, to retrive data:

echo $productCatMetaTitle = get_term_meta($term_id, 'wh_meta_title', true);echo $productCatMetaDesc = get_term_meta($term_id, 'wh_meta_desc', true);

###For WP version below `4.4`.

Here is the code

//Product Cat creation pagefunction text_domain_taxonomy_add_new_meta_field() {    ?>    <div class="form-field">        <label for="term_meta[wh_meta_title]"><?php _e('Meta Title', 'text_domain'); ?></label>        <input type="text" name="term_meta[wh_meta_title]" id="term_meta[wh_meta_title]">        <p class="description"><?php _e('Enter a meta title, <= 60 character', 'text_domain'); ?></p>    </div>    <div class="form-field">        <label for="term_meta[wh_meta_desc]"><?php _e('Meta Description', 'text_domain'); ?></label>        <textarea name="term_meta[wh_meta_desc]" id="term_meta[wh_meta_desc]"></textarea>        <p class="description"><?php _e('Enter a meta description, <= 160 character', 'text_domain'); ?></p>    </div>    <?php}add_action('product_cat_add_form_fields', 'text_domain_taxonomy_add_new_meta_field', 10, 2);//Product Cat Edit pagefunction text_domain_taxonomy_edit_meta_field($term) {    //getting term ID    $term_id = $term->term_id;    // retrieve the existing value(s) for this meta field. This returns an array    $term_meta = get_option("taxonomy_" . $term_id);    ?>    <tr class="form-field">        <th scope="row" valign="top"><label for="term_meta[wh_meta_title]"><?php _e('Meta Title', 'text_domain'); ?></label></th>        <td>            <input type="text" name="term_meta[wh_meta_title]" id="term_meta[wh_meta_title]" value="<?php echo esc_attr($term_meta['wh_meta_title']) ? esc_attr($term_meta['wh_meta_title']) : ''; ?>">            <p class="description"><?php _e('Enter a meta title, <= 60 character', 'text_domain'); ?></p>        </td>    </tr>    <tr class="form-field">        <th scope="row" valign="top"><label for="term_meta[wh_meta_desc]"><?php _e('Meta Description', 'text_domain'); ?></label></th>        <td>            <textarea name="term_meta[wh_meta_desc]" id="term_meta[wh_meta_desc]"><?php echo esc_attr($term_meta['wh_meta_desc']) ? esc_attr($term_meta['wh_meta_title']) : ''; ?></textarea>            <p class="description"><?php _e('Enter a meta description', 'text_domain'); ?></p>        </td>    </tr>    <?php}add_action('product_cat_edit_form_fields', 'text_domain_taxonomy_edit_meta_field', 10, 2);// Save extra taxonomy fields callback function.function save_taxonomy_custom_meta($term_id) {    if (isset($_POST['term_meta'])) {        $term_meta = get_option("taxonomy_" . $term_id);        $cat_keys = array_keys($_POST['term_meta']);        foreach ($cat_keys as $key) {            if (isset($_POST['term_meta'][$key])) {                $term_meta[$key] = $_POST['term_meta'][$key];            }        }        // Save the option array.        update_option("taxonomy_" . $term_id, $term_meta);    }}add_action('edited_product_cat', 'save_taxonomy_custom_meta', 10, 2);add_action('create_product_cat', 'save_taxonomy_custom_meta', 10, 2);

USAGE, to retrive data:

$metaArray = get_option('taxonomy_' . $term_id);echo $productCatMetaTitle = $metaArray['wh_meta_title'];echo $productCatMetaDesc = $metaArray['wh_meta_desc'];    

This code goes in function.php file of your active child theme (or theme) or also in any plugin file.

All code is tested, and fully functional.


Reference

Official Doc:


Starting Wordpress 4.4 you should consider waiting for an upgrade of Woocommerce or starting feeding manually the new wp_termmeta table.

https://core.trac.wordpress.org/ticket/10142


There is an issue on code for WP version 4.4 and above.

When you change anything (f.e. url slug or name) on category list admin page the custom field value changes to empty string.

I added saving function for editing which does not execute on category edit admin page:

// Save extra taxonomy fields callback function - create.function wh_save_taxonomy_custom_meta_create($term_id) {$wh_meta_title = filter_input(INPUT_POST, 'wh_meta_title');$wh_meta_desc = filter_input(INPUT_POST, 'wh_meta_desc');update_term_meta($term_id, 'wh_meta_title', $wh_meta_title);update_term_meta($term_id, 'wh_meta_desc', $wh_meta_desc);}// Save extra taxonomy fields callback function - edit.function wh_save_taxonomy_custom_meta($term_id) {    $screen = get_current_screen();    if ( $screen->id != 'edit-product_cat' )            return; // exit if incorrect screen id$wh_meta_title = filter_input(INPUT_POST, 'wh_meta_title');$wh_meta_desc = filter_input(INPUT_POST, 'wh_meta_desc');update_term_meta($term_id, 'wh_meta_title', $wh_meta_title);update_term_meta($term_id, 'wh_meta_desc', $wh_meta_desc);}add_action('edited_product_cat', 'wh_save_taxonomy_custom_meta', 10, 1);add_action('create_product_cat', 'wh_save_taxonomy_custom_meta_create', 10, 1);