-
-
Save claudiosanches/a79f4e3992ae96cb821d3b357834a005 to your computer and use it in GitHub Desktop.
<?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' ) ); |
Resolved refreshing permalink structure as @chvillanuevap wrote. Just save Permalink options and your page will start working.
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.
very good it is working thank you 💃
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.
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' );
}
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.
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 );
Great piece of code! Thank you so much for this. One question: How do I add two custom endpoints?
@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?
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
*/
Great job! How i can change this code to add more than one endpoint page?
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.
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!
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.
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;
}
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