5

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.
        array(
            '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}

6
  • 4
    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>[^/]+) Commented Mar 13, 2018 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. Commented Mar 13, 2018 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} Commented Mar 13, 2018 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. Commented Mar 13, 2018 at 21:55
  • @mmm very good explanation. Commented Mar 17, 2018 at 20:32

1 Answer 1

3

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
register_rest_route( 

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

3
  • 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. Commented Apr 29, 2020 at 14:52
  • 3
    The API request URL will look like this wp-json/wc/v2/home/products/89/popularity Commented May 3, 2020 at 9:40
  • Is there a way to make the API request URL look something like this? wp-json/wc/v2/home/products?category=89&sort=popularity Commented Jun 13, 2023 at 22:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.