core = $core;
}
/**
* Register endpoints.
*/
public function rest_api_init() {
$namespace = Service::getNamespace($this->getCore());
register_rest_route($namespace, '/plugin', [
'methods' => 'GET',
'callback' => [$this, 'routePlugin'],
'permission_callback' => '__return_true'
]);
}
/**
* Response for /plugin route.
*/
public function routePlugin() {
return new WP_REST_Response($this->getCore()->getPluginData());
}
/**
* Get core instance.
*
* @return PluginReceiver
* @codeCoverageIgnore
*/
public function getCore() {
return $this->core;
}
/**
* Show a notice for `corruptRestApi.tsx`.
*/
public function admin_notices() {
if (!isset($GLOBALS[self::NOTICE_CORRUPT_REST_API_ID])) {
$GLOBALS[self::NOTICE_CORRUPT_REST_API_ID] = true;
$securityPlugins = $this->getSecurityPlugins();
echo sprintf(
'
',
sprintf(
// translators:
__(
'One or more WordPress plugins tried to call the WordPress REST API, which failed. Most likely a security plugin%s or a web server configuration disabled the REST API. Please make sure that the following REST API namespaces are reachable to use your plugin without problems:',
'devowl-wp-utils'
),
count($securityPlugins) > 0 ? ' (' . join(', ', $securityPlugins) . ')' : ''
),
sprintf(
// translators:
__('What is the WordPress REST API and how to enable it? %1$sLearn more%2$s.', 'devowl-wp-utils'),
'',
''
)
);
}
}
/**
* Get all active security plugins which can limit the WP REST API.
*
* @return string[]
*/
public function getSecurityPlugins() {
$result = [];
$plugins = get_option('active_plugins');
// @codeCoverageIgnoreStart
if (!defined('PHPUNIT_FILE')) {
require_once ABSPATH . '/wp-admin/includes/plugin.php';
}
// @codeCoverageIgnoreEnd
foreach ($plugins as $pluginFile) {
foreach (self::SECURITY_PLUGINS_BLOCKING_REST_API as $slug) {
if (strpos($pluginFile, $slug, 0) === 0) {
$result[] = get_plugin_data(constant('WP_PLUGIN_DIR') . '/' . $pluginFile)['Name'];
}
}
}
return $result;
}
/**
* Get the wp-json URL for a defined REST service.
*
* @param string $instance The plugin class instance, so we can determine the slug from
* @param string $namespace The prefix for REST service
* @param string $endpoint The path appended to the prefix
* @return string Example: https://example.com/wp-json
*/
public static function getUrl($instance, $namespace = null, $endpoint = '') {
$path = ($namespace === null ? Service::getNamespace($instance) : $namespace) . '/' . $endpoint;
return rest_url($path);
}
/**
* Get the default namespace of this plugin generated from the slug.
*
* @param string $instance The plugin class instance, so we can determine the slug from
* @param string $version The version used for this namespace
* @return string
*/
public static function getNamespace($instance, $version = 'v1') {
return $instance->getPluginConstant(PluginReceiver::$PLUGIN_CONST_SLUG) . '/' . $version;
}
/**
* Get a new instance of Service.
*
* @param PluginReceiver $core
* @return Service
* @codeCoverageIgnore Instance getter
*/
public static function instance($core) {
return new Service($core);
}
}