admin管理员组

文章数量:1208155

I want to create an archive endpoint page that will have a dynamic slug, based on the taxonomy term slug.

e.g. If the taxonomy is Food and the current term is Onion, I want the endpoint slug to look like onion-recipes.

www.domain/food/vegetables/onion/onion-recipes Gives me a 404 even after flushing permalinks.

Code:

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

I want to create an archive endpoint page that will have a dynamic slug, based on the taxonomy term slug.

e.g. If the taxonomy is Food and the current term is Onion, I want the endpoint slug to look like onion-recipes.

www.domain.com/food/vegetables/onion/onion-recipes Gives me a 404 even after flushing permalinks.

Code:

add_action( 'init', function() {
    $term = get_queried_object();
    $ep_slug = $term->slug.'-recipes';
    add_rewrite_endpoint( $ep_slug, EP_PAGES );
} );
Share Improve this question edited Jan 31, 2022 at 16:47 Edegist asked Jan 30, 2022 at 1:51 EdegistEdegist 1331 silver badge10 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 3

add_rewrite_endpoint() only supports static endpoint names like trackback and recipes, so if you need a dynamic endpoint name/slug, then you would want to use add_rewrite_rule() instead.

And just so that you know, even if add_rewrite_endpoint() did support dynamic names/slugs, your code would not work because your function runs too early (via the init hook) and thus get_queried_object() would return a null, which means that $term is not actually an object (even if you were on a term archive page).

So for the food/onion/onion-recipes structure or endpoint, where onion is the term slug, you could use add_rewrite_rule() like so:

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

Things to note:

  1. (.+?) is a term slug or path which is read from the current URL path, and the slug could be onion or a "directory"/path like onion/child if your taxonomy is hierarchical.

  2. ([^/]+) is also a term slug, but without a / (slash). (I purposely put it in a group in case you'd need to access $matches[2])

  3. In the above regular expression (RegEx) pattern (which is the 1st parameter for add_rewrite_rule()), I used 2 capturing groups or subpatterns, and each group/subpattern match from the URL will be stored in an array named $matches.

    So if the current URL is https://example.com/food/onion/child/child-recipes, then $matches[1] is onion/child, whereas $matches[2] is child. I.e. food/(onion/child)/(child)-recipes — note the parentheses.

You can test and play with the above RegEx here on regex101.com.

Also, remember to flush the rewrite rules! Simply visit the Permalink Settings admin page.

Update

If you want to create a query var for your endpoint, just like what add_rewrite_endpoint() does by default, and so that you can use get_query_var() to retrieve the term slug from the endpoint name, you can use the query_vars hook to register your query var.

Here's an example where the query var (name) is food_recipe (make sure the name is not already in use, e.g. by an existing post type or taxonomy):

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

After that,

  1. Change the rewrite rule's query (the 2nd parameter for add_rewrite_rule()) from index.php?food=$matches[1] to index.php?food=$matches[1]&food_recipe=$matches[2]

  2. Then flush the rewrite rules, again. :)

And as for using &food-info=recipes in the above query, where food-info is a custom taxonomy name/slug, yes, you can. Any query args that WP_Query accepts, and even custom ones, can be used there, but whether the query would return any posts would of course depend on whether there are posts that matched the query. :)

本文标签: url rewritingIs it possible to create dynamic endpoint URLs