PHPackages                             tombroucke/otomaties-woocommerce-extra-checkout-steps - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. tombroucke/otomaties-woocommerce-extra-checkout-steps

ActiveWordpress-plugin

tombroucke/otomaties-woocommerce-extra-checkout-steps
=====================================================

1.0.2(9mo ago)161PHPCI failing

Since Feb 14Pushed 9mo ago1 watchersCompare

[ Source](https://github.com/tombroucke/otomaties-woocommerce-extra-checkout-steps)[ Packagist](https://packagist.org/packages/tombroucke/otomaties-woocommerce-extra-checkout-steps)[ RSS](/packages/tombroucke-otomaties-woocommerce-extra-checkout-steps/feed)WikiDiscussions main Synced yesterday

READMEChangelogDependencies (4)Versions (4)Used By (0)

Otomaties WooCommerce Extra Checkout Steps
==========================================

[](#otomaties-woocommerce-extra-checkout-steps)

This plugin provides a way to add extra steps to the checkout process

Prerequisites
-------------

[](#prerequisites)

- PHP 8.x
- ACF PRO

Installation
------------

[](#installation)

`composer require tombroucke/otomaties-events`

Usage
-----

[](#usage)

1. Activate the plugin
2. Add one or more extra checkout pages e.g. checkout/billing, checkout/shipping, checkout/overview
3. Add these pages in the correct order in the "Extra Checkout Steps" options page.
4. Create a shortcode for each extra page. e.g.: ```
    add_shortcode('checkout_billing_information', function () {
    	return view('shortcodes.checkout-personal-details', [
    		'adminPostUrl' => admin_url('admin-post.php'),
    		'data' => WooCommerceExtraCheckoutSteps()->make(\Otomaties\WooCommerceExtraCheckoutSteps\Helpers\Steps::class)->find(get_the_ID())->getData(),
    	])->toHtml();
    });
    ```
5. Add the view for the shortcode. Make sure to add the fields for extra steps, and add a unique name to it (`WooCommerceExtraCheckoutSteps()->make('form-fields', ['name' => 'personal_details'])`). ```
    @if(function_exists('WooCommerceExtraCheckoutSteps'))
    {!! woocommerce_output_all_notices() !!}

    	{!! woocommerce_checkout_login_form() !!}

    		Custom field

    	{!! wc_get_template('checkout/form-billing.php', array('checkout' => WC()->checkout)) !!}
    	{!! WooCommerceExtraCheckoutSteps()->make('form-fields', ['name' => 'personal_details']) !!}

    		{!! __('Continue', 'text-domain') !!}

    @endif
    ```
6. For each page: add some validation logic if needed: ```
    add_action('woocommerce_extra_checkout_steps_verify_fields', function($stepName, $currentStep, $nextStep, $steps) {
    if ($stepName === 'personal_details') {
    		$fields = [
    			'billing_first_name' => [
    				'label' => __('First name', 'text-domain'),
    				'validate' => [
    					'required',
    					[
    						'function' => function ($name) {
    							return strlen($name) > 2;
    						},
    						'message' => __('First name should be at least 2 letters', 'text-domain')
    					]
    				]
    			],
    			'billing_last_name' => [
    				'label' => __('Last name', 'text-domain'),
    				'validate' => ['required']
    			],
    			'billing_postcode' => [
    				'label' => __('Postcode', 'remmerie'),
    				'validate' => [
    				    'required',
    				    [
    					'function' => function ($postcode) {
    					    return \WC_Validation::is_postcode($postcode, isset($_POST['billing_country']) ? $_POST['billing_country'] : null);
    					},
    					'message' => sprintf(__( '%s is not a valid postcode / ZIP.', 'woocommerce' ), '' .  __('Postcode', 'remmerie') . '')
    				    ]
    				]
    			],
    			'billing_phone' => [
    				'label' => __('Phone', 'remmerie'),
    				'validate' => [
    				    'required',
    				    [
    					'function' => function ($phone) {
    					    return \WC_Validation::is_phone($phone);
    					},
    					'message' => sprintf(__( '%s is not a valid phone number.', 'woocommerce' ), '' .  __('Phone', 'remmerie') . '')
    				    ]
    				]
    			],
    			'billing_email' => [
    				'label' => __('Email', 'remmerie'),
    				'validate' => [
    				    'required',
    				    [
    					'function' => function ($email) {
    					    return \WC_Validation::is_email($email);
    					},
    					'message' => sprintf(__( '%s is not a valid email address.', 'woocommerce' ), '' .  __('Email', 'remmerie') . '')
    				    ]
    				]
    			],
    			// ...
    		];
        $currentStep->verifyFields($fields);
    }
    }, 10, 4)
    ```
7. The data is saved to the step in `WC()->session`. If needed, you can use a hook to save the data elsewhere: ```
    add_action('woocommerce_extra_checkout_steps_data_saved', function($callback, $data, $currentStep, $nextStep) {
    	// save the data
    }, 10, 4)
    ```
8. The default WooCommerce fields are saved by WooCommerce. Possibly, you need to save custom fields to your order. You can use the `woocommerce_checkout_order_processed` for this. ```
    add_action('woocommerce_checkout_order_processed', function ($orderId, $postedData, $order) {
    	WooCommerceExtraCheckoutSteps()->make(\Otomaties\WooCommerceExtraCheckoutSteps\Helpers\Steps::class)
    		->each(function($step) {
    			$stepData = $step->getData();
    			$order->update_meta_data('custom_field', $stepData['custom_field']);
    			$order->save();
    		});
    });
    ```

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance57

Moderate activity, may be stable

Popularity12

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~293 days

Total

3

Last Release

285d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/4178291ccf36e3530aa8a8845124c3af1b24c064739ad98ded5b9679a4316033?d=identicon)[tombroucke](/maintainers/tombroucke)

---

Top Contributors

[![tombroucke](https://avatars.githubusercontent.com/u/24292260?v=4)](https://github.com/tombroucke "tombroucke (13 commits)")

### Embed Badge

![Health badge](/badges/tombroucke-otomaties-woocommerce-extra-checkout-steps/health.svg)

```
[![Health](https://phpackages.com/badges/tombroucke-otomaties-woocommerce-extra-checkout-steps/health.svg)](https://phpackages.com/packages/tombroucke-otomaties-woocommerce-extra-checkout-steps)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[mike-bronner/laravel-model-caching

Automatic caching for Eloquent models.

2.4k91.9k1](/packages/mike-bronner-laravel-model-caching)[api-platform/laravel

API Platform support for Laravel

58171.6k14](/packages/api-platform-laravel)[unisharp/laravel-filemanager

A file upload/editor intended for use with Laravel 5 to 10 and CKEditor / TinyMCE

2.2k3.5M85](/packages/unisharp-laravel-filemanager)[illuminate/database

The Illuminate Database package.

2.8k54.9M11.6k](/packages/illuminate-database)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M194](/packages/laravel-ai)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
