I'm writing a WordPress plugin that displays a lists of all posts organized by month and year. Similar plugins exists, but those all seem to have huge overhead and an outrageous number of queries. I can get all the info I need with one query, but then I run into problems when I'm trying to display the permalink to each post.
Here is the problem:
The WordPress function
get_permalink($id) accepts $id as either an int or an object. If it's an object WordPress returns the permalink based on the users chosen structure; however, if it's an int, it turns the variable into an object first by querying the wp_posts table. This is a problem because if I have hundreds or thousands of posts, then suddenly I have that many queries too!
One obvious solution is, in my original query, to return post_date, post_category, etc. and create the permalink structure myself based on
get_option('permalink_structure'), but this doesn't seem very future proof, and then I'm also rewriting code that already exists within the WordPress core.
A second solution is to run
get_posts() and store the results in an array index by
post->ID. Then if I run something like
get_permalink($posts[$post_id]) I'm passing an object and it doesn't require an extra query.
The problem with this, though, is that querying all posts seems really expensive. A dump of the returned array reveals that all the post's content is contained in that variable, and that seems completely unnecessary.
Is it possible to do a new
get_posts and only return certain information -- namely, don't return all that unnecessary content data? If it's not possible, I think it certainly should be. After all, one of the main criticisms I hear about WordPress is that it's too slow.
Also, if anyone has any other suggestions for how I can achieve what I'm trying to do another way, that would be very helpful.