How to Reorder WooCommerce Product Page Elements Without a Plugin

Rearrange WooCommerce product prices, descriptions, and add-to-cart buttons in classic product templates using PHP hooks, without installing a plugin.

Last updated:

Reviewed for accuracy by Jesse Nickles

Check which product template you use

The PHP method below works with WooCommerce's classic single-product template, including classic themes such as HoverCraft. If your product page uses a block-based Single Product template, use the Site Editor to move the relevant blocks instead. WooCommerce's product page customization instructions explain that approach.

In a classic template, WooCommerce runs an action hook named woocommerce_single_product_summary. Functions called callbacks attach to this hook at numbered priorities. Smaller numbers generally run earlier, so you can change the display order by removing a callback from its original priority and adding it back at another. See the hook reference for the underlying action.

Default order in the product summary

ElementCallbackPriority
Product titlewoocommerce_template_single_title5
Ratingwoocommerce_template_single_rating10
Pricewoocommerce_template_single_price10
Short descriptionwoocommerce_template_single_excerpt20
Add-to-cart controlswoocommerce_template_single_add_to_cart30
SKU and product metadatawoocommerce_template_single_meta40

WooCommerce's classic product template lists these default callbacks. Rating and price both use priority 10, so their relative order also depends on callback registration order. A theme or extension may change these positions.

Move the price below the short description

  1. Back up your site and test on staging before changing PHP.
  2. Open the active child theme's functions.php. A site-specific plugin is an optional alternative if you want to keep custom PHP outside the theme; no extra plugin is required. Do not edit the parent theme because updates may overwrite your change. HoverCraft users can follow the Child Themes documentation.
  3. Add this snippet inside the existing PHP code, without adding another <?php tag. Replace myshop with a prefix unique to your site.
  4. Save, then preview several products, including a variable product.
function myshop_move_product_price() {
	if ( ! function_exists( 'is_product' ) || ! is_product() ) {
		return;
	}

	remove_action(
		'woocommerce_single_product_summary',
		'woocommerce_template_single_price',
		10
	);
	add_action(
		'woocommerce_single_product_summary',
		'woocommerce_template_single_price',
		25
	);
}
add_action( 'wp', 'myshop_move_product_price' );

The wp action runs after WordPress has set up the current request, when the is_product() check can identify a single product page. The snippet removes the price callback at priority 10 and adds it at 25: after the short description (20) but before the add-to-cart controls (30). It changes the displayed position, not the product's stored price or cart calculation.

Move a different summary element

Use the same remove_action() and add_action() pattern, substituting the exact callback name and original priority from the table. For example, moving the short description to priority 35 would place it after the default add-to-cart controls and before product metadata. Change both the callback name and the original priority in the snippet, not only the new priority. Choose a distinct priority when you want a predictable position relative to other elements.

This method rearranges callbacks within the classic summary container. It does not move the product gallery, change the underlying HTML layout, or guarantee that a custom theme or extension will honor WooCommerce's default placements. For custom notices below purchase controls, HoverCraft also provides an After Add To Cart widget area; see Widget Areas before adding PHP solely for a notice.

If the elements do not move

To undo this customization, remove the entire added snippet. WooCommerce's original callback registration will then determine the price position again, unless another customization changes it.