You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为WooCommerce动态生成的自定义端点设置菜单指向?

解决WooCommerce账户菜单指向动态生成URL的问题

一、移除原有静态端点配置

原来的代码是创建固定端点的,现在要改成动态跳转,先删除这些冗余代码:

// 删掉以下代码块
function AddCustomTabEndpoint() {
  add_rewrite_endpoint('Device-Profile', EP_ROOT | EP_PAGES );
}
add_action('init','AddCustomTabEndpoint' );

function CustomTabQueryVars( $vars ) {
  $vars[] = 'Device-Profile';
  return $vars;
}
add_filter('query_vars','CustomTabQueryVars', 0 );

function MyCustomTabContent() {
  echo "<h3>Device-Profile</h3><p>Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p>";
}
add_action('woocommerce_account_Device-Profile_endpoint','MyCustomTabContent');

二、修改账户菜单项的动态链接

保留添加菜单项的逻辑,通过过滤器动态设置链接。假设用户提交表单后,动态ID(如12345)被存在用户元数据device_profile_id中:

function AddCustomTabMyAccount( $items ) {
    // 添加菜单项到账户菜单
    $items['device-profile'] = 'Device Profile';
    return $items;
}
add_filter('woocommerce_account_menu_items','AddCustomTabMyAccount');

// 动态生成菜单项链接
function CustomTabDynamicUrl( $url, $endpoint, $value, $user ) {
    if ( $endpoint === 'device-profile' ) {
        // 从用户元数据中获取已生成的设备ID
        $device_id = get_user_meta( $user->ID, 'device_profile_id', true );
        
        if ( $device_id ) {
            // 拼接目标动态URL
            $url = home_url( "/page_is_built/{$device_id}/" );
        } else {
            // 若用户未提交表单,跳转到表单页面(替换为你的表单实际URL)
            $url = home_url( "/submit-device-profile/" );
        }
    }
    return $url;
}
add_filter('woocommerce_get_endpoint_url', 'CustomTabDynamicUrl', 10, 4);

三、添加动态URL的重写规则

让WordPress能识别/page_is_built/12345/这类URL,需要注册重写规则:

function AddDeviceProfileRewriteRule() {
    add_rewrite_rule(
        '^page_is_built/([0-9]+)/?$',
        'index.php?device_profile_id=$matches[1]',
        'top'
    );
}
add_action('init', 'AddDeviceProfileRewriteRule');

// 注册自定义查询变量
function RegisterDeviceProfileQueryVar( $vars ) {
    $vars[] = 'device_profile_id';
    return $vars;
}
add_filter('query_vars', 'RegisterDeviceProfileQueryVar');

四、处理动态页面内容

通过钩子输出对应设备的页面内容,也可以创建独立模板文件(如page-device-profile.php)实现:

function RenderDeviceProfilePage() {
    global $wp_query;
    
    if ( isset( $wp_query->query_vars['device_profile_id'] ) ) {
        $device_id = $wp_query->query_vars['device_profile_id'];
        
        // 根据设备ID获取数据并输出内容
        echo "<h3>设备档案 #{$device_id}</h3>";
        echo "<p>这里展示该设备的详细信息</p>";
    } else {
        // 无有效ID时的提示
        echo "<h3>无效的设备ID</h3>";
        echo "<p>请先提交设备信息生成档案</p>";
    }
}
add_action('template_redirect', 'RenderDeviceProfilePage');

最后一步:刷新重写规则

完成配置后,进入WordPress后台「设置」→「固定链接」页面,点击「保存更改」,刷新重写规则使新配置生效。


内容的提问来源于stack exchange,提问作者Aaron Busch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:41:03