How to Customize Woocommerce Admin Dashboard? 16 hacks

In this tutorial I’m going to show you how to customize Woocommerce admin dashboard with 16 simple hacks. Those hacks are easy to implement and will take basically no time to implement.

NB! In order to use all those snippets shown in this post you need add them inside your child theme’s functions.php file or better yet, use Code Snippets plugin. This way you’re not going to lose these modifications in case you’re switching your theme.

Also, take a look at the video tutorial here below and then it will probably be a bit easier to understand what is what.

Video: How to Customize Woocommerce Admin Dashboard?

How to set default Woocommerce login page to “Orders”?

When is this beneficial? Well, maybe 80% of your work is either editing orders or adding product. Therefore, instead of being directed to WordPress dashboard it would be wise to let yourself be redirected to orders (or product page. This snippet allows you to be redirected to orders page.

// Set default Woocommerce login page to "Orders" page
add_action( 'load-index.php', 'redirect_to_orders' );
function redirect_to_orders(){
    wp_redirect( admin_url( 'edit.php?post_type=shop_order' ) );
}
add_filter( 'login_redirect', 'redirect_to_orders_dashboard', 9999, 3 );
function redirect_to_orders_dashboard( $redirect_to, $request, $user ){
    $redirect_to = admin_url( 'edit.php?post_type=shop_order' );
    return $redirect_to;
}

How to redirect Woocommerce admin to products list after login?

If you need to redirect yourself to admin products list page, then use this snippet instead.

// Redirect Woocommerce admin to products list after login
add_action( 'load-index.php', 'redirect_to_products' );
function redirect_to_products(){
    wp_redirect( admin_url( 'edit.php?post_type=product' ) );
}
add_filter( 'login_redirect', 'redirect_to_products_dashboard', 9999, 3 );
function redirect_to_products_dashboard( $redirect_to, $request, $user ){
    $redirect_to = admin_url( 'edit.php?post_type=product' );
    return $redirect_to;
}

How to disable Woocommerce bloat?

This snippet here below allows you to disable some Woocommerce bloat, that is Marketing and Analytics menus/submenus. Also, this will speed your dashboard up a bit.

// Disable Woocommerce bloat
add_filter( 'woocommerce_admin_disabled', '__return_true' );

How to add Woocommerce product ID column?

Next, let’s customize Woocommerce admin dashboard further. Sometimes you may need to visually see your Woocommerce product ID columns. This snippet will help you out.

// Add Woocommerce produc ID column?

function woo_product_extra_columns($columns)
{
	$newcolumns = array(
		"cb"       		=> "<input type  = \"checkbox\" />",
		"product_ID"    => esc_html__('ID', 'woocommerce'),
	);
	$columns = array_merge($newcolumns, $columns);
	
	return $columns;
}
add_filter("manage_edit-product_columns", "woo_product_extra_columns");

function woo_product_extra_columns_content($column)
{
	global $post;
	
	$product_id = $post->ID;
	switch ($column)
	{
		case "product_ID":
			echo $product_id;
		break;		
	}
}
add_action("manage_posts_custom_column",  "woo_product_extra_columns_content");

// Adjust column size
add_action('admin_head', 'my_column_width');
function my_column_width() {
    echo '<style type="text/css">';
    echo '.column-product_ID { width:40px; }';
    echo '</style>';
}

How to filter Woocommerce products by featured products in admin?

Lets customize Woocommerce Admin Dashboard a bit more. By default Woocommerce admin doesn’t have an option to filter products by featured products. If you would like to have this feature then use this snippet here below.

// Filter Woocommerce products by featured products in admin
add_action('restrict_manage_posts', 'esiletostetud_tooted');
function esiletostetud_tooted() {
	global $typenow;
	$post_type = 'product'; // change to your post type
	$taxonomy  = 'product_visibility'; // change to your taxonomy
	if ($typenow == $post_type) {
		$selected      = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
		$info_taxonomy = get_taxonomy($taxonomy);
		wp_dropdown_categories(array(
			'show_option_all' => __("Show all {$info_taxonomy->label}"),
			'taxonomy'        => $taxonomy,
			'name'            => $taxonomy,
			'orderby'         => 'name',
			'selected'        => $selected,
			'show_count'      => true,
			'hide_empty'      => true,
		));
	};
}
add_filter('parse_query', 'esiletostetud_tooted_paring');
function esiletostetud_tooted_paring($query) {
	global $pagenow;
	$post_type = 'product'; // change to your post type
	$taxonomy  = 'product_visibility'; // change to your taxonomy
	$q_vars    = &$query->query_vars;
	if ( $pagenow == 'edit.php' && isset($q_vars['post_type']) && $q_vars['post_type'] == $post_type && isset($q_vars[$taxonomy]) && is_numeric($q_vars[$taxonomy]) && $q_vars[$taxonomy] != 0 ) {
		$term = get_term_by('id', $q_vars[$taxonomy], $taxonomy);
		$q_vars[$taxonomy] = $term->slug;
	}
}

How to add tax class column and tax status column to Woocommerce admin?

Don’t you worry, this snippet here below will add tax class column and tax status column to Woocommerce admin products list.

// Add tax class column to Woocommerce admin
add_filter( 'manage_edit-product_columns', 'tax_class_product_column');
function tax_class_product_column($columns){
    $new_columns = [];
    foreach( $columns as $key => $column ){
        $new_columns[$key] = $columns[$key];
        if( $key == 'is_in_stock' ) {
            $new_columns['tax_class'] = __( 'Tax class','woocommerce');
        }
    }
    return $new_columns;
}

add_action( 'manage_product_posts_custom_column', 'tax_class_product_column_content', 10, 2 );
function tax_class_product_column_content( $column, $post_id ){
    if( $column == 'tax_class' ){
        global $post, $product;

        // Excluding variable and grouped products
        if( is_a( $product, 'WC_Product' ) ) {
            $args = wc_get_product_tax_class_options();

            echo $args[$product->get_tax_class()];
        }
    }
}

// Add Tax status column to Woocommerce admin
add_filter( 'manage_edit-product_columns', 'tax_status_product_column');
function tax_status_product_column($columns){
    $new_columns = [];
    foreach( $columns as $key => $column ){
        $new_columns[$key] = $columns[$key];
        if( $key == 'is_in_stock' ) {
            $new_columns['tax_status'] = __( 'Taxes','woocommerce');
        }
    }
    return $new_columns;
}

add_action( 'manage_product_posts_custom_column', 'tax_status_product_column_content', 10, 2 );
function tax_status_product_column_content( $column, $post_id ){
    if( $column == 'tax_status' ){
        global $post, $product;

        // Excluding variable and grouped products
        if( is_a( $product, 'WC_Product' ) ) {
            $args =  array(
                'taxable'  => __( 'Taxable', 'woocommerce' ),
                'shipping' => __( 'Shipping only', 'woocommerce' ),
                'none'     => _x( 'None', 'Tax status', 'woocommerce' ),
            );

            echo $args[$product->get_tax_status()];
        }
    }
}

How to add custom Woocommerce order status?

Sometimes you may need to add a custom Woocommerce status that suits for your shop. With the help of this snippet here below I will add a custom order status called “In-progress”. You may rename it as you like.

// Add custom Woocommerce order status?
function register_in_progress_order_status() {
    register_post_status( 'wc-invoiced', array(
            'label' => _x( 'In-progress', 'Order Status', 'woocommerce' ),
            'public' => true,
            'exclude_from_search' => false,
            'show_in_all_admin_list' => true,
            'show_in_admin_status_list' => true,
            'label_count' => _n_noop( 'In-progress <span class="count">(%s)</span>', 'In-progress <span class="count">(%s)</span>', 'woocommerce' )
        )
    );
}

add_action( 'init', 'register_in_progress_order_status' );

function my_invoiced_order_status( $order_statuses ){
    $order_statuses['wc-invoiced'] = _x( 'In-progress', 'Order Status', 'woocommerce' );
    return $order_statuses;

}
add_filter( 'wc_order_statuses', 'my_invoiced_order_status' );

function show_in_bulk_actions() {
    global $post_type;

    if( 'shop_order' == $post_type ) {
        ?>
            <script type="text/javascript">
                jQuery(document).ready(function(){
                    jQuery('<option>').val('mark_invoiced').text('<?php _e( 'Change Status to In-progress','woocommerce' ); ?>').appendTo("select[name='action']");
                    jQuery('<option>').val('mark_invoiced').text('<?php _e( 'Change Status to In-progress','woocommerce' ); ?>').appendTo("select[name='action2']");
                });
            </script>
        <?php
    }
}

add_action( 'admin_footer', 'show_in_bulk_actions' );

How to filter Woocommerce orders by coupons used?

Next hack is a nifty one and allows you to add another filter to your Woocommerce admin orders page. This way you can filter Woocommerce orders by coupon used.

// Filter Woocommerce orders by coupons used
defined( 'ABSPATH' ) or exit;

// fire it up!
add_action( 'plugins_loaded', 'wc_filter_orders_by_coupon' );

 class WC_Filter_Orders_By_Coupon {


	const VERSION = '1.1.0';

	/** @var WC_Filter_Orders_By_Coupon single instance of this plugin */
	protected static $instance;

	public function __construct() {

		// load translations
		add_action( 'init', array( $this, 'load_translation' ) );

		if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {

			// adds the coupon filtering dropdown to the orders page
			add_action( 'restrict_manage_posts', array( $this, 'filter_orders_by_coupon_used' ) );

			// makes coupons filterable
			add_filter( 'posts_join',  array( $this, 'add_order_items_join' ) );
			add_filter( 'posts_where', array( $this, 'add_filterable_where' ) );
		}
	}

	public function filter_orders_by_coupon_used() {
		global $typenow;

		if ( 'shop_order' === $typenow ) {

			$args = array(
				'posts_per_page' => - 1,
				'orderby'        => 'title',
				'order'          => 'asc',
				'post_type'      => 'shop_coupon',
				'post_status'    => 'publish',
			);

			$coupons = get_posts( $args );

			if ( ! empty( $coupons ) ) : ?>

				<select name="_coupons_used" id="dropdown_coupons_used">
					<option value="">
						<?php esc_html_e( 'Filter by coupon used', 'wc-filter-orders' ); ?>
					</option>
					<?php foreach ( $coupons as $coupon ) : ?>
						<option value="<?php echo esc_attr( $coupon->post_title ); ?>" <?php echo esc_attr( isset( $_GET['_coupons_used'] ) ? selected( $coupon->post_title, $_GET['_coupons_used'], false ) : '' ); ?>>
							<?php echo esc_html( $coupon->post_title ); ?>
						</option>
					<?php endforeach; ?>
				</select>
			<?php endif;
		}
	}

	public function add_order_items_join( $join ) {
		global $typenow, $wpdb;

		if ( 'shop_order' === $typenow && isset( $_GET['_coupons_used'] ) && ! empty( $_GET['_coupons_used'] ) ) {

			$join .= "LEFT JOIN {$wpdb->prefix}woocommerce_order_items woi ON {$wpdb->posts}.ID = woi.order_id";
		}

		return $join;
	}

	public function add_filterable_where( $where ) {
		global $typenow, $wpdb;

		if ( 'shop_order' === $typenow && isset( $_GET['_coupons_used'] ) && ! empty( $_GET['_coupons_used'] ) ) {

			// Main WHERE query part
			$where .= $wpdb->prepare( " AND woi.order_item_type='coupon' AND woi.order_item_name='%s'", wc_clean( $_GET['_coupons_used'] ) );
		}

		return $where;
	}

	public function load_translation() {
		// localization
		load_plugin_textdomain( 'wc-filter-orders', false, dirname( plugin_basename( __FILE__ ) ) . '/i18n/languages' );
	}

	public static function instance() {
		if ( is_null( self::$instance ) ) {
		 	self::$instance = new self();
		}
		return self::$instance;
	}

	public function __clone() {
		/* translators: Placeholders: %s - plugin name */
		_doing_it_wrong( __FUNCTION__, sprintf( esc_html__( 'You cannot clone instances of %s.', 'wc-filter-orders' ), 'Filter WC Orders by Coupon' ), '1.1.0' );
	}

	public function __wakeup() {
		/* translators: Placeholders: %s - plugin name */
		_doing_it_wrong( __FUNCTION__, sprintf( esc_html__( 'You cannot unserialize instances of %s.', 'wc-filter-orders' ), 'Filter WC Orders by Coupon' ), '1.1.0' );
	}
}

function wc_filter_orders_by_coupon() {
	return WC_Filter_Orders_By_Coupon::instance();
}

How to display used coupons on WooCommerce admin orders list?

Any other ways we can customize Woocommerce admin dashboard? Yes it is.

It happens that sometimes you badly need to see what coupon is used in the order. If this is something you need then this snippet here will display used coupons on WooCommerce admin orders list in a separate column.

// Display used coupons on WooCommerce admin orders list
add_filter( 'manage_edit-shop_order_columns', 'woo_customer_order_coupon_column_for_orders' );
function woo_customer_order_coupon_column_for_orders( $columns ) {
    $new_columns = array();

    foreach ( $columns as $column_key => $column_label ) {
        if ( 'order_total' === $column_key ) {
            $new_columns['order_coupons'] = __('Coupons', 'woocommerce');
        }

        $new_columns[$column_key] = $column_label;
    }
    return $new_columns;
}

add_action( 'manage_shop_order_posts_custom_column' , 'woo_display_customer_order_coupon_in_column_for_orders' );
function woo_display_customer_order_coupon_in_column_for_orders( $column ) {
    global $the_order, $post;
    if( $column  == 'order_coupons' ) {
        if( $coupons = $the_order->get_coupon_codes() ) {
            echo implode(', ', $coupons) . ' ('.count($coupons).')';
        } else {
            echo '<small><em>'. __('No coupon used') . '</em></small>';
        }
    }
}

How to display used coupons on Woocommerce order edit page?

Previous snippet displays used coupons in columns but if you need to display used coupons on Woocommerce order edit page then use this snippet here below.

//Add used coupons to the order edit page

function custom_checkout_field_display_admin_order_meta($order){

    if( $order->get_coupon_codes() ) {
    
    	$coupons_count = count( $order->get_coupon_codes() );
    
        echo '<h4>' . __('Coupon used') . ' (' . $coupons_count . ')</h4>';
         
        echo '<p><strong>' . __('Coupon used') . ':</strong> ';
        
        $i = 1;
        
        foreach( $order->get_coupon_codes() as $coupon) {
	        echo $coupon;
	        if( $i < $coupons_count )
	        	echo ', ';
	        $i++;
        }  
        echo '</p>';
    }
}

How to display used coupons on Woocommerce order preview template?

In addition, you can display used coupons on Woocommerce order preview template. How? Just use this snippet.

// Display used coupons on Woocommerce order preview template

add_filter( 'woocommerce_admin_order_preview_get_order_details', 'admin_order_preview_add_custom_data', 10, 2 );
function admin_order_preview_add_custom_data( $data, $order ) {
    // Replace '_custom_meta_key' by the correct postmeta key
    if( $coupons = $order->get_used_coupons() ) {
        $data['coupons_count'] = count($coupons); // <= Store the count in the data array.
        $data['coupons_codes'] = implode(', ', $coupons); // <= Store the count in the data array.
    }
    return $data;
}
// Display coupon in Order preview
add_action( 'woocommerce_admin_order_preview_end', 'custom_display_order_data_in_admin' );
function custom_display_order_data_in_admin(){
    // Call the stored value and display it
    echo '<div><strong>' . __('Coupons used') . ' ({{data.coupons_count}})<strong>: {{data.coupons_codes}}</div><br>';
}

How to display used coupons on Woocommerce order confirmation emails?

Well, since we’re already messing with the coupons then let’s display usedused coupons on Woocommerce order confirmation emails also.

// Display used coupons on Woocommerce order confirmation emails

add_action( 'woocommerce_email_after_order_table', 'add_payment_method_to_admin_new_order', 15, 2 );

function add_payment_method_to_admin_new_order( $order, $is_admin_email ) {
	
	if ( $is_admin_email ) {
		if( $order->get_coupon_codes() ) {
			$coupons_count = count( $order->get_coupon_codes() );
		    echo '<h4>' . __('Used coupon') . ' (' . $coupons_count . ')</h4>';
		    echo '<p><strong>' . __('Used coupon') . ':</strong> ';
		    $i = 1;
		    $coupons_list = '';
		    foreach( $order->get_coupon_codes() as $coupon) {
		        $coupons_list .=  $coupon;
		        if( $i < $coupons_count )
		        	$coupons_list .= ', ';
		        $i++;
		    }
		    echo '<p><strong>Used coupon (' . $coupons_count . ') :</strong> ' . $coupons_list . '</p>';
		} // endif get_coupon_codes
	
	} // endif $is_admin_email
}

How to filter WooCommerce orders by payment method?

Woocommerce orders table has no option to filter orders by payment gateway, but this is easy to fix. If you need to filter Woocommerce orders by payment method then use this snippet.

// Filter Woocommerce orders by payment method
defined( 'ABSPATH' ) or exit;

// fire it up!
add_action( 'plugins_loaded', 'wc_filter_orders_by_payment' );

class WC_Filter_Orders_By_Payment {

	const VERSION = '1.0.0';

	/** @var WC_Filter_Orders_By_Payment single instance of this plugin */
	protected static $instance;

	public function __construct() {

		if ( is_admin() ) {

			// add bulk order filter for exported / non-exported orders
			add_action( 'restrict_manage_posts', array( $this, 'filter_orders_by_payment_method') , 20 );
			add_filter( 'request',               array( $this, 'filter_orders_by_payment_method_query' ) );		
		}
	}

	public function filter_orders_by_payment_method() {
		global $typenow;

		if ( 'shop_order' === $typenow ) {

			// get all payment methods, even inactive ones
			$gateways = WC()->payment_gateways->payment_gateways();

			?>
			<select name="_shop_order_payment_method" id="dropdown_shop_order_payment_method">
				<option value="">
					<?php esc_html_e( 'All Payment Methods', 'wc-filter-orders-by-payment' ); ?>
				</option>

				<?php foreach ( $gateways as $id => $gateway ) : ?>
				<option value="<?php echo esc_attr( $id ); ?>" <?php echo esc_attr( isset( $_GET['_shop_order_payment_method'] ) ? selected( $id, $_GET['_shop_order_payment_method'], false ) : '' ); ?>>
					<?php echo esc_html( $gateway->get_method_title() ); ?>
				</option>
				<?php endforeach; ?>
			</select>
			<?php
		}
	}
	public function filter_orders_by_payment_method_query( $vars ) {
		global $typenow;
		if ( 'shop_order' === $typenow && isset( $_GET['_shop_order_payment_method'] ) && ! empty( $_GET['_shop_order_payment_method'] ) ) {

			$vars['meta_key']   = '_payment_method';
			$vars['meta_value'] = wc_clean( $_GET['_shop_order_payment_method'] );
		}
		return $vars;
	}
	public static function instance() {
		if ( is_null( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}
}

function wc_filter_orders_by_payment() {
    return WC_Filter_Orders_By_Payment::instance();
}

How to filter Woocommerce orders by user role?

Take a look at this snippet here below which allows you to filter Woocommerce orders by user role. (see screenshot)

How to Customize Woocommerce Admin Dashboard
// Filter Woocommerce orders by user role

function js_shop_order_user_role_filter() {

	global $typenow, $wp_query;

	if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ) ) ) {
		$user_role	= '';

		// Get all user roles
		$user_roles = array( 'guest' => 'Guest' );
		foreach ( get_editable_roles() as $key => $values ) {
			$user_roles[ $key ] = $values['name'];
		}

		// Set a selected user role
		if ( ! empty( $_GET['_user_role'] ) ) {
			$user_role	= sanitize_text_field( $_GET['_user_role'] );
		}

		// Display drop down
		?><select name='_user_role'>
			<option value=''><?php _e( 'Select a user role', 'woocommerce' ); ?></option><?php
			foreach ( $user_roles as $key => $value ) :
				?><option <?php selected( $user_role, $key ); ?> value='<?php echo $key; ?>'><?php echo $value; ?></option><?php
			endforeach;
		?></select><?php
	}

}
add_action( 'restrict_manage_posts', 'js_shop_order_user_role_filter' );

function js_shop_order_user_role_posts_where( $query ) {

	if ( ! $query->is_main_query() || empty( $_GET['_user_role'] ) || $_GET['post_type'] !== 'shop_order' ) {
		return;
	}

	if ( $_GET['_user_role'] != 'guest' ) {
		$ids = get_users( array( 'role' => sanitize_text_field( $_GET['_user_role'] ), 'fields' => 'ID' ) );
		$ids = array_map( 'absint', $ids );
	} else {
		$ids = array( 0 );
	}

	$query->set( 'meta_query', array(
		array(
			'key' => '_customer_user',
			'compare' => 'IN',
			'value' => $ids,
		)
	) );

	if ( empty( $ids ) ) {
		$query->set( 'posts_per_page', 0 );
	}
}
add_filter( 'pre_get_posts', 'js_shop_order_user_role_posts_where' );

How to autocomplete Woocommerce processing orders?

Easy fix. If you need your “processing” status to be skipped and set those orders to be completed automatically then use this snippet.

// autocomplete Woocommerce processing orders

add_filter( 'woocommerce_payment_complete_order_status', 'processing_orders_autocomplete', 9999 );
function processing_orders_autocomplete() {
   return 'completed';
}

How to add a sortable user Registration date column in WordPress Users page?

By default WordPress All users page doesn’t show user registration dates, but this is a “must have” feature for a lot us. So, if you want to know how to add a sortable user registration date column in WordPress Users page then use this snippet here below.

// Add a sortable user Registration date column in WordPress Users page
// Create user Registration date column in WordPress Users page

add_filter( 'manage_users_columns', 'modify_user_table' );
 
function modify_user_table( $columns ) {
 
	// unset( $columns['posts'] ); // maybe you would like to remove default columns
	$columns['registration_date'] = 'Registered'; // add new
 
	return $columns;
 
}
add_filter( 'manage_users_custom_column', 'modify_user_table_row', 10, 3 );
 
function modify_user_table_row( $row_output, $column_id_attr, $user ) {
 
	$date_format = 'd.m.Y, H:i';
	switch ( $column_id_attr ) {
		case 'registration_date' :
			return date( $date_format, strtotime( get_the_author_meta( 'registered', $user ) ) );
			break;
		default:
	}
	return $row_output;
}
 
// Make WordPress user registration column sortable

add_filter( 'manage_users_sortable_columns', 'sortable_user_date_column' );
 
function sortable_user_date_column( $columns ) {
	return wp_parse_args( array( 'registration_date' => 'registered' ), $columns );
}

How to display media file size column in WordPress media library?

WordPress media library has one major flaw and that is: is not showing media file sizes. Now, lets fix this issue and display media file size column in WordPress media library.

// Display media file size column in WordPress media library. Add all code to Code snippets or your child theme’s functions.php file

