Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make WordPress WP-API faster by not loading theme and plugins

I would like to make requests to the WordPress API much faster. My API is implemented in a plugin (using register_rest_route to register my routes). However, since this is a plugin, everything is loaded with it (the child-theme and the theme) and basically a query to this API is taking half a second because of all this useless parts loaded.

Doesn't WordPress API can be used in another way? Since most plugin making use of the WP-API doesn't need any other plugins to be loaded, even less a theme... I don't understand how they could miss that.

Is there anyway to do this?

like image 850
TigrouMeow Avatar asked Apr 01 '16 06:04

TigrouMeow


People also ask

Is WordPress REST API fast?

We use REST-API for our Android and iOS apps to get posts, etc., without caching this costs a lot of CPU. With this plugin it takes NO CPU and it's really fast!


1 Answers

Yes, it is possible. In one of my plugins where I need the minimal WordPress core (DB without plugins & themes) here is what I do:

<?php

define('SHORTINIT', true);  // load minimal WordPress

require_once PATH_TO_WORDPRESS . '/wp-load.php'; // WordPress loader

// use $wpdb here, no plugins or themes were loaded

The PATH_TO_WORDPRESS constant I made up; you just need to point that to the correct path. In plugins for example, it might look like:

require_once dirname(__FILE__) . '/../../../wp-load.php'; // backwards 'plugin-dir/plugins/wp-content'

Setting SHORTINIT to true certainly does help performance a bit.

With WP_DEBUG disabled, the time it takes to bootstrap WordPress are as follows:

  • Without SHORTINIT: ~0.045 seconds
  • With SHORTINIT: ~0.0015 seconds

If this is for your own site where you demand performance, you can probably increase this a bit by enabling an OpCache (e.g. APC or PHP OpCache in recent versions).

But I believe the 2 lines of code above to define SHORTINIT and require wp-load.php are what you're looking for.

To clarify, this file is a part of a plugin, but it is called independently of WordPress itself (via Ajax and directly). It never gets included or used by any other parts of the plugin or WP itself.

EDIT: Since the OP is actually concerned with the WP-API, not WordPress in general, I am adding this to address the actual question. I'll leave the original answer content in case it can help someone else.

I did further testing with the WP API and like @David said in his answer, the issue is probably something else.

I loaded up 12 plugins in addition to the rest api, some fairly "large" plugins, and my local install has about 25 themes installed (one active of course). I edited WordPress' index.php file and used microtime(true) to record when everything started, and then edited one of the REST controllers to calculate how long it took from start to getting to the API endpoint.

The result on my system is consistently around 0.0462 - 0.0513 seconds (no PHP OpCache, and no other system load). So it appears bootstrapping all of WordPress has little impact on performance.

If the requests are taking half a second, the bottleneck is elsewhere and cutting out plugins and themes is going to have minimal impact. At least this is what I found.

like image 163
drew010 Avatar answered Nov 16 '22 02:11

drew010