Skip to content

Instantly share code, notes, and snippets.

@claudiosanches
Last active November 6, 2023 20:10
Show Gist options
  • Star 48 You must be signed in to star a gist
  • Fork 19 You must be signed in to fork a gist
  • Save claudiosanches/a79f4e3992ae96cb821d3b357834a005 to your computer and use it in GitHub Desktop.
Save claudiosanches/a79f4e3992ae96cb821d3b357834a005 to your computer and use it in GitHub Desktop.
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' ) );
@thrief
Copy link

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
Copy link

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
Copy link

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

@Looltech
Copy link

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
Copy link

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
Copy link

MikeWP commented Oct 18, 2019

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

@TomasHurtz
Copy link

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
Copy link

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
Copy link

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
Copy link

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