query->controller)) { return $json_api->controller_info($json_api->query->controller); } else { $dir = json_api_dir(); if (file_exists("$dir/json-api.php")) { $php = file_get_contents("$dir/json-api.php"); } else { // Check one directory up, in case json-api.php was moved $dir = dirname($dir); if (file_exists("$dir/json-api.php")) { $php = file_get_contents("$dir/json-api.php"); } } if (preg_match('/^\s*Version:\s*(.+)$/m', $php, $matches)) { $version = $matches[1]; } else { $version = '(Unknown)'; } $active_controllers = explode(',', get_option('json_api_controllers', 'core')); $controllers = array_intersect($json_api->get_controllers(), $active_controllers); return array( 'json_api_version' => $version, 'controllers' => array_values($controllers) ); } } public function get_recent_posts() { global $json_api; $posts = $json_api->introspector->get_posts(); return $this->posts_result($posts); } public function get_posts() { global $json_api; $url = parse_url($_SERVER['REQUEST_URI']); $defaults = array( 'ignore_sticky_posts' => true ); $query = wp_parse_args($url['query']); unset($query['json']); unset($query['post_status']); $query = array_merge($defaults, $query); $posts = $json_api->introspector->get_posts($query); $result = $this->posts_result($posts); $result['query'] = $query; return $result; } public function get_post() { global $json_api, $post; $post = $json_api->introspector->get_current_post(); if ($post) { $previous = get_adjacent_post(false, '', true); $next = get_adjacent_post(false, '', false); $response = array( 'post' => new JSON_API_Post($post) ); if ($previous) { $response['previous_url'] = get_permalink($previous->ID); } if ($next) { $response['next_url'] = get_permalink($next->ID); } return $response; } else { $json_api->error("Not found."); } } public function get_page() { global $json_api; extract($json_api->query->get(array('id', 'slug', 'page_id', 'page_slug', 'children'))); if ($id || $page_id) { if (!$id) { $id = $page_id; } $posts = $json_api->introspector->get_posts(array( 'page_id' => $id )); } else if ($slug || $page_slug) { if (!$slug) { $slug = $page_slug; } $posts = $json_api->introspector->get_posts(array( 'pagename' => $slug )); } else { $json_api->error("Include 'id' or 'slug' var in your request."); } // Workaround for https://core.trac.wordpress.org/ticket/12647 if (empty($posts)) { $url = $_SERVER['REQUEST_URI']; $parsed_url = parse_url($url); $path = $parsed_url['path']; if (preg_match('#^http://[^/]+(/.+)$#', get_bloginfo('url'), $matches)) { $blog_root = $matches[1]; $path = preg_replace("#^$blog_root#", '', $path); } if (substr($path, 0, 1) == '/') { $path = substr($path, 1); } $posts = $json_api->introspector->get_posts(array('pagename' => $path)); } if (count($posts) == 1) { if (!empty($children)) { $json_api->introspector->attach_child_posts($posts[0]); } return array( 'page' => $posts[0] ); } else { $json_api->error("Not found."); } } public function get_date_posts() { global $json_api; if ($json_api->query->date) { $date = preg_replace('/\D/', '', $json_api->query->date); if (!preg_match('/^\d{4}(\d{2})?(\d{2})?$/', $date)) { $json_api->error("Specify a date var in one of 'YYYY' or 'YYYY-MM' or 'YYYY-MM-DD' formats."); } $request = array('year' => substr($date, 0, 4)); if (strlen($date) > 4) { $request['monthnum'] = (int) substr($date, 4, 2); } if (strlen($date) > 6) { $request['day'] = (int) substr($date, 6, 2); } $posts = $json_api->introspector->get_posts($request); } else { $json_api->error("Include 'date' var in your request."); } return $this->posts_result($posts); } public function get_category_posts() { global $json_api; $category = $json_api->introspector->get_current_category(); if (!$category) { $json_api->error("Not found."); } $posts = $json_api->introspector->get_posts(array( 'cat' => $category->id )); return $this->posts_object_result($posts, $category); } public function get_tag_posts() { global $json_api; $tag = $json_api->introspector->get_current_tag(); if (!$tag) { $json_api->error("Not found."); } $posts = $json_api->introspector->get_posts(array( 'tag' => $tag->slug )); return $this->posts_object_result($posts, $tag); } public function get_author_posts() { global $json_api; $author = $json_api->introspector->get_current_author(); if (!$author) { $json_api->error("Not found."); } $posts = $json_api->introspector->get_posts(array( 'author' => $author->id )); return $this->posts_object_result($posts, $author); } public function get_search_results() { global $json_api; if ($json_api->query->search) { $posts = $json_api->introspector->get_posts(array( 's' => $json_api->query->search )); } else { $json_api->error("Include 'search' var in your request."); } return $this->posts_result($posts); } public function get_date_index() { global $json_api; $permalinks = $json_api->introspector->get_date_archive_permalinks(); $tree = $json_api->introspector->get_date_archive_tree($permalinks); return array( 'permalinks' => $permalinks, 'tree' => $tree ); } public function get_category_index() { global $json_api; $args = null; if (!empty($json_api->query->parent)) { $args = array( 'parent' => $json_api->query->parent ); } $categories = $json_api->introspector->get_categories($args); return array( 'count' => count($categories), 'categories' => $categories ); } public function get_tag_index() { global $json_api; $tags = $json_api->introspector->get_tags(); return array( 'count' => count($tags), 'tags' => $tags ); } public function get_author_index() { global $json_api; $authors = $json_api->introspector->get_authors(); return array( 'count' => count($authors), 'authors' => array_values($authors) ); } public function get_page_index() { global $json_api; $pages = array(); $post_type = $json_api->query->post_type ? $json_api->query->post_type : 'page'; // Thanks to blinder for the fix! $numberposts = empty($json_api->query->count) ? -1 : $json_api->query->count; $wp_posts = get_posts(array( 'post_type' => $post_type, 'post_parent' => 0, 'order' => 'ASC', 'orderby' => 'menu_order', 'numberposts' => $numberposts )); foreach ($wp_posts as $wp_post) { $pages[] = new JSON_API_Post($wp_post); } foreach ($pages as $page) { $json_api->introspector->attach_child_posts($page); } return array( 'pages' => $pages ); } public function get_nonce() { global $json_api; extract($json_api->query->get(array('controller', 'method'))); if ($controller && $method) { $controller = strtolower($controller); if (!in_array($controller, $json_api->get_controllers())) { $json_api->error("Unknown controller '$controller'."); } require_once $json_api->controller_path($controller); if (!method_exists($json_api->controller_class($controller), $method)) { $json_api->error("Unknown method '$method'."); } $nonce_id = $json_api->get_nonce_id($controller, $method); return array( 'controller' => $controller, 'method' => $method, 'nonce' => wp_create_nonce($nonce_id) ); } else { $json_api->error("Include 'controller' and 'method' vars in your request."); } } protected function get_object_posts($object, $id_var, $slug_var) { global $json_api; $object_id = "{$type}_id"; $object_slug = "{$type}_slug"; extract($json_api->query->get(array('id', 'slug', $object_id, $object_slug))); if ($id || $$object_id) { if (!$id) { $id = $$object_id; } $posts = $json_api->introspector->get_posts(array( $id_var => $id )); } else if ($slug || $$object_slug) { if (!$slug) { $slug = $$object_slug; } $posts = $json_api->introspector->get_posts(array( $slug_var => $slug )); } else { $json_api->error("No $type specified. Include 'id' or 'slug' var in your request."); } return $posts; } protected function posts_result($posts) { global $wp_query; return array( 'count' => count($posts), 'count_total' => (int) $wp_query->found_posts, 'pages' => $wp_query->max_num_pages, 'posts' => $posts ); } protected function posts_object_result($posts, $object) { global $wp_query; // Convert something like "JSON_API_Category" into "category" $object_key = strtolower(substr(get_class($object), 9)); return array( 'count' => count($posts), 'pages' => (int) $wp_query->max_num_pages, $object_key => $object, 'posts' => $posts ); } } ?>