Last active
April 30, 2024 03:05
-
-
Save claudiosanches/a79f4e3992ae96cb821d3b357834a005 to your computer and use it in GitHub Desktop.
Example of custom My Account endpoint.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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' ) ); |
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;
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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!