Переменная $_POST недоступна для вывода на стороне сервера

  • Сайт на wordpress
  • Посылаю ajax запрос методом POST через XMLHttpRequest не через форму а просто руками вбиваю параметры и делаю запрос сюда: http://dpk/wp-admin/admin-ajax.php?action=dpkhook
  • На стороне сервера вывожу: echo json_encode($_POST);
  • Смотрю результат этого вывода здесь: http://dpk/wp-admin/admin-ajax.php?action=dpkhook
  • Результат вывода: [] - пустой массив
  • В тело ajax запроса передаю параметры так: let params = 'myname=' + 'y est' + '&' + 'myname2' + 'grut';
  • На фронте (произвольная страница, где js-скрипт отрабатывает) получаю ответ от сервера:
{
  myname: 'y est',
  myname2: 'grut'
}

*Если сделать проверку на стороне сервера типо:

if ($_POST['myname'] && $_POST['myname']=='y est') {
  echo json_encode("DA");
} else {
  echo json_encode("NET");
}

то на стороне сервера (на странице http://dpk/wp-admin/admin-ajax.php?action=dpkhook) выводится "NET", а на фронт ответ от сервера приходит "DA"

*Если на стороне сервера состряпать запрос типа: $query = new WP_Query( $args );, то $query на стороне сервера выводится. $_GET тоже выводится: {"action":"dpkhook"}

Вопрос: почему переменную $_POST я на стороне сервера не могу вывести? $_POST['myname'], $_POST['myname2'] на стороне сервера тоже не выводятся. Это ограничение самого wp что ли, или $_POST теряется где-то по дороге?

P.S. file_get_contents("php://input"); не помогло

P.P.S. Код js и php:

"use strict";

document.addEventListener("DOMContentLoaded", pageLoadedHandler);

function pageLoadedHandler() {
  console.log('завершена загрузка и построение DOM документа');

    let params = 'myname=' + 'y est' + '&' + 'myname2=' + 'grut';
    let my_url = myPlugin.ajaxurl + '?action=dpk2hook';
    ajaxPost(my_url, params);

}

function ajaxPost(url, params) {
  let request = new XMLHttpRequest();

  request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status == 200) {
      console.log(request.response);
    }
  }
  request.open('POST', url);
  request.responseType = 'json';
  request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
  request.send(params);

}
<?php
/**
 * Plugin Name: Ajax запросы для фильтра записей wpforms
 */
add_action('wp_ajax_dpk2hook', 'say_hello');
//для запросов от авторизованных пользователей используется хук wp_ajax_'nazvanie action'

function say_hello() {

  echo json_encode($_POST);

  wp_die();
}

add_action( 'wp_enqueue_scripts', 'my_asset', 9999 );
function my_asset() {
  if (is_page( 2299 )) {
    wp_enqueue_script('custom', plugins_url('custom.js', __FILE__), [], '1_4');

    wp_localize_script('custom', 'myPlugin', [
      'ajaxurl' => admin_url('admin-ajax.php'),
    ]); 
  }
}


Ответы (1 шт):

Автор решения: Евгений

Мне так кажется, что просто мелкий косяк не дает правильно отправить данные на сервер. Вы говорите, что данные url-encoded, но где же они encoded?

myname=y est&myname2=grut
// вот это url-encoded
myname=y%20est&myname2=grut

Вполне возможно, что метод send() просто не может это отправить.

→ Ссылка