-
-
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' ) ); |
@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;
}
Great piece of code! Thank you so much for this. One question: How do I add two custom endpoints?