Last active
April 14, 2016 08:24
-
-
Save pat-eason/433ed248ae5194fcb6a9 to your computer and use it in GitHub Desktop.
WordPress post+terms+fields query
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
//create our mega query with post data, meta fields, and taxonomies | |
function get_posts_terms_fields($params=null){ | |
global $wpdb; | |
$defaults=array( | |
'posts_per_page' => 5, | |
'offset' => 0, | |
'category' => '', | |
'category_name' => '', | |
'orderby' => 'post_date', | |
'order' => 'DESC', | |
'include' => '', | |
'exclude' => '', | |
'meta_key' => '', | |
'meta_value' => '', | |
'post_type' => 'post', | |
'post_mime_type' => '', | |
'post_parent' => '', | |
'post_status' => 'publish', | |
'suppress_filters' => true | |
); | |
$args = wp_parse_args($params, $defaults); | |
//query args compile | |
$qArr = array(); | |
//post_type | |
if($args['post_type']){ | |
$query_include = $args['post_type']; | |
array_push($qArr, "$wpdb->posts.post_type = '$query_include'"); | |
} | |
//include | |
if($args['include'] && is_array($args['include'])){ | |
$query_include = implode(',', $args['include']); | |
array_push($qArr, "$wpdb->posts.ID IN ($query_include)"); | |
} | |
//exclude | |
if($args['exclude'] && is_array($args['exclude'])){ | |
$query_include = implode(',', $args['exclude']); | |
array_push($qArr, "$wpdb->posts.ID NOT IN ($query_include)"); | |
} | |
//post_type | |
if(is_int($args['post_parent'])){ | |
$query_include = $args['post_parent']; | |
array_push($qArr, "$wpdb->posts.post_parent = $query_include"); | |
} | |
if(is_array($args['post_parent'])){ | |
$query_include = implode(',', $args['post_parent']); | |
array_push($qArr, "$wpdb->posts.post_parent IN ($query_include)"); | |
} | |
//post_status | |
if($args['post_status']){ | |
$query_include = $args['post_status']; | |
array_push($qArr, "$wpdb->posts.post_status = '$query_include'"); | |
} | |
//post_mime_type | |
if($args['post_mime_type']){ | |
$query_include = $args['post_mime_type']; | |
array_push($qArr, "$wpdb->posts.post_mime_type = '$query_include'"); | |
} | |
unset($query_include); | |
//meta_key & meta_include | |
if($args['meta_key'] && $args['meta_include']){ | |
$query_includeA = $args['meta_key']; | |
$query_includeB = $args['meta_include']; | |
array_push($qArr, "($wpdb->posts.ID = meta.post_id AND meta.meta_key = '$query_includeA' AND meta.meta_value = '$query_includeB')"); | |
} | |
$query_args = implode(' AND ', $qArr); | |
//limit/offset & order/orderby vars | |
$order = $args['order']; | |
$orderby = $args['orderby']; | |
$limit = $args['posts_per_page']; | |
$offset = $args['offset']; | |
$query_limit = ""; | |
if($limit > -1){ | |
$query_limit = "LIMIT $limit OFFSET $offset"; | |
} | |
if($limit == 0){ | |
$query_limit = "LIMIT 1 OFFSET $offset"; | |
} | |
//build query | |
mysql_query("SET SESSION group_concat_max_len = 100000;"); | |
$query = "SELECT $wpdb->posts.ID as ID, | |
$wpdb->posts.post_date as post_date, | |
$wpdb->posts.post_content as post_content, | |
$wpdb->posts.post_title as post_title, | |
$wpdb->posts.post_excerpt as post_excerpt, | |
$wpdb->posts.post_status as post_status, | |
$wpdb->posts.comment_status as comment_status, | |
$wpdb->posts.post_name as post_name, | |
$wpdb->posts.post_parent as post_parent, | |
$wpdb->posts.guid as guid, | |
$wpdb->posts.post_type as post_type, | |
$wpdb->posts.comment_count as comment_count, | |
GROUP_CONCAT(DISTINCT CONCAT(meta.meta_key,' | ',meta.meta_value) ORDER BY $wpdb->posts.ID SEPARATOR ' ;|; ') as meta, | |
GROUP_CONCAT(DISTINCT CONCAT(wtt.taxonomy,' | ',tax.term_id,' | ',tax.slug,' | ',tax.name) ORDER BY $wpdb->posts.ID SEPARATOR ' ;|; ') as taxonomy | |
FROM $wpdb->posts | |
LEFT JOIN $wpdb->postmeta AS meta ON ($wpdb->posts.ID = meta.post_id) | |
LEFT JOIN $wpdb->term_relationships AS wtr ON ($wpdb->posts.ID = wtr.`object_id`) | |
LEFT JOIN $wpdb->term_taxonomy AS wtt ON (wtr.`term_taxonomy_id` = wtt.`term_taxonomy_id`) | |
LEFT JOIN $wpdb->terms AS tax ON (tax.`term_id` = wtt.`term_id`) | |
WHERE | |
$query_args | |
GROUP BY $wpdb->posts.ID | |
ORDER BY $wpdb->posts.$orderby $order | |
$query_limit"; | |
$output = array(); | |
//get posts | |
$posts = $wpdb->get_results($query); | |
foreach($posts as $post){ | |
//break up meta | |
$meta = array(); | |
$metaArr = explode(" ;|; ", $post->meta); | |
foreach($metaArr as $m){ | |
$m = explode(' | ', $m); | |
$ma = array( | |
$m[0] => $m[1] | |
); | |
array_push($meta, $ma); | |
} | |
$post->meta = $meta; | |
//break up terms | |
$taxonomy = array(); | |
$taxArr = explode(" ;|; ", $post->taxonomy); | |
foreach($taxArr as $t){ | |
$t = explode(' | ', $t); | |
$ta = array( | |
'taxonomy' => $t[0], | |
'term_id' => $t[1], | |
'slug' => $t[2], | |
'name' => $t[3] | |
); | |
array_push($taxonomy, $ta); | |
} | |
$post->taxonomy = $taxonomy; | |
array_push($output, $post); | |
//crush meta arrays | |
$post->meta = array_reduce($post->meta, 'array_merge', array()); | |
} | |
return $output; | |
} | |
function get_post_terms_fields($post_id=null){ | |
global $wpdb; | |
if(!$post_id || !is_numeric($post_id)){ | |
return false; | |
} | |
//build query | |
mysql_query("SET SESSION group_concat_max_len = 100000;"); | |
$query = "SELECT $wpdb->posts.ID as ID, | |
$wpdb->posts.post_date as post_date, | |
$wpdb->posts.post_content as post_content, | |
$wpdb->posts.post_title as post_title, | |
$wpdb->posts.post_excerpt as post_excerpt, | |
$wpdb->posts.post_status as post_status, | |
$wpdb->posts.comment_status as comment_status, | |
$wpdb->posts.post_name as post_name, | |
$wpdb->posts.post_parent as post_parent, | |
$wpdb->posts.guid as guid, | |
$wpdb->posts.post_type as post_type, | |
$wpdb->posts.comment_count as comment_count, | |
GROUP_CONCAT(DISTINCT CONCAT(meta.meta_key,' | ',meta.meta_value) ORDER BY $wpdb->posts.ID SEPARATOR ' ;|; ') as meta, | |
GROUP_CONCAT(DISTINCT CONCAT(wtt.taxonomy,' | ',tax.term_id,' | ',tax.slug,' | ',tax.name) ORDER BY $wpdb->posts.ID SEPARATOR ' ;|; ') as taxonomy | |
FROM $wpdb->posts | |
LEFT JOIN $wpdb->postmeta AS meta ON ($wpdb->posts.ID = meta.post_id) | |
LEFT JOIN $wpdb->term_relationships AS wtr ON ($wpdb->posts.ID = wtr.`object_id`) | |
LEFT JOIN $wpdb->term_taxonomy AS wtt ON (wtr.`term_taxonomy_id` = wtt.`term_taxonomy_id`) | |
LEFT JOIN $wpdb->terms AS tax ON (tax.`term_id` = wtt.`term_id`) | |
WHERE | |
$wpdb->posts.ID = $post_id | |
GROUP BY $wpdb->posts.ID"; | |
//get posts | |
$post = $wpdb->get_row($query); | |
//break up meta | |
$meta = array(); | |
$metaArr = explode(" ;|; ", $post->meta); | |
foreach($metaArr as $m){ | |
$m = explode(' | ', $m); | |
$ma = array( | |
$m[0] => $m[1] | |
); | |
array_push($meta, $ma); | |
} | |
$post->meta = $meta; | |
//break up terms | |
$taxonomy = array(); | |
$taxArr = explode(" ;|; ", $post->taxonomy); | |
foreach($taxArr as $t){ | |
$t = explode(' | ', $t); | |
$ta = array( | |
'taxonomy' => $t[0], | |
'term_id' => $t[1], | |
'slug' => $t[2], | |
'name' => $t[3] | |
); | |
array_push($taxonomy, $ta); | |
} | |
$post->taxonomy = $taxonomy; | |
//crush meta arrays | |
$post->meta = array_reduce($post->meta, 'array_merge', array()); | |
return $post; | |
} | |
//filter tax form mega query | |
function get_object_taxonomy($taxobj, $tax){ | |
$filter = array_filter($taxobj, function($v) use($tax){ | |
return $v['taxonomy'] == $tax; | |
}); | |
if($filter == null){ | |
return false; | |
} | |
return $filter; | |
} | |
//return implode for taxonomy | |
function get_implode_taxonomy($taxobj, $field){ | |
$output = array(); | |
foreach($filter as $tax){ | |
array_push($output, $tax[$field]); | |
} return implode(' ', $output); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment