Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Example of custom My Account endpoint.
<?php
class My_Custom_My_Account_Endpoint {
/**
* Custom endpoint name.
*
* @var string
*/
public static $endpoint = 'my-custom-endpoint';
/**
* Plugin actions.
*/
public function __construct() {
// Actions used to insert a new endpoint in the WordPress.
add_action( 'init', array( $this, 'add_endpoints' ) );
add_filter( 'woocommerce_get_query_vars', array( $this, 'get_query_vars' ), 0 );
// Change the My Accout page title.
add_filter( 'the_title', array( $this, 'endpoint_title' ) );
// Insering your new tab/page into the My Account page.
add_filter( 'woocommerce_account_menu_items', array( $this, 'new_menu_items' ) );
add_action( 'woocommerce_account_' . self::$endpoint . '_endpoint', array( $this, 'endpoint_content' ) );
}
/**
* Register new endpoint to use inside My Account page.
*
* @see https://developer.wordpress.org/reference/functions/add_rewrite_endpoint/
*/
public function add_endpoints() {
add_rewrite_endpoint( self::$endpoint, EP_ROOT | EP_PAGES );
}
/**
* Add new query var.
*
* @param array $vars
* @return array
*/
public function get_query_vars( $vars ) {
$vars[ self::$endpoint ] = self::$endpoint;
return $vars;
}
/**
* Set endpoint title.
*
* @param string $title
* @return string
*/
public function endpoint_title( $title ) {
global $wp_query;
$is_endpoint = isset( $wp_query->query_vars[ self::$endpoint ] );
if ( $is_endpoint && ! is_admin() && is_main_query() && in_the_loop() && is_account_page() ) {
// New page title.
$title = __( 'My Custom Endpoint', 'woocommerce' );
remove_filter( 'the_title', array( $this, 'endpoint_title' ) );
}
return $title;
}
/**
* Insert the new endpoint into the My Account menu.
*
* @param array $items
* @return array
*/
public function new_menu_items( $items ) {
// Remove the logout menu item.
$logout = $items['customer-logout'];
unset( $items['customer-logout'] );
// Insert your custom endpoint.
$items[ self::$endpoint ] = __( 'My Custom Endpoint', 'woocommerce' );
// Insert back the logout item.
$items['customer-logout'] = $logout;
return $items;
}
/**
* Endpoint HTML content.
*/
public function endpoint_content() {
echo '<p>Hello World!</p>';
// You can load a template here with wc_get_template( 'myaccount/my-custom-endpoint.php' );
}
/**
* Plugin install action.
* Flush rewrite rules to make our custom endpoint available.
*/
public static function install() {
flush_rewrite_rules();
}
}
new My_Custom_My_Account_Endpoint();
// Flush rewrite rules on plugin activation.
register_activation_hook( __FILE__, array( 'My_Custom_My_Account_Endpoint', 'install' ) );
@sebastienserre

This comment has been minimized.

Copy link

@sebastienserre sebastienserre commented Jun 20, 2016

Hello,

I'm on a Woocommerce 2.6.1 and seems that hook "woocommerce_account_' . self::$endpoint . '_endpoint'" on line 24 isn't fired :-s
ANy idea to help me please?

@chvillanuevap

This comment has been minimized.

Copy link

@chvillanuevap chvillanuevap commented Jul 2, 2016

Are you placing this code inside a theme instead of a plugin? If so, change the last line to:

add_action( 'after_switch_theme', array( 'My_Custom_My_Account_Endpoint', 'install' ) );

If that does not work, try refreshing your permalink structure.

@wgh000

This comment has been minimized.

Copy link

@wgh000 wgh000 commented Jul 11, 2016

I'm trying the same, but no endpoint action fired. Any idea? I created a plugin with just the code above, activated the plugin, but no action is executed when the user click on the My Stuff link... Also running on the 2.6.1 version

@wgh000

This comment has been minimized.

Copy link

@wgh000 wgh000 commented Jul 12, 2016

Resolved refreshing permalink structure as @chvillanuevap wrote. Just save Permalink options and your page will start working.

@TBAIKamine

This comment has been minimized.

Copy link

@TBAIKamine TBAIKamine commented Aug 7, 2016

am such a newbie, would you please pack it up in a plugin or something so i can install this since i really don't know how to make use of this code.

@UlrichGiorgioJaeger

This comment has been minimized.

Copy link

@UlrichGiorgioJaeger UlrichGiorgioJaeger commented Aug 12, 2016

very good it is working thank you 💃

@mtndev

This comment has been minimized.

Copy link

@mtndev mtndev commented Oct 11, 2016

How would I insert the content from a WordPress page or redirect them to a WP page instead of echo <p>Hello World!</p>';

It would be nice if my clients could edit that page in the regular WP admin they have access to.

@coldfusion411

This comment has been minimized.

Copy link

@coldfusion411 coldfusion411 commented Dec 13, 2016

Replace this function and add a template to your theme/woocommerce/myaccount/ folder.

public function endpoint_content() {
		wc_get_template( 'myaccount/my-custom-endpoint.php' );
	}
@froun1992

This comment has been minimized.

Copy link

@froun1992 froun1992 commented Mar 5, 2017

Can someone tell me what should be the plugin name folder and the name of the file.I tried to create the plugin but its not appearing at all.

@thrief

This comment has been minimized.

Copy link

@thrief thrief commented Apr 10, 2017

Well done ! my plugin is ok. I was in trouble, however the solution was to set priority for this action ;
add_action( 'woocommerce_account_' . self::$endpoint . '_endpoint', array( 'My_Endpoint', 'function_content' ),10 );

@coachasymi

This comment has been minimized.

Copy link

@coachasymi coachasymi commented Jul 5, 2017

Gosh thanks for the code!
You have to re-save your permalink to make it work. However mine looks like this:

github edit my account woocommerce

Any idea which part of the code are making this?

@DollyPop007

This comment has been minimized.

Copy link

@DollyPop007 DollyPop007 commented Sep 7, 2017

Great piece of code! Thank you so much for this. One question: How do I add two custom endpoints?

@Looltech

This comment has been minimized.

Copy link

@Looltech Looltech commented Mar 30, 2019

@claudiosanches This example worked.

But I have another problem. I choose My-account as my static root page. The new point show 404 or post page.
Can you suggest away to solve?

@ugurterzi

This comment has been minimized.

Copy link

@ugurterzi ugurterzi commented Apr 27, 2019

Perfect solution with the update by @coldfusion411
I just wanted to add something to the people who are new @WP development:
If you want to make it a plugin, the code should start with:

/*
Plugin Name: My Plugin
Plugin URI: https://www.mydomain.com/my-plugin
description: My description
Version: 1.0
Author: My Name
Author URI: https://www.mydomain.com/about-me
License: GPL2
*/
@MikeWP

This comment has been minimized.

Copy link

@MikeWP MikeWP commented Oct 18, 2019

Great job! How i can change this code to add more than one endpoint page?

@TomasHurtz

This comment has been minimized.

Copy link

@TomasHurtz TomasHurtz commented Nov 15, 2019

This is helpful. Also this is also helpful

However, as @MikeWP says, how to add more than one custom endpoints? I would also like to know this.

@jrmel

This comment has been minimized.

Copy link

@jrmel jrmel commented Mar 26, 2020

When I use this code I cannot use 'my-custom-endpoint' with the function "is_wc_endpoint_url()". Whereas "is_wc_endpoint_url()" works with the core WC endpoints to return a true value (e.g. "is_wc_endpoint_url('orders')" or "is_wc_endpoint_url('edit-address')"), the function returns empty (or false/"0" Boolean) when using 'my-custom-endpoint'. I've also tried other custom endpoints with the same problem.

Does anyone know what additional coding is required of the custom endpoints to be compatible with the "is_wc_endpoint_url" function? I'd really like to be able to utilize this function for conditional logic on custom tabs. Thanks!

@subhankara

This comment has been minimized.

Copy link

@subhankara subhankara commented Jan 29, 2021

Above endpoint is working fine. But now I want to open a new page as woo order listing is working. Please check this link https://nimb.ws/1fn4wa

I want to list all offers and also I want to shoe each offer single details in the my account section. Please advice.

@4selin

This comment has been minimized.

Copy link

@4selin 4selin commented Mar 28, 2021

Does not work with conditional

is_wc_endpoint_url('my-custom-endpoint')
returns false

UPD
add this to __construct
add_filter( 'woocommerce_get_query_vars', [ $this, 'add_query_vars' ], 0 );

and change add_query_vars()
to
public function add_query_vars( $vars ) {
$vars[self::$endpoint] = self::$endpoint;

	return $vars;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment