@evgenyakut

Почему не работает связка 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 `wp_posts` WHERE `ID` = '31706'" );

		foreach ( $fivesdrafts as $fivesdraft ) {
			$html = "<p>".$fivesdraft->post_title."</p>";
		}
	
	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?
  • Вопрос задан
  • 32 просмотра
Решения вопроса 1
@YanAlexandrov
Чайник со стажем
Потому что шлёшь запрос на файл /includes/calc.php, а он не в курсе, что ты работаешь с WordPress. Нужно подключить файл wp-load.php из корня сайта для загрузки ядра, типа такого: require_once '../../../wp-load.php';
Но вообще, ajax на WP чуть по другому делается. Смотри описание: https://wp-kama.ru/id_2018/ajax-v-wordpress.html
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы