WordPress: Search results pagination still not working

I’ve searched high and low for solutions and tried different ones, including the one thoroughly explained here by Chip Bennett, but I still can’t seem to get it working.

The first page of results work fine, but from page 2 it only shows the index template and still says page not found. Here’s my code:

Read More

Functions.php

function advanced_search_query($query) {
    if ($query->is_search) {
        $query->set('s', $_GET['s']);
        $query->set('post_type', array( 'properties' ));
        $query->set('meta_key', $_GET['meta_key']);
        $query->set('orderby', $_GET['sortby']);
        $query->set('order', $_GET['order']);
        $query->set('posts_per_page', '5');
        $query->set('paged', $paged);

        if (isset($_GET['author'])) {
            $query->set('author', $_GET['author']);
        }

        if (isset($_GET['propertytype'])) {
            $query->set('taxonomy', 'propertytype');
            $query->set('terms', $_GET['propertytype']);
        }

        $minCost = $_GET['minCost'];
        $minCost = preg_replace("/[^0-9]/","", $minCost);
        if ($minCost == ""){
            $minCost = "0";
        }

        $maxCost = $_GET['maxCost'];
        $maxCost = preg_replace("/[^0-9]/","", $maxCost);
        if ($maxCost == ""){
            $maxCost = "99999999999999";
        }

        $query->set('meta_query', array(
            'relation' => 'AND',
            array(
                'key' => 'ce_location',
                'value' => $_GET['location'],
                'compare' => 'LIKE',
                'type' => 'CHAR'
            ),
            array(
                'key' => 'ce_cost',
                'value' => array($minCost, $maxCost),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => 'ce_bedrooms',
                'value' => array($_GET['minBedrooms'], $_GET['maxBedrooms']),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            ),
            array(
                'key' => 'ce_tenancy',
                'value' => $_GET['tenancy'],
                'compare' => 'LIKE',
                'type' => 'CHAR'
            )
        ));
    };
    return $query;
};
add_filter('pre_get_posts', 'advanced_search_query', 1000);

Code to pull query arguments

global $query_string;

$query_args = explode("&", $query_string);
$search_query = array();

foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}
$search_query['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

$search = new WP_Query($search_query);

Loop code:

if ( have_posts() ) :  while (have_posts()) : the_post();

    //loop content

endwhile;
    if(function_exists('wp_simple_pagination')) { wp_simple_pagination(); } ?>
else :
    echo 'Sorry, there are currently no property listings available';
endif;

Any suggestions will be immensely appreciated.

EDIT:

I also noticed the URL is modified when I try to access page 2.

This is the page 1 URL:

http://localhost/cunningham/?location=&propertytype=&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key=&tenancy=&s=

The page 2 URL:

http://localhost/cunningham/page/2/?location&propertytype&minBedrooms=1&maxBedrooms=9&minCost=0&maxCost=100000&meta_key&tenancy&s/

Related posts

Leave a Reply

1 comment

  1. You have a clash here between your main query and your secondary (custom) query.

    You are doing things half wrong and half right :-). Let go through what you are doing

    1. The first section of code is the correct method to alter the main query. This is actually all you need to make things work. You have a couple of flaws here though

      • pre_get_posts does alter all queries, primary and secondary queries alike. And this does not just happen on the front end only, back end is affected as well. You will need to apply changes to the front end only and only target the main query

        function advanced_search_query($query) {
            if ( !is_admin() && $query->is_main_query() && $query->is_search() ) {
        
               //REST OF YOUR CODE
        
      • You don’t need to set the paged parameter in pre_get_posts. This is set by the main query and does not need to be altered, so remove that.

      • Apart from that, it should work just fine. I cannot test your code, as I don’t have the same setup as yours

    2. You don’t need your custom (secondary) query. You have already modified your main query to handle your changes

    3. Your loop is just fine. This is all you will need in your search.php template, nothing else

    EDIT

    From the comments from the OP

    I’m pretty much assuming that there is a permalink issue somewhere. I don’t have anything in my .htaccess besides the basics and my permalink structure is /%category%/%postname%/ and with that structure pagination works all fine on another page that has a normal query hardcoded into the php file. It is literally only this search page having issues and it’s all because paged isn’t being set it the URL

    And the solution

    Well, I found the solution. The trailing slash was messing everything up