Запрос базы данных WordPress после вызова AJAX — получение ошибки вызова функции-члена get_results() при нулевом значении

#mysql #ajax #wordpress

#mysql #ajax #wordpress

Вопрос:

Я пытаюсь запросить базу данных WP, но получаю ошибку Call to a member function get_results() on null . Я считаю, что мне нужно как-то зарегистрировать wpdb, но, несмотря на чтение нескольких похожих вопросов, я не могу собрать воедино то, что нужно сделать. Любая помощь приветствуется, поскольку я новичок и изучаю WordPress и Ajax.

Вызывается мой JS-файл zip-search-popup.js

    (function($) {
      $(document).ready(function() {
        $('.zip-bar-button').click(function(event) {
          event.preventDefault();
          submittedZip = $("#zipcode-bar-input").val();
          $.ajax({
            //need an automatic URL so that this doesn't need to be updated
            url: from_php.ajax_url,
            type: "GET",
            data: {
              action : 'zip_search',
              submittedZip : submittedZip,
            },
            success: function (response) {
              console.log(response);
              alert("working");
            }
          })
          $('.zip-search-popup-con').fadeToggle(350);
        })
        $('.zip-search-dismiss').click(function() {
          $('.zip-search-popup-con').toggle();
        })
      })
    })(jQuery);
  

Я зарегистрировал свои скрипты в functions.php , и здесь также есть моя функция SQL-запроса.

 add_action('wp_enqueue_scripts', 'hyix_enqueue_custom_js');
function hyix_enqueue_custom_js() {
    //enqueue zip-search-popup.js
    wp_enqueue_script('zip-search-popup', get_stylesheet_directory_uri().'/js/zip-search-popup.js', array('jquery'), false, true);
    wp_localize_script('zip-search-popup', 'from_php', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}

//hook zip-search-popup function into ajax
add_action( 'wp_ajax_zip_search', 'ajax_zip_search' );
//same hook for users not logged in
add_action( 'wp_ajax_nopriv_zip_search', 'ajax_zip_search' );

  
//query for pulling in shipping data
function ajax_zip_search() {
  $submitted_zip = $_REQUEST['submittedZip'];
  global $wpdb;
  // The SQL query
  $response  =  $wpdb-> get_results("SELECT {$wpdb->prefix}woocommerce_shipping_zones.zone_name ".
              "FROM {$wpdb->prefix}woocommerce_shipping_zone_locations ".
              "INNER JOIN {$wpdb->prefix}woocommerce_shipping_zones ".
              "ON {$wpdb->prefix}woocommerce_shipping_zone_locations.zone_id = {$wpdb->prefix}woocommerce_shipping_zones.zone_id ".
              "WHERE location_code = '$submittedZip' ");

  $response = array(
    'request' => $_REQUEST,
    'zip' => $submitted_zip,
    'test' => 'is ok',
  );
  wp_send_json( $response );
  // echo $response;
  die();
}
  

Комментарии:

1. как zip-search.php загружается?

2. @mikerojas в настоящее время этого нет. Он работал нормально, когда я вызывал его непосредственно из отправки формы, а не через Ajax. Как это должно быть загружено?

Ответ №1:

Вы должны использовать WordPress-способ использования AJAX

Все Ajax-запросы будут получены с помощью wp-admin/admin-ajax.php , которая запускает Ajax-хуки, которые запускают ваш PHP-код. Ajax-перехват зависит от action -параметра в вашем Ajax-запросе.

С помощью wp_localize_script() вы можете предоставить некоторые данные из PHP в Javascript, то есть ajax_url.

Поместите этот код в свой functions.php . Сюда входит код, который обрабатывает ваш Ajax-запрос.

 add_action('wp_enqueue_scripts', 'hyix_enqueue_custom_js');
function hyix_enqueue_custom_js() {
    //enqueue zip-search-popup.js
    wp_enqueue_script('zip-search-popup', get_stylesheet_directory_uri().'/js/zip-search-popup.js', array('jquery'), false, true);
    wp_localize_script('zip-search-popup', 'from_php', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}



add_action( 'wp_ajax_zip_search', 'ajax_zip_search' );
add_action( 'wp_ajax_nopriv_zip_search', 'ajax_zip_search' );

function ajax_zip_search() {
    
    $submitted_zip = $_REQUEST['submittedZip'];
    
    // do some zip search

    $response = array(
        'request' => $_REQUEST,
        'zip' => $submitted_zip,
        'test' => 'is ok',
        'foo' => 'bar'
    );
    
    wp_send_json( $response );
    
}
  

Теперь вы можете использовать ajax_url, предоставляемый wp_localize_script(). Не забудьте отправить action -параметр:

 $.ajax({
    url: from_php.ajax_url,
    type: "GET",
    data: {
        action: 'zip_search',
        submittedZip: submittedZip
    },
    success: function (response) {
      console.log(response);
      alert('it works');
    }
});
  

Комментарии:

1. Спасибо за ваш ответ. Мне все еще трудно заставить ее работать. Теперь я получаю ошибку 400. Я обновил свой первоначальный вопрос, чтобы отразить изменения. Сейчас я запускаю только два файла zip-search-popup.js и functions.php . Я обеспокоен тем, что это проблема между дефисом и подчеркиванием, и перепробовал много разных настроек, но ничего не прошло.