Передача данных формы в пользовательский маршрут API с помощью WordPress

Получение следующего ответа кода 500 при вызове моего API: PUT https://my-site.com/wp/wp-json/contact/v1/send 500

В functions.php мой пользовательский маршрут WP определяется следующим образом:

function sendContactMail(WP_REST_Request $request) {
}

add_action('rest_api_init', function () {
  register_rest_route( 'contact/v1', 'send', array(
    'methods' => 'PUT',
    'callback' => 'sendContactMail'
  ));
});

Вот как я делаю вызов API:

formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)

this.$axios.$put('https://my-site.com/wp/wp-json/contact/v1/send', formData)
  .then((res) => {
    this.ApiResponse = res
  })
  .catch((err) => {
    this.$toast.error(err.response)
  })

Почему я получаю ошибку 500?

у вас есть доступ к логам сервера? Журналы ошибок WP?

timur 28.12.2020 05:52

Что будет, если вместо https://my-site.com/wp/wp-json/contact/v1/send вызвать https://my-site.com/wp-json/contact/v1/send (без папки /wp/)? Есть ли у вас переадресация .htaccess или что-то подобное?

JP. Aulet 28.12.2020 17:43

Откройте эту ссылку (my-site.com/wp/wp-json) в браузере и убедитесь, что contact/v1 находится в пространстве имен.

Sagar Bahadur Tamang 30.12.2020 03:58

timur У меня есть доступ к журналу веб-сервера, при отправке контактной формы ошибок нет. JP.Aulet Я получаю 404, если я это сделаю. SagarBahadurTamang это так, my-site.com/wp/wp-json/contact/v1 отлично работает

drake035 30.12.2020 19:48

@ drake035, ваш код выглядит нормально, поэтому, вероятно, ваш обратный вызов (sendContactMail()) вызывает внутреннюю ошибку сервера (с кодом состояния 500). Попробуйте что-нибудь вроде function sendContactMail() { return array( 'foo' => 'bar' ); } для тестирования — ошибка 500 по-прежнему возникает? Попробуйте также отладку в WordPress и проверьте наличие соответствующих ошибок.

Sally CJ 01.01.2021 01:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
2 388
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Функция обновления, подобная этой

function sendContactMail(WP_REST_Request $request) {
}

add_action('rest_api_init', function () {
  register_rest_route( 'contact/v1', '/send', array(
    'methods' => 'PUT',
    'callback' => 'sendContactMail'
  ));
});

Функция обновления, подобная этой

formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)

this.$axios.$put('https://my-site.com/wp-json/contact/v1/send', formData)
  .then((res) => {
    this.ApiResponse = res
  })
  .catch((err) => {
    this.$toast.error(err.response)
  })

ничего не меняет

drake035 30.12.2020 19:41
Ответ принят как подходящий

Вероятно, проблема в том, что функция обратного вызова ожидает значение return. В конце вашего function sendContactMail(WP_REST_Request $request) { } вы захотите вернуть WP_REST_Response или WP_Error, чтобы отправить ответ обратно.

Я привел небольшой пример здесь: https://xhynk.com/content-mask/65451758-answer/

Кнопки «Click Me (Bad)» и «Click Me (Good)» делают то же самое, за исключением изменения отправляемых данных. Единственная разница в функции sendContactMail() заключается в следующем:

function sendContactMail(WP_REST_Request $request) {
  if ( $request->get_body() == 'return=true' ){
    return new WP_REST_Response(
      array(
        'status' => 200,
        'response' => 'Did the thing'
      );
    );
  }
}

«Истинное» условие срабатывает только при нажатии кнопки «Хорошо», когда обрабатывается блок .done(), а кнопка «Плохо» запускает блок .catch.

Таким образом, вы сможете решить свою проблему, выполнив X, Y, Z с вашими данными и убедившись, что вы возвращаете правильный ответ.

Также убедитесь, что вы не сталкиваетесь с ошибкой PHP (например, при прямом доступе к свойствам $request, поскольку они являются свойствами protected, и выполнение чего-то вроде if ( $request->body == 'something' ) вызовет «Неустранимая ошибка PHP: невозможно получить доступ к защищенному свойству» и обработает 500 ошибка.

Это правда, что обратный вызов конечной точки должен что-то возвращать, но я не думаю, что это проблема. И на самом деле, в руководстве по REST API говорится: «Начиная с WordPress 5.5, выдается _doing_it_wrong уведомление, если wp_send_json() семейство функций используется во время запроса REST API». Таким образом, можно было бы просто вернуть значение, которое затем будет автоматически закодировано в формате JSON.

Sally CJ 01.01.2021 02:06

Хороший улов на wp_send_json(), похоже, у меня действительно есть код для обновления! Отсутствие возврата чего-либо всегда приводило к срабатыванию блока catch для меня и, конечно же, к фатальной ошибке в функции. Единственный способ, которым я смог воспроизвести аналогичные проблемы с OP, - это вообще не возвращать значение или делать что-то незаконное, например, обращаться к защищенному свойству/неопределенной функции.

Xhynk 01.01.2021 02:48

«Не возвращая что-то, я всегда запускал бы блок catch» — я думаю, что если вы попробуете с Axios, чем с jQuery.ajax() , этого не произойдет. Вы можете попробовать ничего не возвращать и протестировать здесь.. :)

Sally CJ 01.01.2021 03:33

Так что на самом деле if ($request->get_body() == 'return=true') никогда не бывает правдой в моем случае, есть идеи, почему? Но если я уберу это условие, оно сработает. Проблема заключалась в моем возврате: return json_decode(json_encode($response)); Эта строка вызвала ошибку, заменив ее на ваш возврат return new WP_REST_Response(... исправила проблему, спасибо!

drake035 01.01.2021 16:44

if ($request->get_body() == 'return=true') — это данные, которые передал только мой пример (чтобы помочь отличить «хорошую» кнопку от «плохой», ту, которая возвращает ответ, и ту, которая нет. Рад помочь!

Xhynk 01.01.2021 22:50

Ошибка заключается в том, что мой API вызывает JS-скрипт
Итак, удалите лишний wp из URL-адреса, и URL-адрес обновления будет выглядеть так
https://my-site.com/wp-json/contact/v1/send

Обновленный скрипт будет выглядеть следующим образом

formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)

this.$axios.$put('https://my-site.com/wp-json/contact/v1/send', formData)
 .then((res) => {
 this.ApiResponse = res
})
.catch((err) => {
 this.$toast.error(err.response)
});

Другие вопросы по теме