1. Home
  2. WC Vendors Pro
  3. How To
  4. Adding a Custom Field for Products

Adding a Custom Field for Products

Adding custom fields to the product edit form can be achieved in two ways.

  • Editing the template and inserting the form elements you need
  • Using Actions  (recommended option)

Field Examples

We have a complete form helper that provides a variety of different fields you can insert into your forms. Here are two example fields you can test.

Text Field

<?php 
WCVendors_Pro_Form_Helper::textarea( array(  
	'post_id'			=> $object_id, 
	'id' 				=> 'wcv_custom_product_ingredients', 
	'label' 			=> __( 'Ingredients', 'wcvendors-pro' ), 
	'placeholder' 		=> __( 'Ingredients', 'wcvendors-pro' ), 
	'desc_tip' 			=> 'true', 
	'description' 		=> __( 'The product ingredients', 'wcvendors-pro' ), 
) );
?>

Text Area

<?php 
WCVendors_Pro_Form_Helper::input( array(  
     'type'      => 'text',
     'post_id'   => $object_id, 
     'id'     => 'wcv_custom_product_ingredients', 
     'label'    => __( 'Ingredients', 'wcvendors-pro' ), 
     'placeholder'   => __( 'Ingredients', 'wcvendors-pro' ), 
     'desc_tip'    => 'true', 
     'description'   => __( 'The product ingredients', 'wcvendors-pro' ), 
) );
?>

Editing the template

This code will add a custom field to WC Vendor Pro’s add/edit form. Copy the template /plugins/wc-vendors-pro/templates/dashboard/product-edit.php to /themes/your-theme/wc-vendors/dashboard/product-edit.php and then add this code, including the opening/closing PHP tags anywhere on the form you want your custom field to be entered.

The sample code below will add a field called “Ingredients” with a text area to input the custom field. The field is then saved as “wcv_custom_product_ingredients” and will show up on the product page in the custom fields meta box.

You can change the wcv_custom_product_ingredients to be anything you like, as long as the meta key starts with wcv_custom _product or _wcv_custom_product_ — If you don’t start the meta key with that, it will be ignored. If the meta key has an underscore _ before it, it will be hidden on the product page in wp-admin, no underscore it will be shown in the Custom Fields meta box.

The code below goes in your product-edit.php template as outlined in the WCVendors Pro Setup Guide and you can override the template using the following guide: changing vendor templates. 

You need to know where you want the field to be displayed. We have commented the template file so you can see the different tabs

  • general
  • inventory
  • shipping
  • upsells and cross-sells (not recommended)
  • attributes (not recommended)
  • variations (not recommended)
  • product SEO

The following example will put the ingredients text area as the last field on the General Tab

<?php
/**
 * The template for displaying the Product edit form
 *
 * Override this template by copying it to yourtheme/wc-vendors/dashboard/
 *
 * @package    WCVendors_Pro
 * @version    1.6.3
 */

/**
 *   DO NOT EDIT ANY OF THE LINES BELOW UNLESS YOU KNOW WHAT YOU'RE DOING
 */

$title      = ( is_numeric( $object_id ) ) ? __( 'Save Changes', 'wcvendors-pro' ) : __( 'Add Product', 'wcvendors-pro' );
$page_title = ( is_numeric( $object_id ) ) ? __( 'Edit Product', 'wcvendors-pro' ) : __( 'Add Product', 'wcvendors-pro' );
$product    = ( is_numeric( $object_id ) ) ? wc_get_product( $object_id ) : null;
$post       = ( is_numeric( $object_id ) ) ? get_post( $object_id ) : null;

// Get basic information for the product
$product_title             = ( isset( $product ) && null !== $product ) ? $product->get_title() : '';
$product_description       = ( isset( $product ) && null !== $product ) ? $post->post_content : '';
$product_short_description = ( isset( $product ) && null !== $product ) ? $post->post_excerpt : '';
$post_status               = ( isset( $product ) && null !== $product ) ? $post->post_status : '';