add_filter( 'manage_media_columns', 'sk_media_columns_filesize' );

function sk_media_columns_filesize( $posts_columns ) {
	$posts_columns['filesize'] = __( 'File size', 'my-theme-text-domain' );

	return $posts_columns;
}

add_action( 'manage_media_custom_column', 'sk_media_custom_column_filesize', 10, 2 );

// Display File Size column in WordPress media library table list

function sk_media_custom_column_filesize( $column_name, $post_id ) {
	if ( 'filesize' !== $column_name ) {
		return;
	}

	$bytes = filesize( get_attached_file( $post_id ) );

	echo size_format( $bytes, 2 );
}

add_action( 'admin_print_styles-upload.php', 'sk_filesize_column_filesize' );

// Adjust WordPress File Size column on Media Library page 
function sk_filesize_column_filesize() {
	echo
	'<style>
		.fixed .column-filesize {
			width: 10%;
		}
	</style>';
}

Well, that’s it. now you know how to customize Woocommerce Admin Dashboard.

Related Woocommerce hacks

Here are some of my favorite Wordpress tools

Thank you for reading this article. I hope you found it helpful as you build your own websites and e-commerce sites. Here are some tools I use as a Wordpress developer and enthusiast that I hope you’ll also find helpful.

These are affiliate links, so if you do decide to use any of them, I’ll earn a commission and this helps me create these tutorials and make Youtube videos. But in all honesty, these are the exact tools that I use and recommend to everyone, even my friends and family.

