Search code examples
phpwordpresswoocommercepermalinks

WooCommerce 2.6 Custom Endpoint 404 Not Found Error


It seems with version 2.6 WooCommerce have changed the way endpoints and custom profile tabs are made. More infor here https://woocommerce.wordpress.com/2016/04/21/tabbed-my-account-pages-in-2-6/ and and https://github.com/woothemes/woocommerce/wiki/2.6-Tabbed-My-Account-page

My code bellow is almost similar to the one in these links but clicking on the new profile tab keeps showing the 404 Not Found error. I tried Permalinks refresh and flush_rewrite_rules() but othing seems to work....

if ( !class_exists('My_WC_User_Company') ) {
    class My_WC_User_Company {

        /**
         * Custom endpoint name.
         *
         * @var string
         */
        public static $endpoint = 'my-company';

        /**
         * Plugin actions.
         */
        public function __construct() {
            // Actions used to insert a new endpoint in the WordPress.
            add_action( 'init', array( $this, 'add_endpoints' ) );
            add_filter( 'query_vars', array( $this, 'add_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 add_query_vars( $vars ) {
            $vars[] = 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 Company', 'domain' );

                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 Company', 'domain' );

            // Insert back the logout item.
            $items['customer-logout'] = $logout;

            return $items;
        }

        /**
         * Endpoint HTML content.
         */
        public function endpoint_content() {

            ob_start();

            // here is some content ?>

            <?php

            $output = ob_get_clean();
            echo $output;
        }

    }
}


add_action('init', '_action_ssd_wp_user_company_init');

if( !( function_exists('_action_ssd_wp_user_company_init')) ){
    function _action_ssd_wp_user_company_init(){
        if (  get_current_user_id() && get_user_meta( get_current_user_id(), 'user_company', true ) == 'yes' ) {
            new My_WC_User_Company();
        }
    }
}

Does anyone have any ideas what couldbe the issue?


Solution

  • there's something wrong with your hook... wrong timings...

    these works... with 0 priority or using woocommerce_init
    add_action('init', '_action_ssd_wp_user_company_init', 0 ); or add_action('woocommerce_init', '_action_ssd_wp_user_company_init');

    instead of add_action('init', '_action_ssd_wp_user_company_init');

    you need to refresh permalink settings for this to work.