/**
 *  Ok, You can edit the template below but be careful!
 */
?>

<h2><?php echo $page_title; ?></h2>

<?php do_action( 'wcvendors_before_product_form' ); ?>

<!-- Product Edit Form -->
<form method="post" action="" id="wcv-product-edit" class="wcv-form">

	<!-- Basic Product Details -->
	<div class="wcv-product-basic wcv-product">
		<?php do_action( 'wcv_before_product_details', $object_id ); ?>
		<!-- Product Title -->
		<?php WCVendors_Pro_Product_Form::title( $object_id, $product_title ); ?>
		<!-- Product Description -->
		<?php WCVendors_Pro_Product_Form::description( $object_id, $product_description ); ?>
		<!-- Product Short Description -->
		<?php WCVendors_Pro_Product_Form::short_description( $object_id, $product_short_description ); ?>
		<!-- Product Categories -->
		<?php WCVendors_Pro_Product_Form::categories( $object_id ); ?>
		<!-- Product Tags -->
		<?php WCVendors_Pro_Product_Form::tags( $object_id, true ); ?>
		<?php do_action( 'wcv_after_product_details', $object_id ); ?>
	</div>

	<div class="all-100">
		<?php do_action( 'wcv_before_product_media', $object_id ); ?>
		<!-- Media uploader -->
		<div class="wcv-product-media">
			<?php do_action( 'wcv_before_media', $object_id ); ?>
			<?php WCVendors_Pro_Form_helper::product_media_uploader( $object_id ); ?>
			<?php do_action( 'wcv_after_media', $object_id ); ?>

		</div>
		<?php do_action( 'wcv_after_product_media', $object_id ); ?>
	</div>

	<hr/>

	<div class="all-100">
		<?php do_action( 'wcv_before_product_type', $object_id ); ?>
		<!-- Product Type -->
		<div class="wcv-product-type">
			<?php WCVendors_Pro_Product_Form::product_type( $object_id ); ?>
		</div>
		<?php do_action( 'wcv_after_product_type', $object_id ); ?>
	</div>

	<div class="all-100">
		<div class="wcv-tabs top" data-prevent-url-change="true">

			<?php do_action( 'wcv_before_product_meta_tabs', $object_id ); ?>

			<?php WCVendors_Pro_Product_Form::product_meta_tabs(); ?>

			<?php do_action( 'wcv_before_general_tab', $object_id ); ?>

			<!-- General Product Options -->
			<div class="wcv-product-general tabs-content" id="general">

				<div class="hide_if_grouped">
					<!-- SKU  -->
					<?php WCVendors_Pro_Product_Form::sku( $object_id ); ?>
					<!-- Private listing  -->
					<?php WCVendors_Pro_Product_Form::private_listing( $object_id ); ?>
				</div>


				<div class="options_group show_if_external">
					<?php WCVendors_Pro_Product_Form::external_url( $object_id ); ?>
					<?php WCVendors_Pro_Product_Form::button_text( $object_id ); ?>
				</div>

				<div class="show_if_simple show_if_external">
					<!-- Price and Sale Price -->
					<?php WCVendors_Pro_Product_Form::prices( $object_id ); ?>
				</div>

				<div class="show_if_simple show_if_external show_if_variable">
					<!-- Tax -->
					<?php WCVendors_Pro_Product_Form::tax( $object_id ); ?>
				</div>

				<div class="show_if_downloadable" id="files_download">
					<!-- Downloadable files -->
					<?php WCVendors_Pro_Product_Form::download_files( $object_id ); ?>
					<!-- Download Limit -->
					<?php WCVendors_Pro_Product_Form::download_limit( $object_id ); ?>
					<!-- Download Expiry -->
					<?php WCVendors_Pro_Product_Form::download_expiry( $object_id ); ?>
					<!-- Download Type -->
					<?php WCVendors_Pro_Product_Form::download_type( $object_id ); ?>
				</div>

				<?php
					WCVendors_Pro_Form_Helper::textarea( array(  
				      'post_id'			=> $object_id,
				      'id' 				=> 'wcv_custom_product_ingredients',
				      'label' 			=> __( 'Ingredients', 'wcvendors-pro' ),
				      'placeholder' 		=> __( 'Ingredients', 'wcvendors-pro' ),
				      'desc_tip' 			=> 'true',
				      'description' 		=> __( 'The product ingredients', 'wcvendors-pro' ),
				    ) );
    			?>

				<?php do_action( 'wcv_product_options_general_product_data', $object_id ); ?>

			</div>

			<?php do_action( 'wcv_after_general_tab', $object_id ); ?>

			<?php do_action( 'wcv_before_inventory_tab', $object_id ); ?>

			<!-- Inventory -->
			<div class="wcv-product-inventory inventory_product_data tabs-content" id="inventory">

				<?php WCVendors_Pro_Product_Form::manage_stock( $object_id ); ?>

				<?php do_action( 'wcv_product_options_stock', $object_id ); ?>

				<div class="stock_fields show_if_simple show_if_variable">
					<?php WCVendors_Pro_Product_Form::stock_qty( $object_id ); ?>
					<?php WCVendors_Pro_Product_Form::backorders( $object_id ); ?>
					<?php WCVendors_Pro_Product_Form::low_stock_threshold( $object_id ); ?>
				</div>

				<?php WCVendors_Pro_Product_Form::stock_status( $object_id ); ?>
				<div class="options_group show_if_simple show_if_variable">
					<?php WCVendors_Pro_Product_Form::sold_individually( $object_id ); ?>
				</div>

				<?php do_action( 'wcv_product_options_sold_individually', $object_id ); ?>

				<?php do_action( 'wcv_product_options_inventory_product_data', $object_id ); ?>

			</div>

			<?php do_action( 'wcv_after_inventory_tab', $object_id ); ?>

			<?php do_action( 'wcv_before_shipping_tab', $object_id ); ?>

			<!-- Shipping  -->
			<div class="wcv-product-shipping shipping_product_data tabs-content" id="shipping">

				<div class="hide_if_grouped hide_if_external">

					<!-- Shipping rates  -->
					<?php WCVendors_Pro_Product_Form::shipping_rates( $object_id ); ?>
					<!-- weight  -->
					<?php WCVendors_Pro_Product_Form::weight( $object_id ); ?>
					<!-- Dimensions -->
					<?php WCVendors_Pro_Product_Form::dimensions( $object_id ); ?>

					<?php do_action( 'wcv_product_options_dimensions', $object_id ); ?>
					<!-- shipping class -->
					<?php WCVendors_Pro_Product_Form::shipping_class( $object_id ); ?>

					<?php do_action( 'wcv_product_options_shipping', $object_id ); ?>

					<?php do_action( 'wcv_product_options_shipping_data_panel', $object_id ); ?>
				</div>

			</div>

			<?php do_action( 'wcv_after_shipping_tab', $object_id ); ?>

			<?php do_action( 'wcv_before_linked_tab', $object_id ); ?>

			<!-- Upsells and grouping -->
			<div class="wcv-product-upsells tabs-content" id="linked_product">

				<div class="show_if_grouped hide_if_external">
					<?php WCVendors_Pro_Product_Form::grouped_products( $object_id, $product ); ?>
				</div>

				<?php WCVendors_Pro_Product_Form::up_sells( $object_id ); ?>

				<div class="hide_if_grouped hide_if_external">
					<?php WCVendors_Pro_Product_Form::crosssells( $object_id ); ?>
				</div>


				<?php do_action( 'wcv_product_options_upsells_product_data' ); ?>
			</div>

			<?php do_action( 'wcv_after_linked_tab', $object_id ); ?>

			<!-- Attributes -->

			<?php do_action( 'wcv_before_attributes_tab', $object_id ); ?>

			<div class="wcv_product_attributes tabs-content" id="attributes">

				<div class="attributes-validation-error"></div>

				<?php WCVendors_Pro_Product_Form::product_attributes( $object_id ); ?>

				<?php do_action( 'wcv_product_options_attributes_product_data', $object_id ); ?>

			</div>

			<?php do_action( 'wcv_after_attributes_tab', $object_id ); ?>

			<!-- Variations -->

			<?php do_action( 'wcv_before_variations_tab', $object_id ); ?>

			<div class="wcv_product_variations tabs-content" id="variations">

				<?php WCVendors_Pro_Product_Form::product_variations( $object_id ); ?>

				<?php do_action( 'wcv_product_options_variations_product_data', $object_id ); ?>

			</div>

			<?php do_action( 'wcv_after_variations_tab', $object_id ); ?>

			<!-- Product SEO -->

			<?php do_action( 'wcv_before_seo_tab', $object_id ); ?>

			<div class="wcv_product_seo tabs-content" id="seo">

				<?php WCVendors_Pro_Product_Form::product_seo( $object_id ); ?>

				<?php do_action( 'wcv_product_seo_data' ); ?>

			</div>

			<?php do_action( 'wcv-after_seo_tab', $object_id ); ?>

			<?php WCVendors_Pro_Product_Form::form_data( $object_id, $post_status ); ?>
			<?php WCVendors_Pro_Product_Form::save_button( $title ); ?>
			<?php WCVendors_Pro_Product_Form::draft_button( __( 'Save Draft', 'wcvendors-pro' ) ); ?>

			<?php do_action( 'wcv_after_product_meta_tabs', $object_id ); ?>
		</div>
	</div>
