WordPress. Специальная функция формы для каждой отправки формы, чтобы избежать повторной отправки формы

#php #wordpress

#php #wordpress

Вопрос:

В моем WordPress версии 5.5.3 у меня есть две формы с одинаковыми полями ввода на одной странице:

 <form id="one" method="post">
    <input name="name" type="text" value="My Name">
    <input name="movie" type="hidden" value="1">
    <button type="submit" name="submitone">Submit</button>
</form>

<form id="two" method="post">
    <input name="name" type="text" value="My Name">
    <input name="movie" type="hidden" value="2">
    <button type="submit" name="submittwo">Submit</button>
</form>
 

С помощью приведенной ниже функции я могу сохранить приведенные выше данные формы:

 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    save_data();
}
 

Однако данные сохраняются дважды с помощью приведенного выше кода.
Я попытался определить отправленную форму и сохранить данные с помощью приведенного ниже:

 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['submitone'])) {
        save_data();
        }
    }
 

Это не работает и не сохраняет данные формы.
Как я могу определить, какая форма отправлена, и сохранить данные?

Редактировать 1 Ниже save_data(); метода:

 // input variables
$name = filter_input(INPUT_POST, 'name');
$movie = filter_input(INPUT_POST, 'movie');

// Table
global $wpdb;
$tablename = $wpdb->prefix . 'names';

// Name ID
$default_row = $wpdb->get_row("SELECT * FROM $tablename ORDER BY id DESC LIMIT 1");
    if ($default_row != null) {
        $id = $default_row->id   1;
    } else {
        $id = 1;
    }

// Names 
$data = array(
'id' => $id,
'name' => $name,
'movie' => $movie,
);

// INSERT DATA INTO THE TABLE
$new_name = $wpdb->insert($tablename, $data);
 

Комментарии:

1. можете ли вы попробовать распечатать данные POST перед вызовом save_data() и посмотреть, что вы получаете в post?

2. Да, я получаю входные значения.

3. итак, вы получаете только одно из значений отправки или оба из них?

4. также не могли бы вы показать свой метод save_data?

5. Обновлен исходный вопрос.

Ответ №1:

Самый простой способ, на мой взгляд, — добавить скрытое поле ввода в формы с чем-то, что поможет вам его идентифицировать. Затем, когда будет отправлена одна из этих форм, будет указано только ее скрытое поле.

Пример: <input type="hidden" name="formn" value="1"> и тогда у $_POST['formn'] вас будет ‘1’.

Комментарии:

1. Не является ли if($_SERVER['REQUEST_METHOD'] == 'POST') более правильным способом проверить, отправлена ли вся форма, чем (isset($_POST['formn'])) проверка только одного поля ввода?

2. Честно говоря, я не верю, что использование $_SERVER['REQUEST_METHOD'] == 'POST' является более правильным, чем любой другой способ проверить это. Но моя цель состояла в том, чтобы использовать это единственное поле, чтобы выбрать, какая из форм была отправлена, а не проверять, была ли отправлена какая-либо из них. Разве это не то, что вы ищете?

Ответ №2:

Ознакомьтесь со следующим кодом.

Шаблон страницы, содержащий две формы и один и тот же шаблон страницы, используется для обработки метода отправки формы.

Возможно, вы захотите изменить имя поля ввода ‘name’ и добавить к нему префикс, чтобы сделать его уникальным. (‘my_name’ в этом примере кода) . WordPress обрабатывает некоторые имена полей во вводимой форме как зарезервированные ключевые слова. WordPress ведет себя странно, если вы используете какое-либо из резервных имен.

 <?php
/**
 * Template Name: Form Template
 * Author: Meera Datey 
 * Template Post Type: post, page
 */

// Handle POST Submission here. 
if(isset($_POST['submitone'])) {

    print_r('First Form submitted');
    $my_name = $_POST['my_name'];
    // This should have input name  from first form
    print_r($my_name);
    save_data();
}
if(isset($_POST['submittwo'])) {
    print_r('Second Form submitted');
    $my_name = $_POST['my_name'];
    // This should have input name  from second form
    print_r($my_name);
    //save_data();
}

?>


<!-- This is a GET Request -->

<form  method="post" action="<?php the_permalink(); ?>">
    <input name="my_name" type="text" value="My Name">
    <button type="submit" name="submitone">Submit</button>
</form>

<form  method="post" action="<?php the_permalink(); ?>">
    <input name="my_name" type="text" value="My Name">
    <but
 

ton type=»submit» name=»submittwo»> Отправить

Ответ №3:

Вы должны использовать ядро wordpress:

 <form id="one" method="post">
    <input name="name" type="text" value="My Name">
    <input name="movie" type="hidden" value="1">
    <input type="hidden" name="action" value="submitone">
    <button type="submit" name="submitone">Submit</button>
</form>

<form id="one" method="post">
    <input name="name" type="text" value="My Name">
    <input name="movie" type="hidden" value="1">
    <input type="hidden" name="action" value="submitone">
    <button type="submit" name="submittwo">Submit</button>
</form>

function submitone_handle_form_submit() {
    // here $_POST

}

// Use your hidden "action" field value when adding the actions
add_action( 'admin_post_nopriv_submitone', 'submitone_handle_form_submit' );
add_action( 'admin_post_submitone', 'submitone_handle_form_submit' );

function submittwo_handle_form_submit() {
    // here $_POST

}

// Use your hidden "action" field value when adding the actions
add_action( 'admin_post_nopriv_submittwo', 'submittwo_handle_form_submit' );
add_action( 'admin_post_submittwo', 'submittwo_handle_form_submit' );