接受查询参数的自定义帐户页

时间:2020-03-21 作者:chrispytoes

我正在尝试添加一个新的帐户子菜单页,该子菜单页采用查询参数。

我有以下有效方法:

add_action(\'init\', function() {
  add_rewrite_endpoint(\'scheduled-order-create\', EP_PAGES);
});

add_action(\'woocommerce_account_scheduled-order-create_endpoint\', function() {
  include \'scheduled-order-create.php\';
});
然后我可以在/my-account/scheduled-order-create.

现在,我希望此页面接受查询参数,但如果我只导航到/my-account/scheduled-order-create?product=1 页面为404。

我试过这个init 挂钩:

add_action(\'init\', function() {
  add_rewrite_tag(\'%product%\', \'([0-9]+)\');
  add_rewrite_endpoint(\'scheduled-orders\', EP_PAGES);
  add_rewrite_endpoint("scheduled-order-create/([0-9]+)/?", \'index.php?product=$matches[1]\', EP_PAGES);
});
但现在页面始终是404,即使没有参数。

在所有更改之后,我正在刷新permalinks页面。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

那个add_rewrite_endpoint("scheduled-order-create/([0-9]+)/?", ...); 不起作用,因为add_rewrite_endpoint() 不适用于自定义正则表达式模式。

记住,除了默认的公共查询变量之外cat, tag, yearauthor, WordPress还提供所有公共帖子类型和分类(非空query_var 注册时的值—看见register_post_type()register_taxonomy()) 可以从URL读取并与主查询一起使用,因此请确保您的查询字符串名称与这些查询变量不冲突。否则,你最终会404 错误,因为WordPress尝试查询本应查询的内容以外的内容。

因此,尽管如此add_rewrite_endpoint(\'scheduled-order-create\', EP_PAGES); 确实有效,导航到/my-account/scheduled-order-create?product=1 中的结果404 错误,因为WordPress(或WP_Query) 找不到(公共/已发布)product 用slug发布1 —product 是WooCommerce注册的帖子类型,查询变量默认为帖子类型slug。

因此,您需要为URL查询字符串使用其他名称,例如使用prod_id 代替product 如中所示https://example.com/my-account/scheduled-order-create?prod_id=1.

在WooCommerce中,实际上有一个过滤器挂钩,可以用来轻松添加自定义my-account 端点,我会使用该挂钩,除非我想为所有页面启用端点:

add_filter( \'woocommerce_get_query_vars\', function ( $query_vars ) {
    $query_vars[\'scheduled-order-create\'] = \'scheduled-order-create\';
    return $query_vars;
} );
但是,您仍然需要刷新/重新生成永久链接(只需访问永久链接设置页面)。

附加代码,或作为使用prod_id URL中的查询字符串。

您可以使用基于路径的重写端点,例如scheduled-order-create/product:

// Manually using add_rewrite_endpoint():
add_action( \'init\', function () {
    add_rewrite_endpoint( \'scheduled-order-create/product\', EP_PAGES,
      \'scheduled-order-create\' );
} );

// Or using the WooCommerce\'s filter hook:
add_filter( \'woocommerce_get_query_vars\', function ( $query_vars ) {
    $query_vars[\'scheduled-order-create\'] = \'scheduled-order-create/product\';
    return $query_vars;
} );

// To get the product ID (e.g. 123 as in example.com/my-account/scheduled-order-create/product/123):
$product_id = get_query_var( \'scheduled-order-create\' );

相关推荐

Dynamic Endpoints

我在WordPress外部有一个数据库表,需要为其创建端点。我已经创建了一个页面/cars/ 我计划使用页面模板生成链接。我希望url看起来像/cars/camaro/ ()/cars/%model%/ ). 起初,我认为我可以使用端点,但不知道如何根据从模型表中提取的段塞使它们动态。我也不确定使用Permalink结构标签是更容易还是更好。我甚至不完全确定从哪里开始,我以前创建过“静态”端点,所以我有一个基础可以跳出,但当我到达request 我不知道该怎么办。/** * Add endpoi