Skip to content

Instantly share code, notes, and snippets.

@pat-eason
Last active April 14, 2016 08:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pat-eason/433ed248ae5194fcb6a9 to your computer and use it in GitHub Desktop.
Save pat-eason/433ed248ae5194fcb6a9 to your computer and use it in GitHub Desktop.
WordPress post+terms+fields query
<?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