Intereting Posts
Добавление галереи в нижний колонтитул главной страницы Домашняя страница пользовательских последних новостей Добавить изображение в таксономию и вывести на главную страницу Может кто-нибудь, пожалуйста, скажите мне, что не так с моим плагином? сортировать дочерние страницы в admin Уникальный пароль для доступа к сайту раздела Динамическое присвоение настраиваемого шаблона настраиваемым сообщениям типа post Некоторые изображения на сайте WordPress внезапно исчезли Не удается восстановить базу данных wordpress из sql dump Как проверить массив полей $ curauth? Определить поддержку только одноуровневого меню Использование функций / методов плагина в шаблонах Штрих-код WordPress в содержимом, вывод в боковой панели? Форматирование короткого кода для отображения в визуальном режиме Имя сайта не отображается в строке браузера, только URL

admin-ajax.php не работает должным образом на субдоменах

Я пытаюсь умножить цену продукта (вытащил из базы данных), соответствующий коммутируемому языку, сохраненной в cookie валюте. Для этого я использую скрипт AJAX и несколько методов. Проблема заключается в методе currencyRates();

Хотя в тестовой среде все работает нормально (вместо поддоменов я использую подпапки), на уровне производственного метода currencyRates(); просто возвращает значение 1 (инициализированное в начале метода, когда я var_dump $rate в цикле foreach, оно дает мне ожидаемое значение, но когда я пытаюсь вернуть его, всегда значение инициализируется в начале переменной $rate = 1 ).

Что происходит? Как субдомены могут влиять на этот тип скрипта? Значения из базы данных верны, проблема связана только с currencyRates(); возвращающее начальное значение или ноль, когда возврат используется внутри цикла foreach.

Я попытался переместить весь метод в get_original_price(); но затем ответ AJAX возвращает 0 вместо product_price умноженного на валюту.

Взгляните, если вам нужно больше кода, я могу вставить, но я почти уверен, что все остальное работает нормально (я получаю ответ, только умноженный на 1 из-за $rate = 1 ).

  public function get_original_price() { global $post; $variation_id = $_POST['variation_id']; $original_price = get_post_meta($variation_id, "_regular_price", true); $ratesCurrency = $this->currencyRates(); $priceAfterCurrency = $original_price*$ratesCurrency; echo $priceAfterCurrency; wp_die(); } private function currencyRates() { global $wpdb; $rate = 1; $currency = $_COOKIE['wcumcs_user_currency_session']; $name = 'wcumcs_exchange_rate_'.$currency; $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name='".$name."' LIMIT 1;"); foreach ($selectRate as $row) { $rate = $row->option_value; } return $rate; } 

Solutions Collecting From Web of "admin-ajax.php не работает должным образом на субдоменах"

Не утруждайте себя сложной ошибкой cookie / ajax, используйте REST API!

Мы будем использовать инъекции зависимостей и API RESTful, чтобы удалить куки и упростить код AJAX.

Прежде всего, сначала включите это в REST API:

 class Stuff { public function __construct() { add_action( 'rest_api_init', function () { register_rest_route( 'soothsayer/v1', '/current_rate/', array( 'methods' => 'GET', 'callback' => [ $this, 'get_original_price' ] ) ); } ); } public function get_original_price( $request ) { $variation_id = $request['variation_id']; $original_price = get_post_meta( $variation_id, "_regular_price", true); $currency = $request['currency']; $ratesCurrency = $this->currencyRates( $currency ); $priceAfterCurrency = $original_price*$ratesCurrency; return $priceAfterCurrency; } private function currencyRates( $currency ) { global $wpdb; $rate = 1; $name = 'wcumcs_exchange_rate_'.$currency; $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name='".$name."' LIMIT 1;"); foreach ($selectRate as $row) { $rate = $row->option_value; } return $rate; } } 

Теперь у нас есть конечная точка REST! Обратите внимание, как я:

  • Исправлено отступы, или, скорее, мой редактор делал это автоматически без усилий, и так же и ваш!
  • Используемая инъекция зависимости для захвата валюты. currencyRates не нужно знать, откуда взялось валютное значение, оно передается как параметр, теперь он будет работать для любой валюты независимо от того, как она была получена, а не только из набора, установленного в файле cookie
  • Валюта теперь является параметром, javascript может читать файлы cookie в порядке, и теперь ваш запрос на 100% доступен для кэширования. Это на 1000% лучше для производительности
  • Обратите внимание на объект $request переданный в get_original_price , это даст вам все подробности

Как это использовать?

 jQuery.get( 'https://example.com/wp-json/soothsayer/v1/current_rate', { 'variation_id' => 1, 'currency' => 'USD' }, function( data ) { // success? } ); 

Или даже посетив https://example.com/wp-json/soothsayer/v1/current_rate?variation_id=1&currency=USD

Оптимизация

Это не то, как вы выбираете опцию из таблицы опций:

  global $wpdb; $rate = 1; $name = 'wcumcs_exchange_rate_'.$currency; $selectRate = $wpdb->get_results("SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name='".$name."' LIMIT 1;"); 

Вот как вы это делаете:

 $rate = get_option( 'wcumcs_exchange_rate_'.$currency, 1 ); 

Если вам нужно получить несколько опций, вы можете сделать это с помощью get_option без параметров, чтобы захватить массив