On my homepage, I have a section where I have to display the last five featured posts, where a featured post is simply a post with a custom field is_featured set to 1.
I achieved what I want with two different type of codes:
Using wpdb
<?php
$featuredPosts = $wpdb->get_results("
SELECT ID, post_title FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE $wpdb->postmeta.meta_key = 'is_featured'
ORDER BY ID DESC LIMIT 5
");
if ($featuredPosts)
{
$htmlOutput="";
foreach ($featuredPosts as $featPost)
$htmlOutput .= '<br /><a href="'.get_permalink($featPost->ID).'">'.$featPost->post_title.'</a>';
}
echo $htmlOutput;
?>
According to the “Query Monitor” plugin, this query takes 0.1s and generates this SQL:
SELECT ID, post_title
FROM wp_posts LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id)
WHERE wp_postmeta.meta_key = 'is_featured'
ORDER BY ID DESC
LIMIT 5
Using WordPress’ native calls
<?php
$featuredPostsRevised = new WP_Query
(
array
(
'meta_query' => array
(
array
(
'key' => 'is_featured'
)
)
)
);
while($featuredPostsRevised->have_posts()) : $featuredPostsRevised->the_post();
?>
<br />
<a href="https://wordpress.stackexchange.com/questions/151837/<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
<?php
endwhile;
?>
According to the “Query Monitor” plugin, this query takes 0.2s and generates a somehow longer SQL:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta
ON (wp_posts.ID = wp_postmeta.post_id)
WHERE 1=1
AND wp_posts.post_type="post"
AND (wp_posts.post_status="publish"
OR wp_posts.post_status="private")
AND (wp_postmeta.meta_key = 'is_featured' )
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
My questions are:
-
How can I
prepare()
mywpdb
query? I tried but couldn’t manage because of the second parameter. -
After using prepare, am I right in assuming that in terms of security and performance,
wpdb
is indeed a better solution?