I’d like to combine wp_posts table and wp_postmeta table and get the posts before the date of custom field.
Code with only wp_posts table is below and it works fine
$posts = $wpdb->get_results( "SELECT DISTINCT MONTH( post_date ) AS month, YEAR( post_date ) AS year FROM $wpdb->posts WHERE post_status = 'publish' AND post_date <= now( ) AND $wpdb->posts.post_type = 'event' GROUP BY month , year ORDER BY year DESC, month ASC ");
I want to add “postmeta table” to “post table” and get only posts before the date of custom field
if it is “WP_Query”, meta query would be below
'meta_query' => array( array( 'key' => 'end_date', 'value' => date('Y/m/d'), 'type' => 'DATE', 'compare' => '>=', ) )`
I tried code below but it returns empty array.
$posts = $wpdb->get_results( "SELECT DISTINCT MONTH( post_date ) AS month, YEAR( post_date ) AS year FROM $wpdb->posts LEFT JOIN $wpdb->postmeta ON $wpdb->postmeta.post_id WHERE post_status = 'publish' AND post_date <= now( ) AND $wpdb->posts.post_type = 'event' AND $wpdb->postmeta.meta_key = 'end_date' AND $wpdb->postmeta.meta_value = date('Y/m/d') AND $wpdb->postmeta.meta_type = 'DATE' AND $wpdb->postmeta.meta_compare = '>=' GROUP BY month , year ORDER BY year DESC, month ASC ");
When it is added only meta_key, it returns the same result as “Code for only wp_posts table”(first code)
//same result as "Code for only wp_posts table" $posts = $wpdb->get_results( "SELECT DISTINCT MONTH( post_date ) AS month, YEAR( post_date ) AS year FROM $wpdb->posts LEFT JOIN $wpdb->postmeta ON $wpdb->postmeta.post_id WHERE post_status = 'publish' AND post_date <= now( ) AND $wpdb->posts.post_type = 'event' AND $wpdb->postmeta.meta_key = 'end_date' GROUP BY month , year ORDER BY year DESC, month ASC ");
I’d like to know how to add conditions “key”, “value” and “compare”.
I’m very beginner on SQL and hope someone help me.
Advertisement
Answer
The changes I see between your original and new queries are the LEFT JOIN
and the added conditions to your WHERE
clause. Adding a LEFT JOIN
to your initial query won’t result in an empty array unless one of these is true:
1) Your original query returned 0 rows
2) Your new query has additional filtering in the WHERE
clause
If you want to return all your initial rows (i.e. from $wpdb->posts
) and include any matching rows from $wpdb->postmeta
, then just move the extra AND
conditions from the WHERE
clause to the JOIN
:
LEFT JOIN $wpdb->postmeta ON $wpdb->postmeta.post_id -- join conditions AND $wpdb->postmeta.meta_key = 'end_date' AND $wpdb->postmeta.meta_value = date('Y/m/d') AND $wpdb->postmeta.meta_type = 'DATE' AND $wpdb->postmeta.meta_compare = '>=' -- filter conditions WHERE post_status = 'publish' AND post_date <= now( ) AND $wpdb->posts.post_type = 'event'