/** * Parses a WordPress request. * * @param $wp * @return void */ public function parseRequest($wp) { if (!array_key_exists('herbert_route', $wp->query_vars)) { return; } $data = @json_decode($wp->query_vars['herbert_route'], true); $route = null; if (isset($data['id']) && isset($this->routes[$this->http->method()][$data['id']])) { $route = $this->routes[$this->http->method()][$data['id']]; } elseif (isset($data['name']) && isset($this->routes['named'][$data['name']])) { $route = $this->routes['named'][$data['name']]; } if (!isset($route)) { return; } if (!isset($data['parameters'])) { $data['parameters'] = []; } foreach ($data['parameters'] as $key => $val) { if (!isset($wp->query_vars['herbert_param_' . $key])) { return; } $data['parameters'][$key] = $wp->query_vars['herbert_param_' . $key]; } try { $this->processRequest($this->buildRoute($route, $data['parameters'])); } catch (HttpErrorException $e) { if ($e->getStatus() === 301 || $e->getStatus() === 302) { $this->processResponse($e->getResponse()); die; } if ($e->getStatus() === 404) { global $wp_query; $wp_query->set_404(); } status_header($e->getStatus()); define('HERBERT_HTTP_ERROR_CODE', $e->getStatus()); define('HERBERT_HTTP_ERROR_MESSAGE', $e->getMessage()); if ($e->getStatus() === 404) { @(include get_404_template()); } else { echo $e->getMessage(); } } die; }
/** * Return the correct callable based on action * * @param array $panel * @param boolean $strict * @return void */ protected function handler($panel, $strict = false) { $callable = $uses = $panel['uses']; $method = strtolower($this->http->method()); $action = strtolower($this->http->get('action', 'uses')); $callable = array_get($panel, $method, false) ?: $callable; if ($callable === $uses || is_array($callable)) { $callable = array_get($panel, $action, false) ?: $callable; } if ($callable === $uses || is_array($callable)) { $callable = array_get($panel, "{$method}.{$action}", false) ?: $callable; } if (is_array($callable)) { $callable = $uses; } if ($strict && $uses === $callable) { return false; } try { $this->call($callable); } catch (HttpErrorException $e) { if ($e->getStatus() === 301 || $e->getStatus() === 302) { $this->call(function () use(&$e) { return $e->getResponse(); }); } global $wp_query; $wp_query->set_404(); status_header($e->getStatus()); define('HERBERT_HTTP_ERROR_CODE', $e->getStatus()); define('HERBERT_HTTP_ERROR_MESSAGE', $e->getMessage()); Notifier::error('<strong>' . $e->getStatus() . '</strong>: ' . $e->getMessage()); do_action('admin_notices'); } return true; }