I created a custom search form to filter taxonomies and custom fields meta by make use of wp_query.
The form action is redirect to a custom page template where the custom wp_query running. The search form is using get method to passing the variable.
The form is something like this
<form method="get" id="customsearch" action="<?php echo get_page_link( 12 ); ?>/">//action point to the custom page template
//these are to collect taxonomy data
<input type="hidden" name="taxo[1][name]" value="os">
<input type="text" name="taxo[1][term]" value="">
<input type="hidden" name="taxo[2][name]" value="ram">
<input type="text" name="taxo[2][term]" value="">
<input type="hidden" name="taxo[3][name]" value="cpu">
<input type="text" name="taxo[3][term]" value="">
/these are to collect custom field meta data
<input type="hidden" name="cmf[1][name]" value="place">
<input type="text" name="cmf[1][value]" value="">
<input type="hidden" name="cmf[2][name]" value="price">
<input type="text" name="cmf[2][value]" value="">
<input type="hidden" name="cmf[3][name]" value="software">
<input type="text" name="cmf[3][value]" value="">
<input type="submit" class="submit" value="Search" alt="[Submit]" name="submit" title="Search" />
</form>
And i added the variable to query_vars:
add_filter('query_vars', 'my_queryvars' );
function my_queryvars( $qvars )
{
$qvars[] = 'taxo';
$qvars[] = 'cmf';
return $qvars;
}
The problem is, when the permalink structure set to default, the form was not redirected to the desired page, instead it went to homepage.
If I set the permalink other structure, like Numeric or Post name, it goes to the correct page, but url broken in paginated page. Eg:
First page:
<blockquote>page_url/?taxo[1][name]=os&taxo[1][term]=xxx&taxo[2][name]=ram&taxo[2][term]=cpu&cmf[1][name]=price&cmf[1]&cpf[1][value]=xxx&cmf[2][name]=place.......submit=Search</blockquote>
to
<blockquote>page_url/page/2/?submit=Search (the GET data stripped)</blockquote>
How do I solve this problem?
Clifford P answers:
Maybe this will help: [[LINK href="http://wpquestions.com/question/showLoggedIn/id/7472"]]http://wpquestions.com/question/showLoggedIn/id/7472[[/LINK]]
house.tc comments:
I tried to add the rewrite rules, but still not working.
This is what I had tried:
function add_author_more_rewrite_rule() {
add_rewrite_rule('page_url/(\d*)$','index.php?taxo=$matches[1]&cmf=$matches[2]', 'top' );
}
add_action('init','add_author_more_rewrite_rule');
Is this because the variables are in arrays?
Clifford P comments:
Someone else will have to chime in. I was just trying to point you in the right direction. Good luck.
Francisco Javier Carazo Gil answers:
To be able to leave RewriteRule in .htaccess you will need to use them directly in the PHP code, look at the end of this entry:
http://codex.wordpress.org/Custom_Queries
In your case could be something like this:
add_action('generate_rewrite_rules', 'geotags_add_rewrite_rules');
function geotags_add_rewrite_rules( $wp_rewrite )
{
$new_rules = array(
'page_url/(.+)' => 'index.php?page_url=' .
$wp_rewrite->preg_index(1) );
// Add the new rewrite rule into the top of the global rules array
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
house.tc comments:
Tried, but still got no luck.
Francisco Javier Carazo Gil comments:
You have to redirect the template you load as a function of the query_vars you receive in the index.php of your theme.
house.tc comments:
Sorry I don't quite get what you mean. Are you mean that I need to redirect to my page template page from my homepage?
Francisco Javier Carazo Gil comments:
I would do the next:
1. Do the rewrite as I told you and redirect all to index.php
2. Collect query_vars and if the var you want is set, load your template
house.tc comments:
Tried also, but still cannot make it right. Anyway, I figured another approach to solve this problem. Now I using pre_get_posts to change the search query. And it work.
jazbek answers:
Hi there. Have you looked into using the paginate_links() function of WordPress to create your pagination?
http://codex.wordpress.org/Function_Reference/paginate_links
See if this code works:
echo paginate_links(array(
'total' => $wp_query->max_num_pages,
'current' => max( 1, get_query_var('paged') ),
'show_all' => true,
'type' => 'list',
'add_args' => $_GET,
'next_text' => '»',
'prev_text' => '«'
)) ?>
house.tc comments:
For some reason, I want to use the default next_posts_link()
for the pagination. Anyway, thanks for your suggestion.