Mastering WooCommerce Actions and Filters

Yojance Rabelo

The use of WooCommerce, along with WordPress, to create eCommerce websites is on the rise. If you are a Web Developer like me, knowing the ins and out of the WooCommerce template system, along with it’s actions and filters is a very nice skill to have. Just think how happy your boss would be if you knew everything there is to know about WooCommerce, or at least enough to be able to implement anything with very little help, just you and the WooCommerce documentation.

If all this sounds good to you, continue reading and we’ll explore what can be done with WordPress and WooCommerce working side-by-side. The style of this article (and hopefully many more to come) will include presenting you with a problem and then coming up with a solution using WordPress and WooCommerce actions and filters.

Useful Actions For Account Creation and Updating

It’s very common to use a CRM along with your eCommerce website. WooCommerce makes it simple for us to detect when a new customer or user registers during the Checkout process or via the ‘My Account’ page.

The following example should give you an idea of how to create an account on Salesforce when someone registers through WooCommerce. Note that the Salesforce API code is not shown; I’m just outlining the process.

// Create Customer's Salesforce Account
add_action( 'woocommerce_created_customer', 'create_salesforce_account', 10, 3 );
function create_salesforce_account( $customer_id, $new_customer_data, $password_generated ) {

	// Get the New Customer's data
	$username   = $new_customer_data['user_login'];
	$password   = $new_customer_data['user_pass'];
	$email      = $new_customer_data['user_email'];
	$role       = $new_customer_data['role'];

	// Getting the rest of the info for this customer
	$user = get_user_by( 'id', $customer_id );

	// Continue and send the information to Salesforce now

Continuing on from our previous example, it’s only natural that you would want to update the customer’s information on Salesforce when the customer edits either the Billing or Shipping Address. woocommerce_customer_save_address runs immediately after either address has been edited and it gives the User ID and which address was edited. Note that you can also get any of the form fields via $_POST.

// Update Salesforce account with new shipping information
add_action( 'woocommerce_customer_save_address', 'update_salesforce_account', 10, 2 );
function update_salesforce_account( $user_id, $load_address ) {

	// Let's use a Switch statement to know which address we are updating
	switch ( $load_address ) {
		case 'billing':
			// Send billing info to Salesforce

		case 'shipping':
			// Send shipping info to Salesforce

Overriding Front-End Titles, Messages And Descriptions

Section titles, messages and descriptions can easily be changed if you know what filter to use. These filters allow you to customize what’s displayed to the customer down to the last detail. Did you notice I’m saying filters and not actions? That’s because WooCommerce doesn’t use actions for overriding these kinds of values, just like WordPress does.

WooCommerce checkout coupon message

woocommerce_checkout_coupon_message displays only if coupons are enabled on your store, and while you are in the checkout page it asks you for a coupon code. For example: Have a coupon? Click here to enter your code.

WooCommerce checkout login message

woocommerce_checkout_login_message displays on the checkout page when the cart detects that you are not logged in and it gives you the option to sign-in. For example: Returning customer? Click here to login.

WooCommerce lost password message

woocommerce_lost_password_message displays under the ‘My Account’ page where it instructs you to enter your username or email in order to reset your password. For example: Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.

WooCommerce my account my address title

woocommerce_my_account_my_address_title displays on the ‘My Account’ page and by default it can have one of two titles. Its modified slightly from ‘My Addresses’ to ‘My Address’ when you have set-up to ship only to the billing address so there is only a need for one of them. For example: My Addresses or My Address.

WooCommerce my account my address description

woocommerce_my_account_my_address_description displays right below the Address Title, giving you a brief explanation of what the address(es) will be used for. For example: The following addresses will be used on the checkout page by default.

WooCommerce my account my downloads title

woocommerce_my_account_my_downloads_title displays on the ‘My Account’ page and sets the title for the downloads section. For example: Available downloads.

WooCommerce my account my orders title

woocommerce_my_account_my_orders_title displays on the ‘My Account’ page and sets the title for the Orders section. For example: Recent Orders.

There are quite a few of these and the usage is almost identical with the exception of names, of course. Here are some examples on how to change them.

add_filter( 'woocommerce_checkout_coupon_message',              'override_checkout_coupon_message', 10, 1 );
function override_checkout_coupon_message( $message ) {
    return __( 'Have a coupon for our store?', 'spyr' ) . ' <a href="#" class="showcoupon">' . __( 'Click here to enter it', 'spyr' ) . '</a>';

add_filter( 'woocommerce_checkout_login_message',               'override_checkout_login_message',  10, 1 );
function override_checkout_login_message( $message ) {
    return __('Already have an account with us?', 'spyr' );

add_filter( 'woocommerce_lost_password_message',                'override_lost_password_message',   10, 1 );
function override_lost_password_message( $message ) {
    return  __( 'Lost your password? Please enter your username or email address.', 'spyr' );

add_filter( 'woocommerce_my_account_my_address_title',          'override_my_address_title',        10, 1 );
function override_my_address_title( $title ) {
    return __( 'Your Address', 'spyr' );
add_filter( 'woocommerce_my_account_my_address_description',    'override_my_address_description',  10, 1 );
function override_my_address_description( $description ) {
    return __( 'The following addresses will be used on the checkout.', 'spyr' );
add_filter( 'woocommerce_my_account_my_downloads_title',        'override_my_downloads_title',      10, 1 );
function override_my_downloads_title( $title ) {
    return __( 'Your Downloads', 'spyr' );
add_filter( 'woocommerce_my_account_my_orders_title',           'override_my_orders_title',         10, 1 );
function override_my_orders_title( $title ) {
    return __( 'Your Most Recent Orders', 'spyr' );

That’s it for now. We’ve only begun to explore what’s under the hood of WooCommerce and as we progress through a series of articles, we are going to be building more complex modules that will rely heavily on using WooCommerce’s and WordPress’ hooks system to produce whatever we set our minds to do.

In the next article, we will work on a real world case scenario where you might want to give a free product with any purchase that meets a certain criteria among other items of interest.