Themes: For the last couple of years I have two go-to themes which I use for every kind of projects. Those two themes are Blocksy theme and Kadence Theme. On this site and my Youtube channel you’ll see a lot of tutorials I have made about them. If you would like to get a 10% discount for both of them then:

Contact forms: There are hundreds of contact forms out there but Fluent Forms is the one I like the most. If you need a 20% discount then use this link (save 20% coupon is WPSH20).

Gutenberg add-ons: If I need a good Gutenberg blocks add-on then Kadence Blocks is the one I have used the most. You’ll get 10% discount with the coupon SIMPLEHACKS here.

Website migration: While building a website you probably need a good plugin that can help you with the migration, backups, restoration and staging sites. Well, WpVivid is the one I have used for the last couple of years. If you use this link along with the WPSH20 coupon you’ll get 20% discount.

Woocommerce extensions: There are a bunch of Woocommerce extensions that I really like but the one that stands really out is Advanced Dynamic Pricing. Once again, you’ll get a 20% discount if you use this link here (save 20% coupon is WPSH20)

Web Hosting: For getting started, I really like A2 Hosting. They have the dedicated and fast Wordpress hostinh and support has also been fast and responsive. If you’re more tech savvy and want to have a really fast managed cloud hosting then I recommend Cloudways. (Btw, this site is hosted in Cloudways.)

To see all my of most up-to-date recommendations, check out this resource that I made for you!

Do you want to thank me and buy me a beer?

Every donation is entirely welcome but NEVER required. Enjoy my work for free but if you would like to thank me and buy me a beer or two then you can use this form here below.

Choose amount

Best selling plugins

Default image
Janek T.
I am a Wordpress enthusiast who has been making websites since 2011. In this site I am offering simple to follow tips on how to use Wordpress and Woocommerce. If you want to be the first to be notified about the new tutorials then please subscribe to my Youtube channel here Follow me in Twitter here
Articles: 72