Search code examples
phpajaxwordpress

Wordpress admin-ajax.php gives a 500/400 status when called with custom code


I created a small script to handle a dropdown select that retrieves data from a custom MySQL table. The script uses admin-ajax.php, and it works perfectly on my local MAMP. However when I uploaded the files on Bluehost server I have a 500 status for the request if I am logged in as administrator. If I ma not logged in, I have a 400 bad request. Moreover the page appears with the administration top bar, even if I am not logged in and it appears to other users as well. I have no idea of what happened

Here's my code

<script>
jQuery(document).ready(function($) {
    // Event listener for changes in the first dropdown (#region_filter)
    $('#region_filter').on('change', function() {
        // Fetch selected region values
        var selectedRegions = $(this).val();

        // Make an AJAX request to retrieve corresponding areas for selected regions
        $.ajax({
            url: "domain.org/wp-admin/admin-ajax.php",          
            type: 'POST',
            data: {
                action:'eAtlasFiltersRegions',
                regions: selectedRegions
            },
            success: function(response) {
                // Parse the JSON response
                var areas = JSON.parse(response);

                // Clear and update the third dropdown (#isra_filter) options
                var israDropdown = $('#isra_filter');
                israDropdown.empty();
                israDropdown.append($('<option value="">Search area names</option>'));
                israDropdown.append($('<option value="all">SELECT ALL</option>'));

                // Add retrieved area names to the dropdown
                areas.forEach(function(area) {
                    israDropdown.append($('<option value="' + area + '">' + area + '</option>'));
                });

                // Refresh the dropdown to apply changes
                israDropdown.dropdown('refresh');
            }
        });

    });
 
});
</script> 

and on the functions.php I wrote the following:

add_action('wp_ajax_eAtlasFiltersRegions', 'eAtlasFiltersRegions');

function eAtlasFiltersRegions(){
    global $wpdb;
    
    if (isset($_POST['regions'])) {
      // Get the selected regions from the AJAX request
      $selectedRegions = $_POST['regions'];
      console.log($selectedRegions);

      // Construct the SQL query to retrieve areas based on selected regions
      $query = "SELECT DISTINCT area_name FROM isra_map_area_names WHERE region_code IN (SELECT region_code FROM isra_map_regions WHERE region IN (";
      $regionValues = array_map(function($region) {
          // Sanitize and escape each selected region
          return "'" . addslashes($region) . "'";
      }, $selectedRegions);
      $query .= implode(",", $regionValues) . ")) ORDER BY `area_name` ASC";
      // Execute the query
      $query_results = $wpdb->get_results($query);
  
      // Extract area names from the query results
      $areaNames = array();
      foreach ($query_results as $result) {
          $areaNames[] = stripslashes($result->area_name);
      }
  
      // Return the area names as a JSON response
      echo json_encode($areaNames);
  } else {
      // Return an empty JSON response if no regions are selected
      if (isset($_POST['regions']) & $_POST['regions'] =='') {
        $query_area_name = $wpdb->get_results("SELECT * FROM isra_map_area_names ORDER BY `area_name` ASC", ARRAY_A);
         // Extract area names from the query results
      $areaNames = array();
      foreach ($query_results as $result) {
          $areaNames[] = stripslashes($result->area_name);
      }
  
      // Return the area names as a JSON response
      echo json_encode($areaNames);
      }
  }
  wp_die();  

}

The wordpress environment is the same on local and on server, as well as the plugins. Has anyone found the same issue? What is the mistake in my code?


Solution

  • From what I can see, your code as two errors:

    1. console.log is in your PHP file, that will cause issues.
    2. in the else part of your if-else statement, you are looping through $query_results when your results were assigned to $query_area_name.

    Give it a try, and see if that fixes your 500 error. If your 500 error goes away and you still have issues, check out this resource:

    Wordpress admin-ajax.php 400 bad request