<?php

function bw_post_grid_request ($request) {

	$post_type = $request->get_param('post_type');
	if (empty($post_type)) $post_type = 'post';

	$meta = $request->get_param('meta');
	if (empty($meta) || !is_array($meta)) $meta = false;

	$tax = $request->get_param('tax');
	if (empty($tax) || !is_array($tax)) $tax = false;

	$posts_per_page = $request->get_param('posts_per_page');
	if (empty($posts_per_page)) $posts_per_page = 12;

	$paged = $request->get_param('paged');
	if (empty($paged)) $paged = 1;

	$order_by = $request->get_param('order_by');
	if (empty($order_by) || !is_array($order_by)) $order_by = false;

	return post_grid($post_type, $meta, $tax, $posts_per_page, $paged, $order_by);
}

// this query is run for the templates and the request more endpoint
function post_grid ($post_type, $meta = false, $tax = false, $posts_per_page = 20, $paged = 1, $order_by = false) {
	
	if (!empty($term) && !is_array($term)) $term = array($term);

	$args = array(
		'post_type'      => $post_type,
		'posts_per_page' => $posts_per_page,
		'paged'          => $paged,
	);
	if ($meta) {
		$args['meta_query'] = array();
		if (count($meta) > 1) $args['meta_query']['relation'] = 'AND';
		foreach ($meta as $key => $value) {
			if (is_array($value)) {
				$args['meta_query']["{$key}_clause"] = $value;
			} else {
				$args['meta_query']["{$key}_clause"] = array(
					'key'   => $key,
					'value' => $value
				);
			}
		}
	}
	if ($tax) {
		$args['tax_query'] = array();
		if (count($tax) > 1) $args['tax_query']['relation'] = 'AND';
		foreach ($tax as $taxonomy => $terms) {
			$args['tax_query'][] = array(
				'taxonomy' => $taxonomy,
				'field'    => 'slug',
				'terms'    => $terms
			);
		}
	}
	if ($order_by) {
		$args['orderby'] = array();
		foreach ($order_by as $index => $order) {
			if (!is_array($order)) return;
			if (!empty($order['is_meta']) && empty($args['meta_query']["{$order[key]}_clause"])) {
				$args['meta_query']["{$order[key]}_clause"] = array(
					'key'   => $order['key'],
					'compare' => 'EXISTS'
				);
				$order['key'] = "{$order[key]}_clause";
			}
			$args['orderby'][$order['key']] = $order['order'];
		}
	}

	$data = new stdClass();
	$data->posts = array();
	$results = new WP_Query($args);
	$data->found_posts = $results->found_posts;

	while ($results->have_posts()) {
		$results->the_post();

		$data->posts[] = $post = new stdClass();

		$post->title = get_the_title();
		$post->link = get_permalink();
		$post->excerpt = get_the_excerpt();

		if ($image = wp_get_attachment_image_src(get_post_thumbnail_id(), "thumbnail")) {
			$post->image = $image[0];
		}

		$post->meta = get_fields(get_the_ID());
		if (!is_array($post->meta)) $post->meta = array();
		$meta_raw = get_post_meta(get_the_ID());

		foreach ($meta_raw as $key => $values) {
			if (!is_array($values) || isset($post->meta[$key])) continue;
			$post->meta[$key] = array_pop(array_reverse($values));
		}

		$post->tax = array();
		foreach (get_object_taxonomies($post_type) as $taxonomy) {
			$post->tax[$taxonomy] = wp_get_object_terms(get_the_ID(), $taxonomy);
		}
	}
	wp_reset_postdata();
	return $data;
}
