Вопрос или проблема
Я пытаюсь создать плагин для викторины. Используя пользовательский тип записи, я создал метабокс, в котором находится следующая форма в виде таблицы.
<table class="form-table">
<tbody>
<tr>
<th>
<label for="quiz_type">Тип викторины</label>
</th>
<td>
<select name="quiz_data[quiz_type]" id="quiz_type">
<option value="trivia">Викторина</option>
<option selected="selected" value="personality">Персональная</option>
</select>
<br>
<span class="description">Выберите тип викторины.</span>
</td>
</tr>
<tr>
<th>
<label for="quiz_data[questions][1][question]">Вопрос</label>
</th>
<td>
<input type="text" name="quiz_data[questions][1][question]" id="quiz_data[questions][1][question]" value="fffffff"
size="75">
<br>
<span class="description">Каков вопрос.</span>
</td>
</tr>
<tr>
<th>
<label for="quiz_data[questions][1][answers][1][answer]">Ответ</label>
</th>
<td>
<input type="text" name="quiz_data[questions][1][answers][1][answer]" id="quiz_data[questions][1][answers][1][answer]"
value="dfdfds" size="30">
</td>
<th>
<label for="quiz_data[questions][1][answers][1][is_correct]">Правильный?</label>
</th>
<td>
<input type="checkbox" name="quiz_data[questions][1][answers][1][is_correct]" id="quiz_data[questions][1][answers][1][is_correct]">
</td>
</tr>
<tr>
<th></th>
<td>
<button class="add-answer button-secondary" id="add_new_answer" name="add_new_answer" type="submit" formmethod="post"
value="quiz_data[questions][1][answers][2][answer]">Добавить ответ</button>
</td>
</tr>
<tr>
<th></th>
<td>
<button class="add-question button-primary" name="add_new_question" type="submit" value="">Добавить вопрос</button>
</td>
</tr>
</tbody>
</table>
Вводимые данные сохраняются как массив в метаданных записи. Я успешно сохраняю текстовые поля при нажатии любой кнопки, и значения запоминаются, когда я загружаю редактор. Проблема, с которой я сталкиваюсь, заключается в добавлении нового поля ввода без JavaScript, когда нажимаются соответствующие кнопки.
Я думал, что с вышеуказанным разметкой, $_POST[‘add_new_answer’] будет установлено, когда я нажимаю кнопку “Добавить ответ”, но это не так.
Как могу получить значение этой кнопки, когда она нажата, используя PHP?
Вот что я пробую в данный момент:
if ( isset( $_POST['quiz_data'] ) || isset( $_POST['add_new_answer'] ) || isset($_POST['add_new_question'] ) ) {
if ( isset( $_POST['quiz_data'] ) ){
$updated_quiz_data = $_POST['quiz_data'];
}
if ( isset( $_POST['add_new_answer'] ) ){
$updated_quiz_data = array_merge( $updated_quiz_data, $_POST['add_new_answer'] );
}
if ( isset( $_POST['add-new-question'] ) ){
$updated_quiz_data = array_merge( $updated_quiz_data, $_POST['add-new-answer'] );
}
// Обновите метаданные записи с обновленной викториной
update_post_meta( $quiz_id, 'quiz_data', $updated_quiz_data );
}
Я проснулся и осознал, как это бывает…
WordPress использовал JavaScript, чтобы предотвратить действие кнопок отправки, чтобы сделать ajax-запрос. Отключение JavaScript решило мою проблему.
Теперь я могу перейти к улучшению JavaScript.
Ответ или решение
Получение значения кнопки "Отправить" в пользовательском типе записи в WordPress
Создание собственного плагина для квизов на платформе WordPress — это увлекательный процесс, который может быть сопряжён с некоторыми трудностями, особенно когда дело доходит до обработки данных в метабоксах и нажатия кнопок. В данной статье мы рассмотрим, как правильно получать значения кнопок "Отправить" при использовании пользовательского типа записи и форм в метабоксах.
1. Контекст проблемы
Вы правильно заметили, что использование кнопок формы с атрибутом type="submit"
инициирует отправку формы. Однако в вашем случае возникла проблема: значение кнопок не передавалось. Это может происходить по разным причинам. Одна из них связана с тем, что JavaScript, встроенный в WordPress, может перехватывать события нажатия кнопок для реализации AJAX-вызовов.
2. Решение проблемы
Как вы сами заметили, отключение JavaScript решило проблему, позволяя вашему коду корректно получать значения кнопок. Но давайте рассмотрим, как мы можем аккуратно организовать код, чтобы ваш плагин оставался функциональным и адаптивным, даже с активным JavaScript.
3. Изменение кода обработки данных
Ваш первоначальный код для обработки входящих данных выглядит довольно неплохо, но есть некоторые моменты для уточнения:
if ( isset( $_POST['quiz_data'] ) || isset( $_POST['add_new_answer'] ) || isset( $_POST['add_new_question'] ) ) {
if ( isset( $_POST['quiz_data'] ) ){
$updated_quiz_data = $_POST['quiz_data'];
} else {
$updated_quiz_data = []; // Инициализация массива, если данные отсутствуют
}
// Проверяем, была ли нажата кнопка "Добавить ответ"
if ( isset( $_POST['add_new_answer'] ) ){
// Здесь мы обрабатываем добавленный ответ
$new_answer = [
'answer' => sanitize_text_field($_POST['quiz_data']['questions'][1]['answers'][2]['answer']),
'is_correct' => isset($_POST['quiz_data']['questions'][1]['answers'][2]['is_correct']) ? 1 : 0,
];
$updated_quiz_data['questions'][1]['answers'][] = $new_answer; // Добавляем новый ответ в массив
}
// Проверяем, была ли нажата кнопка "Добавить вопрос"
if ( isset( $_POST['add_new_question'] ) ){
$new_question = sanitize_text_field($_POST['quiz_data']['questions'][1]['question']);
$updated_quiz_data['questions'][] = ['question' => $new_question, 'answers' => []]; // Добавляем новый вопрос в массив
}
// Обновляем метаданные записи
update_post_meta( $quiz_id, 'quiz_data', $updated_quiz_data );
}
4. Объяснение производимых изменений
- Санитизация данных: Мы добавили функции
sanitize_text_field()
, чтобы защитить ваши данные от атак. Это особенно важно для ввода от пользователей. - Инициализация массива: В начало блока добавлено создание пустого массива
$updated_quiz_data
, чтобы избежать возможных ошибок, когда$_POST['quiz_data']
не задан. - Добавление логики для создания ответов и вопросов: Логика добавления новых ответов и вопросов более структурирована.
5. Заключение
Таким образом, корректным образом обработав нажатия кнопок в вашем метабоксе, вы можете безопасно добавлять новые вопросы и ответы к вашему квизу, не отключая JavaScript. Понимание механизма передачи данных и корректная обработка пользовательского ввода — ключевые навыки для разработки плагинов на платформе WordPress.
Готовьтесь к новым вызовам и расширяйте функционал вашего плагина, используя изученные рекомендации!