Вопрос или проблема
Я хочу скрыть форму после того, как кто-то введет данные в мою форму плагина и нажмет кнопку отправки. Однако, поскольку я использую функцию шорткода в файле своего плагина, я не могу использовать простой HTML, чтобы отобразить форму и скрыть ее традиционным образом.
Как мне скрыть эту форму? Это мой PHP-скрипт файла плагина:
<?php
function installer(){
include('installer.php');
}
register_activation_hook( __file__, 'installer' ); // выполняет установщик php при установке плагина для создания новой базы данных
add_action('admin_menu','result_menu'); // создание административного меню wordpress
function result_menu()
{
add_menu_page('Результат','Результат','administrator','xenon-result');
add_submenu_page( 'xenon-result', 'Управление оценками', ' Управление оценками', 'administrator', 'Manage-Xenon-Marks', 'Xenon_Marks' );
}
function Xenon_Marks() // функция для добавления формы добавления оценок в администраторский вид
{
include('new/result-add-marks.php');
}
function html_form_code()
{
echo '<h3 align="center" class="titlehead"><br><b>Результат вступительного экзамена Шикхара - 2017</b></h3>';
echo '<form action="" method="post" name="display_form">';
echo '<fieldset>';
echo '<legend>Информация о студенте</legend>';
echo 'Номер зачетной книжки: <input type="number" min="170001" max="171000" name="rollNumber"><br>';
echo '<input type="submit">';
echo '<input type ="reset">';
echo '</form>';
}
function result_display(){
global $wpdb;
$student_id = $_POST['rollNumber'];
$query = "SELECT * FROM `wp_xenonresult` WHERE `student_id` = $student_id";
$result = $wpdb->get_row($query);
echo $result->student_name;}
if(isset($_POST['submit']))
{
result_display();
}
// шорткод для плагина начинается.
function display_shortcode() {
ob_start();
result_display();
html_form_code();
return ob_get_clean();
}
add_shortcode( 'xenon_result_display', 'display_shortcode' );
// Включить шорткоды в текстовые виджеты
add_filter('widget_text','do_shortcode');
?>
Если я правильно понял код, вы хотите сделать вызов функции result_display()
условным, переместив проверку поста внутрь функции шорткода. т.е.
function display_shortcode() {
ob_start();
if (isset($_POST['submit'])) {result_display();}
else {html_form_code();}
return ob_get_clean();
}
Ответ или решение
Чтобы скрыть форму после успешного выполнения PHP-скрипта в вашем плагине WordPress, необходимо внести некоторые изменения в вашу функцию, отвечающую за отображение формы и результатов. Основная идея заключается в том, чтобы управление отображением формы и результатами было более декларативным, основанным на состоянии выполнения запроса.
Вот шаги, которые вам нужно выполнить:
-
Переместите проверку POST-запроса в функцию обработки шорткода: Вместо проверки наличия данных, переданных через POST, в глобальной области, нужно сделать это внутри функции шорткода. Это позволит вам контролировать, показывать ли форму или результат в зависимости от состояния выполнения.
-
Измените HTML-код формы: После успешной отправки формы и выполнения запроса, можно скрыть форму и отобразить результаты. Это можно сделать, просто переставив местами логику в вашей функции
display_shortcode
.
Вот пример того, как вы можете реализовать этот подход:
// Шорткод для отображения формы и результатов
function display_shortcode() {
ob_start();
// Проверка на наличие POST-данных
if (isset($_POST['submit'])) {
result_display(); // Отобразите результаты, если форма была отправлена
} else {
html_form_code(); // Отобразите форму в противном случае
}
return ob_get_clean();
}
// Функция для генерации HTML-кода формы
function html_form_code() {
echo '<h3 align="center" class="titlehead"><br><b>Shikhar Entrance Test - 2017 Result</b></h3>';
echo '<form action="" method="post" name="display_form">';
echo '<fieldset>';
echo '<legend>Student Information</legend>';
echo 'Roll Number: <input type="number" min="170001" max="171000" name="rollNumber"><br>';
echo '<input type="submit" name="submit">';
echo '<input type="reset">';
echo '</fieldset>'; // Закрываем fieldset
echo '</form>'; // Закрываем форму
}
// Функция для отображения результата
function result_display() {
global $wpdb;
// Извлечение номера студента из POST данных
$student_id = intval($_POST['rollNumber']); // Используйте intval для безопасности
$query = $wpdb->prepare("SELECT * FROM `wp_xenonresult` WHERE `student_id` = %d", $student_id);
$result = $wpdb->get_row($query);
// Проверяем, есть ли результаты
if ($result) {
echo '<h3>Результаты:</h3>';
echo 'Имя студента: ' . esc_html($result->student_name); // Экранируем выходные данные
} else {
echo '<p>Студент с таким номером не найден.</p>';
}
}
// Регистрируем шорткод
add_shortcode('xenon_result_display', 'display_shortcode');
Комментарии к изменениям:
- Безопасность данных: Используйте
intval()
для числового поля, чтобы избежать SQL-инъекций, аesc_html()
для экранирования вывода данных. - Улучшенное управление состоянием: Логика выбора между отображением формы или результатами теперь централизована в
display_shortcode
, что позволяет управлять состоянием более эффективно. - Логическая структура: Этот код упрощает понимание и поддержку, поскольку отделяет логику обработки и отображения.
Заключение
Применив вышеуказанные изменения, вы создаете гибкий и безопасный способ динамически скрывать форму после успешного выполнения PHP-скрипта. Такой подход не только улучшает пользовательский интерфейс, но и оптимизирует ваш код, делая его более понятным и простым для поддержки.