The last couple of days have been very hectic for me for finding a solution regarding how to write code for multiple meta queries for custom fields, and as I am a great fan of ACF(Advanced Custom Fields) I prefer using ACF, because it’s very easy to create fields and display values on front-end side.

In my last project, my task was to display results based on the search with pagination. I had so much googled and posted a question on Stackoverflow and WordPress forums but did not get any proper answer. Then I decided to use $wpdb SQL query.

Why I did not choose meta_query? Because when I pass more than 3 keys and value to search, my page kept loading and loading.

Before I explain more about this article, here I am posting my meta_query code for readers. If you know how to fix this issue please share your modified code in comments and I will add in my next post.

<?php   
	$args = array(
		'post_type'	=> 'book',
		'post_status'	=> 'publish',
		'order'	=> 'DESC',
		'orderby' => 'date',
		'posts_per_page' => -1,
		'meta_query' => array(
		'relation' => 'OR',
			array(
				'key' => 'type',
				'value' => 'Sample 1',
				'compare' => 'LIKE'
			),
			array(
				'key' => 'type',
				'value' => 'Sample 2',
				'compare' => 'LIKE'
			),
			array(
				'key' => 'type',
				'value' => 'Sample 3',
				'compare' => 'LIKE'
			),
			array(
				'key' => 'type',
				'value' => 'Sample 4',
				'compare' => 'LIKE'
			)
		)
	);
	$query = new WP_Query( $args );
?>

<?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

    <h1><a href="<?php the_permalink(); ?>"><?php echo the_title(); ?></a></h1>

<?php endwhile; endif; wp_reset_postdata(); ?>

Finally, I found the solution from StackOverflow and would like to thanks to everyone who posted the answer. Now I am presenting that code with little bit modification by me. In this code, your task is only to change SQL query to your query.

<?php		
	global $wpdb, $paged, $max_num_pages;

	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
	$post_per_page = 3;
	$offset = ($paged - 1)*$post_per_page;

	$query_spicy = "SELECT wposts.* FROM $wpdb->posts wposts WHERE wposts.post_status = 'publish' AND wposts.post_type = 'villa' ORDER BY wposts.post_date DESC";

	//QUERY THE POSTS WITH PAGINATION
	$spicy = $query_spicy . " LIMIT ".$offset.", ".$post_per_page."; ";

	$spicy_results = $wpdb->get_results( $spicy, OBJECT);

	//RUN QUERY TO COUNT THE RESULT LATER
	$total_result = $wpdb->get_results( $query_spicy, OBJECT );

	$total_spicy_post = count($total_result);
	$max_num_pages = ceil( $total_spicy_post / $post_per_page );
?>

<div class="result-count">
		<?php 
			if($total_spicy_post >= 1){
				?> Showing all <?php echo $total_spicy_post; ?> results <?php
			}else{
				?> No records found. <?php
			}
		?>
</div>

<?php
	global $post;
	foreach ($spicy_results as $post) :
		setup_postdata($post);
?>
	<h1><a href="<?php the_permalink(); ?>"><?php echo the_title(); ?></a></h1>	
<?php
	endforeach;
?>

<?php
	global $wp_rewrite, $wp_query, $max_page, $page;
	$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

	$pagination = array(
		'base' => @add_query_arg('page','%#%'),
		'format' => '',
		'total' => $max_num_pages,
		'current' => $current,
		'prev_text' => __('PREV'),
		'next_text' => __('NEXT'),
		'end_size' => 1,
		'mid_size' => 2,
		'show_all' => false,
		'type' => 'list'
	);

	if ( $wp_rewrite->using_permalinks() )
		   $pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ) . 'page/%#%/', 'paged' );

	if ( !empty( $wp_query->query_vars['s'] ) )
			$pagination['add_args'] = array( 's' => get_query_var( 's' ) );

	echo paginate_links( $pagination );
?>

I hope you liked my post. If you have any query please mail/comment me. ­čÖé


Leave a Reply

Your email address will not be published. Required fields are marked *