1

In WordPress, is there an action hook or anything which allows you to run a callback after the response to a custom REST API endpoint, registered via register_rest_route(), has been sent to the client? Ideally with the data of the request payload?

The closest thing we could find so far is the rest_post_dispatch hook, which however still happens before the response is sent to the client.

Context: The reason why we have to do this is to execute multiple API calls after a successful REST API call, whose completion is irrelevant for the response delivered to the client. Hence to avoid that the request processing time appears to be much longer than it needs to be, as these other API requests can take up to multiple seconds to be fully processed.

2 Answers 2

0

You can look into queues e.g. create a custom database table, and write to it within the rest_post_dispatch or rest_pre_serve_request filter just before it is dispatched.

Then you can bulk process the queue (first record in is the first record out) via e.g. wp-cron and the user will not be affected by that potentially heavy processing. A custom column for the processing status might be useful as well.

With a real cron (not wp-cron) you could better control the timing/frequency of the processing.

0

Hooks

I don't think the exact thing you're looking for exists. serve_request() echos the output, and then returns to rest_api_loaded(), which immediately dies.

The only action that runs after the request is echo'd to the output buffer is shutdown. That's a callback for register_shutdown_function(), so it runs after all the normal code paths have finished, but before the PHP process exits.

Even if you hooked into shutdown, though, the request still hasn't necessarily been sent to the client (that may vary a bit depending on server config, though).

I think it's worth considering if you need to wait until it's sent. Are there relevant differences between that point and the point at which the response has been generated? Using rest_post_dispatch -- or even rest_pre_echo_response if you want to be as late as possible -- would give you access to the request and its response. The response isn't going to change, unless another plugin modifies it. If you're worried about that, you could hook in at a later priority to avoid that.

Batching

If your routes support it, you may want to look into sending batch requests. By default all requests are processed, even if some of them fail.

Yet another approach would be to create your own endpoint, which uses an internal request to do the batching.

Your Answer

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

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