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

2022-08-30 22:52:29

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

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;
}

这导致:

enter image description here

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

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


答案 1

最后,我可以使用为WooCommerce的相同人员提供的代码片段来解决问题(该页面中还有更多提示)。对于任何感兴趣的人,请将以下所有代码粘贴到函数中.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' );

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

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' );

在下面的函数中,我包含了该文件以维护一些“顺序”,但它也允许直接代码。

请务必将文件放在文件夹中。special-page.phpmyaccount

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

add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );

重要:完成此操作后,转到仪表板>设置>永久链接,然后单击“保存设置”以刷新重写规则(感谢@optimiertes)

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


答案 2

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

这个解决方案是不完整的,我仍在努力...

你可以先使用这个钩子:

add_action( 'init', 'add_wc_endpoint' );
function add_wc_endpoint(){
    add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES );
}

然后进行筛选,以便在请求与终结点匹配时调用文件: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;
}

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

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

flush_rewrite_rules();

更新:最后,Dario(OP)找到了一个可行的解决方案。看看他的答案。

引用:


推荐