So I understand for the most part how the wp rest controller works, what it is doing and why it is the best way to do it. The trouble I am having is wrapping my head around the regular expressions in the endpoint URL for the function register_rest_route.

Regular expressions are what they are but I was wondering if someone could break it down for me in this context.

Some example code

register_rest_route( $this->namespace, '/' . $this->resource_name . '/(?P<id>[\d]+)', array(
        // Notice how we are registering multiple endpoints the 'schema' equates to an OPTIONS request.
            'methods'   => 'GET',
            'callback'  => array( $this, 'get_item' ),
            'permission_callback' => array( $this, 'get_item_permissions_check' ),
        // Register our schema callback.
        'schema' => array( $this, 'get_item_schema' ),
    ) );

So the (?P<id>[\d]+) confuses me a bit I understand it means that the parameter of id is required but what if I wanted multiple parameters and what if wanted to have a route that was something like /vendor/v1/geolocate/{param}/{param} or /vender/v1/?id={param}&address={param}

  • 3
    the regex part ([\d]+) means "a decimal part at least 1 time" and adding ?P<id> give the name "id" to this argument instead of just calling im "1" (as first argument). then you need something like /(?P<id>[\d]+)/(?P<address>[^/]+)
    – mmm
    Mar 13 '18 at 20:45
  • Would you recommend a particular piece of reading material to catch up on this? I have avoided regex for years and limped by on online code snippets. Perhaps it is time to put it to bed. By bed, I mean actually learn it. Mar 13 '18 at 20:49
  • One last question I also saw a regular expression like this /users/market=(?P<market>[a-zA-Z0-9-]+)/lat=(?P<lat>[a-z0-9 .\-]+)/long=(?P<long>[a-z0-9 .\-]+) Would this be called like /users/market={param}/lat={param}/long={param} Mar 13 '18 at 20:56
  • An easy way to test regex is by using a site like regex101.com. Enter your regex on top and then your test string underneath. On the right side you'll see the matching strings/groups.
    – swissspidy
    Mar 13 '18 at 21:55
  • @mmm very good explanation. Mar 17 '18 at 20:32

I have the same problem, i search on google finally with the help of the above answer i found out the solution. this may help others.

$this->base = home

        $namespace, '/' . $this->base . '/' .  'products' . '/', array(
                'methods'   => WP_REST_Server::READABLE, 
                'callback'  => array( $this, 'rest_api_popular_products'), 
        $namespace, '/' . $this->base . '/' .  'products' . '/(?P<category>[\d]+)/(?P<sort>[\w]+)', array(
            'args'   => array(
                'id' => array(
                    'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
                    'type'        => 'integer',
                'methods'             => WP_REST_Server::READABLE,
                'callback' => array( $this, 'rest_api_popular_products' ),                  
                'args'                => array(
                    'context' => $this->get_context_param( array( 'default' => 'view' ) ),

API request like : ..wp-json/wc/v2/home/products/?category=89&sort=popularity

  • Nice answer, thank you - I had to search quite a bit to find this solution. The answer to the original question is in this part of your code '/(?P<category>[\d]+)/(?P<sort>[\w]+)' where you have created 2 compulsory parameters labelled category and code.
    – Clinton
    Apr 29 '20 at 14:52
  • 2
    The API request URL will look like this wp-json/wc/v2/home/products/89/popularity May 3 '20 at 9:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.