</form>

<?php do_action( 'wcvendors_after_product_form' ); ?>

Using Actions

The other options which do not require you to edit the template at all and instead hook into the template and output it. This is our recommended option as it ensures that you no longer have to keep your template overrides up to date and is completely upgrade safe.

We have actions for before and after every single field as outlined in our form helper help document under Actions. However here are the ones that are defined within the template itself that will add the field to the end of that tab

  • General Tab – wcv_product_options_general_product_data
  • Inventory Tab – wcv_product_options_inventory_product_data
  • Shipping Tab – wcv_product_options_shipping_data_panel
  • Upsells & grouping Tab – wcv_product_options_upsells_product_data
  • Attributes Tab – wcv_product_options_attributes_product_data
  • Variations Tab – wcv_product_options_variations_product_data
  • Product SEO Tab – wcv_product_seo_data

This example will output the ingredients text area as the last item on the General Tab

// Output the custom ingredients as the last option on the general tab.
add_action( 'wcv_product_options_general_product_data', 'wcv_product_ingredients' );
function wcv_product_ingredients( $object_id ){
     WCVendors_Pro_Form_Helper::textarea( array(
      'post_id'			=> $object_id,
      'id' 				=> 'wcv_custom_product_ingredients',
      'label' 			=> __( 'Ingredients', 'wcvendors-pro' ),
      'placeholder' 		=> __( 'Ingredients', 'wcvendors-pro' ),
      'desc_tip' 			=> 'true',
      'description' 		=> __( 'The product ingredients', 'wcvendors-pro' ),
    ) );
}

Display Custom Field on Single Product Page

This code will display the values on the single product page. Add this code to your theme’s functions.php file:

add_action('woocommerce_product_meta_start', 'wcv_ingredients', 2);
function wcv_ingredients() {
    $output = get_post_meta( get_the_ID(), 'wcv_custom_product_ingredients', true ); // Change wcv_custom_product_ingredients to your meta key
    echo 'Ingredients: ' . $output . '<br>';
}
Please Note

A list of available field types can be found in the Form Helper documentation

actions

Updated on December 1, 2019

Was this article helpful?