是否可以创建动态端点URL?

时间:2022-01-30 作者:Edegist

我想创建一个归档端点页面,该页面将基于分类术语slug创建一个动态slug。

e、 g.如果分类法是食物,而当前的术语是洋葱,我希望端点段塞看起来像onion-recipes.

www.domain.com/food/vegetables/onion/onion-recipes 给我一个404 即使在冲洗permalinks之后。

代码:

add_action( \'init\', function() {
    $term = get_queried_object();
    $ep_slug = $term->slug.\'-recipes\';
    add_rewrite_endpoint( $ep_slug, EP_PAGES );
} );

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

add_rewrite_endpoint() 仅支持static endpoint names 喜欢trackbackrecipes, 因此,如果需要动态端点name/slug,则您需要使用add_rewrite_rule() 相反

让你知道,即使add_rewrite_endpoint() 如果不支持动态名称/段塞,则您的代码将无法工作,因为您的函数运行得太早(通过init 挂钩)因此get_queried_object() 将返回null,这意味着$term 实际上不是一个对象(即使您在术语存档页上)。

所以对于food/onion/onion-recipes 结构或端点,其中onion 是术语slug,您可以使用add_rewrite_rule() 像这样:

add_action( \'init\', function () {
    // Adds a rewrite rule for /food/<term slug>/<term slug>-recipes where "food"
    // here is a custom taxonomy.
    add_rewrite_rule(
        \'food/(.+?)/([^/]+)-recipes/?$\',
        \'index.php?food=$matches[1]\',
        \'top\'
    );
} );
注意事项:

  1. (.+?) 是从当前URL路径读取的术语slug或path,slug可以是onion 或“a”;“目录”/类路径onion/child 如果您的分类法是分层的。

  2. ([^/]+) 也是一个术语slug,但没有/ (斜杠)。(我特意把它放在一个组中,以防您需要访问$matches[2])

    在上述正则表达式(RegEx)模式中(这是add_rewrite_rule()), 我使用了2个捕获组或子模式,URL中的每个组/子模式匹配将存储在一个名为$matches.

    因此,如果当前URL为https://example.com/food/onion/child/child-recipes, 然后$matches[1]onion/child, 鉴于$matches[2]child. 一、 e。food/(onion/child)/(child)-recipes — 注意括号。

您可以测试和使用上述正则表达式here on regex101.com.

另外,记住刷新重写规则!只需访问Permalink设置管理页面。

如果要为端点创建查询var,请更新,如下所示add_rewrite_endpoint() 默认情况下为,因此您可以使用get_query_var() 要从端点名称检索术语slug,可以使用query_vars hook 注册查询变量。

下面是一个示例,其中查询var(name)是food_recipe (请确保该名称尚未被使用,例如,现有的帖子类型或分类法):

add_filter( \'query_vars\', function ( $vars ) {
    $vars[] = \'food_recipe\';
    return $vars;
} );
之后,

更改重写规则的查询(第二个参数add_rewrite_rule()) 从…起index.php?food=$matches[1]index.php?food=$matches[1]&food_recipe=$matches[2]

然后再次刷新重写规则。:)

使用&food-info=recipes 在上述查询中,其中food-info 是一个自定义分类名称/slug,是的,您可以。任何查询参数WP_Query 接受,甚至自定义,都可以在那里使用,但查询是否返回任何帖子当然取决于是否有与查询匹配的帖子。:)

相关推荐

Dynamic Endpoints

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