For an update to one of my web projects I went looking for a way to get the recent posts as JSON instead of using the RSS feed. I personally find JSON much easier to deal with than RSS, so that’s the route I wanted to take.
This does us a couple of other functions from my bag of tricks. The days_ago and shorten_string functions are used to make everything a bit friendlier.
// include our wordpress functions // change relative path to find your WP dir define('WP_USE_THEMES', false); require('./wp-config.php'); $wp->init(); $wp->parse_request(); $wp->query_posts(); $wp->register_globals(); $posts = get_posts(array( 'numberposts' => 5, 'offset' => 0, 'orderby' => 'post_date', 'order' => 'DESC', 'post_type' => 'post', 'post_status' => 'publish' )); $json = array(); $json['err'] = false; if ($posts) { foreach ($posts as $post) { $ray = array(); the_post(); $ray['id'] = $post->ID; $ray['date'] = $post->post_date; $ray['timestamp'] = strtotime($post->post_date); $ago = days_ago($ray['date'], date('n/j/Y g:i a')); $ray['ago'] = ($ago == "") ? false : $ago; $ray['contents'] = shorten_string(strip_tags($post->post_content), 40); $ray['link'] = $post->guid; $ray['title'] = $post->post_title; $ray['link'] = '<a href="'.$post->guid.'">'.$post->post_title.'</a>'; // New if <= 5 days ago $ray['isNew'] = date('U') - $ray['timestamp'] <= 60 * 60 * 24 * 5; $json['posts'][] = $ray; } } header('Content-type: application/json;'); echo json_encode($json);
A few lines to pay attention to:
4 – This is the path to the wp-blog-header.php file relative to where you put this code. As it’s written above this would go in the same folder as wp-blog-header. Had to update this one below because WordPress was returning a 404.
4-8 – This is the path to the wp-config.php file relative to where you put your script. As written, the script would be in the same folder as wp-config.php. Thanks to this post on Androgen.com for the fix to not have WordPress display a 404 error even though the page exists.
10-19 – Tells WP how many posts to get, and how to query them. What’s there will pull the 5 most recent posts out of any category, sorted by post date in descending order, and only posts that are published.
31 – Strips out any HTML tags from $post->post_content and uses shorten_string to limit it to 40 words. This is what I needed for my project, but it should be easy enough to change it for your needs.
37 – Flags the post as new if it was published within the past 5 days. Again, something I needed for my project that you may not need.
Thanx a lot! This is really helpfull for my Ajax web application.
That’s exactly what I was using it for, too.