Search code examples
phpwordpresswordpress-themingcustom-wordpress-pages

why does $_GET not work in functions.php file?


my url query string is http://website.local/residences/?status=status2&type=apartments&price=null

When I echo $_GET['status'] from my page template I get 'status2', which is obviously correct. But I try to get that value from my functions.php it returns false. I'm using ajax to load in more posts with the below function. It should be getting that status value with $_GET for the tax query.. No idea why it's returning false only in my functions.php.

Any ideas?

function load_more_members($offset = 0, $post_type = 'project'){

    $offset = 0;
    $post_type = 'project';
    $status_array = array();
    $tax_arr = array(
        'relation' => 'AND',
    );

    if(isset($_POST['offset'])) {
        $offset = $_POST['offset'];
    }

    if(isset($_POST['post_type'])) {
        $post_type = $_POST['post_type'];
    }    

    if (isset($_GET['status']) && !empty($_GET['status']) && $_GET['status'] !== 'null') {
        $status = $_GET['status'];
        array_push($status_array, array(
            'taxonomy' => 'status',
            'field' => 'slug',
            'terms' => $status,
        ));
    }


    if (!empty($status_array)) {
        array_push($tax_arr, $status_array);
    }

    $args = array(
        'post_type' => 'project',
        'posts_per_page' => '4',
        'offset' => $offset,
        'order'     => 'DESC',
        'order_by'  => 'date',
          'tax_query' => $tax_arr
    );

    $the_query = new WP_Query( $args );
    
    $posts_left = $offset + 4;
    $found_posts = $the_query->found_posts;

    if ( $the_query->have_posts() ) : 
        ob_start();
        while ( $the_query->have_posts() ) : $the_query->the_post();  
                echo get_template_part('template-parts/latest', 'loop');
        endwhile; 
        $output = ob_get_contents();
        ob_end_clean();
    endif; 
    
    echo json_encode(array(
        'html' => $output,
        'offset' => $posts_left,
        'found_posts' => $found_posts
    ));
    exit();
}

add_action('wp_ajax_nopriv_load_more_members', 'load_more_members');
add_action('wp_ajax_load_more_members', 'load_more_members');
  function load_more_posts(offset, post_type) {
    $.ajax({
      type: "POST",
      url: WPURLS.ajax_url,
      data: {
        action: "load_more_members",
        offset: offset,
        post_type: post_type,
      },
      beforeSend: function (data) {
        $(".load-more-" + post_type).addClass("loading");
      },
      success: function (response) {
        var obj = JSON.parse(response);
        $("." + post_type + "-repeat").append(obj.html);
      },
      error: function (error) {
        console.log("est" + error);
      },
    });
  }
$(".load-more-post").on("click tap touch", function (e) {
    e.preventDefault();
    var this_offset = $(this).attr("data-offset");
    load_more_posts(this_offset, "post");
  });

Solution

  • Since you are trying to get it inside of an AJAX callback function, $_GET will not work as you expect.

    As a result, I am providing you with an alternative solution to your problem that I believe will be helpful to you.

    You can get the query string by putting the below function in your JS file.

    function getQueryString() {
        let string = [], hash;
        let hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            string.push(hash[0]);
            string[hash[0]] = hash[1];
        }
        return string;
    }
    

    You can get the value of a query string like let status = getQueryString()["status"]; and pass it to the data in your ajax call.

    function load_more_posts(offset, post_type) {
        let status = getQueryString()["status"];
        $.ajax({
            type: "POST",
            url: WPURLS.ajax_url,
            data: {
                action: "load_more_members",
                offset: offset,
                post_type: post_type,
                status: status
            },
            beforeSend: function (data) {
                $(".load-more-" + post_type).addClass("loading");
            },
            success: function (response) {
                var obj = JSON.parse(response);
                $("." + post_type + "-repeat").append(obj.html);
            },
            error: function (error) {
                console.log("est" + error);
            },
        });
    }
    $(".load-more-post").on("click tap touch", function (e) {
        e.preventDefault();
        var this_offset = $(this).attr("data-offset");
        load_more_posts(this_offset, "post");
    });
    

    Now, you can get the value in your ajax call.

    add_action('wp_ajax_nopriv_load_more_members', 'load_more_members');
    add_action('wp_ajax_load_more_members', 'load_more_members');
    
    function load_more_members()
    {
        echo $_POST['status'];
    }