This repository has been archived on 2026-11-04. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
wp-json-api/singletons/introspector.php
T
2011-03-25 12:22:44 -04:00

300 lines
7.9 KiB
PHP

<?php
class JSON_API_Introspector {
public function get_posts($query = false, $wp_posts = false) {
global $post;
$this->set_posts_query($query);
$output = array();
while (have_posts()) {
the_post();
if ($wp_posts) {
$output[] = $post;
} else {
$output[] = new JSON_API_Post($post);
}
}
return $output;
}
public function get_date_archive_permalinks() {
$archives = wp_get_archives('echo=0');
preg_match_all("/href='([^']+)'/", $archives, $matches);
return $matches[1];
}
public function get_date_archive_tree($permalinks) {
$tree = array();
foreach ($permalinks as $url) {
if (preg_match('#(\d{4})/(\d{2})#', $url, $date)) {
$year = $date[1];
$month = $date[2];
} else if (preg_match('/(\d{4})(\d{2})/', $url, $date)) {
$year = $date[1];
$month = $date[2];
} else {
continue;
}
$count = $this->get_date_archive_count($year, $month);
if (empty($tree[$year])) {
$tree[$year] = array(
$month => $count
);
} else {
$tree[$year][$month] = $count;
}
}
return $tree;
}
public function get_date_archive_count($year, $month) {
if (!isset($this->month_archives)) {
global $wpdb;
$post_counts = $wpdb->get_results("
SELECT DATE_FORMAT(post_date, '%Y%m') AS month,
COUNT(ID) AS post_count
FROM $wpdb->posts
WHERE post_status = 'publish'
AND post_type = 'post'
GROUP BY month
");
$this->month_archives = array();
foreach ($post_counts as $post_count) {
$this->month_archives[$post_count->month] = $post_count->post_count;
}
}
return $this->month_archives["$year$month"];
}
public function get_categories() {
$wp_categories = get_categories();
$categories = array();
foreach ($wp_categories as $wp_category) {
if ($wp_category->term_id == 1 && $wp_category->slug == 'uncategorized') {
continue;
}
$categories[] = $this->get_category_object($wp_category);
}
return $categories;
}
public function get_current_category() {
global $json_api;
extract($json_api->query->get(array('id', 'slug', 'category_id', 'category_slug')));
if ($id || $category_id) {
if (!$id) {
$id = $category_id;
}
return $this->get_category_by_id($id);
} else if ($slug || $category_slug) {
if (!$slug) {
$slug = $category_slug;
}
return $this->get_category_by_slug($slug);
} else {
$json_api->error("Include 'id' or 'slug' var in your request.");
}
return null;
}
public function get_category_by_id($category_id) {
$wp_category = get_term_by('id', $category_id, 'category');
return $this->get_category_object($wp_category);
}
public function get_category_by_slug($category_slug) {
$wp_category = get_term_by('slug', $category_slug, 'category');
return $this->get_category_object($wp_category);
}
public function get_tags() {
$wp_tags = get_tags();
return array_map(array(&$this, 'get_tag_object'), $wp_tags);
}
public function get_current_tag() {
global $json_api;
extract($json_api->query->get(array('id', 'slug', 'tag_id', 'tag_slug')));
if ($id || $tag_id) {
if (!$id) {
$id = $tag_id;
}
return $this->get_tag_by_id($id);
} else if ($slug || $tag_slug) {
if (!$slug) {
$slug = $tag_slug;
}
return $this->get_tag_by_slug($slug);
} else {
$json_api->error("Include 'id' or 'slug' var in your request.");
}
return null;
}
public function get_tag_by_id($tag_id) {
$wp_tag = get_term_by('id', $tag_id, 'post_tag');
return $this->get_tag_object($wp_tag);
}
public function get_tag_by_slug($tag_slug) {
$wp_tag = get_term_by('slug', $tag_slug, 'post_tag');
return $this->get_tag_object($wp_tag);
}
public function get_authors() {
global $wpdb;
$author_ids = $wpdb->get_col($wpdb->prepare("
SELECT u.ID, m.meta_value AS last_name
FROM $wpdb->users AS u,
$wpdb->usermeta AS m
WHERE m.user_id = u.ID
AND m.meta_key = 'last_name'
ORDER BY last_name
"));
$all_authors = array_map(array(&$this, 'get_author_by_id'), $author_ids);
$active_authors = array_filter($all_authors, array(&$this, 'is_active_author'));
return $active_authors;
}
public function get_current_author() {
global $json_api;
extract($json_api->query->get(array('id', 'slug', 'author_id', 'author_slug')));
if ($id || $author_id) {
if (!$id) {
$id = $author_id;
}
return $this->get_author_by_id($id);
} else if ($slug || $author_slug) {
if (!$slug) {
$slug = $author_slug;
}
return $this->get_author_by_login($slug);
} else {
$json_api->error("Include 'id' or 'slug' var in your request.");
}
return null;
}
public function get_author_by_id($id) {
$id = get_the_author_meta('ID', $id);
if (!$id) {
return null;
}
return new JSON_API_Author($id);
}
public function get_author_by_login($login) {
global $wpdb;
$id = $wpdb->get_var($wpdb->prepare("
SELECT ID
FROM $wpdb->users
WHERE user_nicename = %s
", $login));
return $this->get_author_by_id($id);
}
public function get_comments($post_id) {
global $wpdb;
$wp_comments = $wpdb->get_results($wpdb->prepare("
SELECT *
FROM $wpdb->comments
WHERE comment_post_ID = %d
AND comment_approved = 1
AND comment_type = ''
ORDER BY comment_date
", $post_id));
$comments = array();
foreach ($wp_comments as $wp_comment) {
$comments[] = new JSON_API_Comment($wp_comment);
}
return $comments;
}
public function get_attachments($post_id) {
$wp_attachments = get_children(array(
'post_type' => 'attachment',
'post_parent' => $post_id,
'orderby' => 'menu_order',
'order' => 'ASC'
));
$attachments = array();
if (!empty($wp_attachments)) {
foreach ($wp_attachments as $wp_attachment) {
$attachments[] = new JSON_API_Attachment($wp_attachment);
}
}
return $attachments;
}
public function attach_child_posts(&$post) {
$post->children = array();
$wp_children = get_posts(array(
'post_type' => $post->type,
'post_parent' => $post->id,
'order' => 'ASC',
'orderby' => 'menu_order'
));
foreach ($wp_children as $wp_post) {
$post->children[] = new JSON_API_Post($wp_post);
}
foreach ($post->children as $child) {
$this->attach_child_posts($child);
}
}
protected function get_category_object($wp_category) {
if (!$wp_category) {
return null;
}
return new JSON_API_Category($wp_category);
}
protected function get_tag_object($wp_tag) {
if (!$wp_tag) {
return null;
}
return new JSON_API_Tag($wp_tag);
}
protected function is_active_author($author) {
if (!isset($this->active_authors)) {
$this->active_authors = explode(',', wp_list_authors(array(
'html' => false,
'echo' => false,
'exclude_admin' => false
)));
$this->active_authors = array_map('trim', $this->active_authors);
}
return in_array($author->name, $this->active_authors);
}
protected function set_posts_query($query = false) {
global $json_api, $wp_query;
if (!$query) {
$query = array();
}
$query = array_merge($query, $wp_query->query);
if ($json_api->query->page) {
$query['paged'] = $json_api->query->page;
}
if ($json_api->query->count) {
$query['posts_per_page'] = $json_api->query->count;
}
if ($json_api->query->post_type) {
$query['post_type'] = $json_api->query->post_type;
}
if (!empty($query)) {
query_posts($query);
}
}
}
?>