Поддержка Проблемы и решения Не работает wordpress + ajax + $wpdb->get_results?

  • Требуется написать плагин калькулятора для расчета стоимости товара. Частный случай потому готовые решения не подошли.

    Подключаю нужные скрипты и стили в function.php моего плагина

    
    add_action( 'wp_enqueue_scripts', 'dealer_custom_calc_scripts' );
    function dealer_custom_calc_scripts(){
        wp_enqueue_style( 'calculator_styles', plugins_url() . '/dealer-custom-calculator/assets/css/calculator.css');
        wp_enqueue_style( 'calculator_new_styles', plugins_url() . '/dealer-custom-calculator/assets/css/calculator_new.css');
    	wp_enqueue_script( 'rulon_script', plugins_url() . '/dealer-custom-calculator/assets/js/all_script.js', array(), '1.0.0', true );
    }
    
    //Я не подключаю тут jQuery.ajax так как они подключаются и без меня и нормально работают.
    //Создаю вывод формы для будущего калькулятора
    function get_dealer_calc($calc_type){
    	$html='
    	<div class="calculator">
    	<div class="cal-container">
    	<div class="sizes row">
    		<div class="column small-6">
    			<label for="width"><div class="field-name">Ширина (см)</div></label>
    			<div class="field-box"><input type="number" id="width" min="10"></div>
    		</div>
    		<div class="column small-6">
    			<label for="height"><div class="field-name">Высота (см)</div></label>
    			<div class="field-box"><input type="number" id="height" min="10"></div>
    		</div>
    	</div>
    	<div class="row" id="material" >
    		<div class="res-box column small-9">
    			//Сдесь после ввода пользователем ширины и высоты изделия должны появиться варианты используемых материалов. Должны подтегиваться через jQuery.ajax 
    		</div>
    	</div>
    	<div class="row" id="sistems" >
    		<div class="res-box column small-9">
    			//Сдесь после материала изделия должны появиться варианты используемых систем. Должны подтегиваться через jQuery.ajax 
    		</div>
    	</div>
    		<div class="row" id="price" >
    		<div class="res-box column small-9">
    			//ну а здесь соответственно выводится полченная стоимость
    		</div>
    	</div>
    	</div>
    	</div>
    	';
    	return $html;
    }
    
    add_shortcode('dealer-calc', 'get_dealer_calc'); //[dealer-calc calc_type="rulon-classic|rulon-zebra..."]

    В all_script.js пишу такой вроде простеньки код

    var width = document.getElementById('width');
    var height = document.getElementById('height');
    var material = document.getElementById('material');
    
    width.oninput = function() {
    	  if (height.value.length && height.value  >= 10 && width.value >= 10){
    		  //console.log(width.value + " " + height.value);
    		  //вызвать функцию отправки длинны и ширины в PHP
    		  send(width, height);
    	  }
        
      };
      
    height.oninput = function() {
    	  if (width.value.length && height.value  >=  10 && width.value >= 10){
    		  //console.log(width.value + " " + height.value);
    		  //вызвать функцию отправки длинны и ширины в PHP
    		  send(width, height);
    	  }
        
      };
    
    function funcBefore(){}
    
    function funcSuccess(data){
    	//console.log(data);
    	material.innerHTML = data;
    }
      
    function send(width, height) {
    	  //console.log(width.value + " " + height.value);
          // отправка длинны и ширины в PHP
    	  //$.post("/wp-content/plugins/dealer-custom-calculator/includes/calc.php",{width: width.value, height: height.value}, )
    	  jQuery.ajax({
    		 url: "http://my-tests3.pp.ua/wp-content/plugins/dealer-custom-calculator/includes/calc.php",
    		 type: "POST",
    		 data: ({width: width.value, height: height.value}),
    		 dataType: "html",
    		 beforeSend: funcBefore,
    		 success: funcSuccess
    	  });
    }

    Ну а в calc.php все еще проще

    <?php
    if ($_POST['width'] && $_POST['height']){
    	//$html= 'Данные ширина ='.$_POST['width'].' и  высота = '.$_POST['height'].' успешно приняты бекэндом';
    	//найдема материалы удовлетворяющие условию
    	global $wpdb;
    	$fivesdrafts = $wpdb->get_results( "SELECT * FROM <code>wp_posts</code> WHERE <code>ID</code> = '31706'" );
    
    		foreach ( $fivesdrafts as $fivesdraft ) {
    			$html = "".$fivesdraft->post_title."
    ";
    		}
    	
    	echo $html; // так я тестирую адекватность работы с БД ибо точно знаю что запрос не возвращает пустую строку, если переношу все это обращение к БД в function.php моего плагина то все отрабатыват отлично и выводит правильный результат
    }
    
    ?>

    Пока calc.php представляет собой

    <?php
    if ($_POST['width'] && $_POST['height']){
    	$html= 'Данные ширина ='.$_POST['width'].' и  высота = '.$_POST['height'].' успешно приняты бекэндом';
    	echo $html;
    }
    ?>

    Все проходит нормально, и я получаю то что и должен был получить, а как толдько я пытаюсь подключиться к БД то тут же получаю ошибку
    «: Uncaught Error: Call to a member function get_results() on null in /home/charodey/my-tests3.pp.ua/www/wp-content/plugins/dealer-custom-calculator/includes/calc.php»
    Если я правильно понимаю смысл ошибки то «global $wpdb;» не срабатывает потому-что jQuery.ajax напрямую посылает запрос к файлу «calc.php» минуя весь wordpress со всми его глобальными переменными.
    ВОПРОС прост — что сделать для использования всех возможностей wordpress в моем calc.php?

Просмотр 1 ответа (всего 1)
  • Модератор Юрий

    (@yube)

    ВОПРОС прост — что сделать для использования всех возможностей wordpress в моем calc.php?

    Прямое обращение к скриптам темы/плагина — mauvais ton. Подключать обработчик ajax лучше так, как рекомендует Кодекс https://codex.wordpress.org/AJAX_in_Plugins

Просмотр 1 ответа (всего 1)
  • Тема «Не работает wordpress + ajax + $wpdb->get_results?» закрыта для новых ответов.