WooCommerce:将端点分配给我的帐户页面中的自定义模板

Dar*_*rer 16 php account wordpress templates woocommerce

此功能将名为"特殊页面"的选项卡添加到"我的帐户"选项卡列表中:

add_filter( 'woocommerce_account_menu_items' , 'jc_menu_panel_nav' );

function jc_menu_panel_nav() {
    $items = array(
        'dashboard'       => __( 'Dashboard', 'woocommerce' ),
        'orders'          => __( 'Orders', 'woocommerce' ),
        'downloads'       => __( 'Downloads', 'woocommerce' ),
        'edit-address'    => __( 'Addresses', 'woocommerce' ),
        'payment-methods' => __( 'Payment Methods', 'woocommerce' ),
        'edit-account'    => __( 'Account Details', 'woocommerce' ),
        'special-page' => __( 'Special Page', 'woocommerce' ), // My custom tab here
        'customer-logout' => __( 'Logout', 'woocommerce' ),
    );

    return $items;
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

但链接指向my-account/special-page/,并自然给出404错误.

我如何将此URL分配给名为special-page.php?的文件?

Dar*_*rer 24

最后,我可以使用为WooCommerce的相同人员提供的代码段来解决问题(该页面中有更多提示).对于任何感兴趣的人,请在functions.php中粘贴以下所有代码:

function my_custom_endpoints() {
    add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES );
}

add_action( 'init', 'my_custom_endpoints' );

function my_custom_query_vars( $vars ) {
    $vars[] = 'special-page';

    return $vars;
}

add_filter( 'query_vars', 'my_custom_query_vars', 0 );

function my_custom_flush_rewrite_rules() {
    flush_rewrite_rules();
}

add_action( 'wp_loaded', 'my_custom_flush_rewrite_rules' );
Run Code Online (Sandbox Code Playgroud)

我认为这种方式允许更多控制命令/重命名菜单:

function my_custom_my_account_menu_items( $items ) {
    $items = array(
        'dashboard'         => __( 'Dashboard', 'woocommerce' ),
        'orders'            => __( 'Orders', 'woocommerce' ),
        //'downloads'       => __( 'Downloads', 'woocommerce' ),
        //'edit-address'    => __( 'Addresses', 'woocommerce' ),
        //'payment-methods' => __( 'Payment Methods', 'woocommerce' ),
        'edit-account'      => __( 'Edit Account', 'woocommerce' ),
        'special-page'      => 'Special Page',
        'customer-logout'   => __( 'Logout', 'woocommerce' ),
    );

    return $items;
}

add_filter( 'woocommerce_account_menu_items', 'my_custom_my_account_menu_items' );
Run Code Online (Sandbox Code Playgroud)

在下面的函数中,我包含了文件来维护一些"顺序",但它也承认直接代码.

务必将special-page.php文件放在myaccount文件夹中.

function my_custom_endpoint_content() {
    include 'woocommerce/myaccount/special-page.php'; 
}

add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );
Run Code Online (Sandbox Code Playgroud)

重要提示:执行此操作后,转到控制板>设置>永久链接,然后单击"保存设置"以刷新重写规则(感谢@optimiertes)

来源:选项卡我的帐户页面

  • thx解决方案.提示:将"after_switch_theme"挂钩更改为任何其他标头挂钩"wp_loaded" - 例如.并且它将在没有切换主题的情况下工作. (5认同)

Loi*_*tec 7

首先my-account/special-page/应该myaccount/special-page/在 woocommerce 2.6+ 中。

此解决方案不完整,我仍在努力……

你可以先使用这个钩子:

add_action( 'init', 'add_wc_endpoint' );
function add_wc_endpoint(){
    add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES );
}
Run Code Online (Sandbox Code Playgroud)

然后过滤wc_get_template以在请求与您的端点匹配时调用您的文件:

add_filter( 'wc_get_template', 'custom_vc_endpoint', 10, 5 );
function custom_vc_endpoint($located, $template_name, $args, $template_path, $default_path){

    if( $template_name == 'myaccount/special-page.php' ){
        global $wp_query;
        if(isset($wp_query->query['special-page'])){
            $located = get_template_directory() . '/woocommerce/myaccount/special-page.php';
        }
    }

    return $located;
}
Run Code Online (Sandbox Code Playgroud)

如果您使用子主题,请替换get_template_directory()get_stylesheet_directory()... 将此代码粘贴到活动子主题或主题的 function.php 文件中。

为避免404 错误“找不到页面”,您需要刷新添加到代码中的重写规则:

flush_rewrite_rules();
Run Code Online (Sandbox Code Playgroud)

更新:最后达里奥(OP)找到了一个有效的解决方案。看看他的回答。

参考: