Добавить metabox c формой
Хочу добавить на страницу заказа Woocomerce meta_box с формой отправки данных.
metabox добавляется нормально с формой
<?php
add_action( 'add_meta_boxes', 'true_add_metabox' );
function true_add_metabox() {
add_meta_box(
'seo_metabox', // ID нашего метабокса
'Отправка сообщения', // заголовок
'SF_send', // функция, которая будет выводить поля в мета боксе
'shop_order', // типы постов, для которых его подключим
'normal', // расположение (normal, side, advanced)
'default' // приоритет (default, low, high, core)
);
}
function SF_send( $post ) {
if (isset( $_GET['post'] ) )
{
?>
<form method="post" role="form" action="post.php?post=<? echo $_GET['post']; ?>&action=edit" >
<div class="form-group">
<label for="txt">Enter Text</label>
<input type="text" class="form-control" id="txt1" name="txt1" value="" placeholder="Enter your text..." />
</div>
<button type="submit" name="send" class="btn btn-default">Send</button>
</form>
<?
if(isset($_POST['send']))
{
// вот эта часть кода не выполняется после нажатия кнопки Send. ПОЧЕМУ? Что сделал не так?
echo $order_id=$_GET['post'];
}
?>
Не пойму почему не выполняется это условие if(isset($_POST['send'])) ...
если в action формы указать доп параметр
action="post.php?post=&action=edit&txt=1"
то по нажатию на кнопку он переходит на страницу того же заказа "post.php?post=532>&action=edit" , но без параметра txt=1.
Как сделать правильно и получить данные с формы?
Скорее всего, вы свою форму вставили в форму другую.
Поэтому советую делать отправку своей формы на AJAX - через JS посылать запрос
и потом через хук wp_ajax_
писать обработку
Читать
вот я тоже подумал что она вложена.
а можна с примером?
https://wp-kama.ru/id_2018/ajax-v-wordpress.html#ajax-v-admin-paneli-wordpress
Я же выше ссылку добавил.
Там пример есть.
Если будут трудности - спрашивайте.
https://stackoverflow.com/questions/10398783/jquery-serialize-form-and-other-parameters
Вот там пример, как собрать ВСЕ данные с формы и передать их
так сходу не дается...
<form method="post" id="ajax_form" action="" > <input type="text" name="name" placeholder="NAME" /><br> <input type="text" name="phonenumber" placeholder="YOUR PHONE" /><br> <input type="button" id="btn" value="Отправить" /> </form> <script> $( document ).ready(function() { $("#btn").click( function(){ sendAjaxForm('result_form', 'ajax_form', 'post.php'); return false; } ); }); function sendAjaxForm(result_form, ajax_form, url) { $.ajax({ url: url, //url страницы (action_ajax_form.php) type: "POST", //метод отправки dataType: "html", //формат данных data: $("#"+ajax_form).serialize(), // Сеарилизуем объект success: function(response) { //Данные отправлены успешно result = $.parseJSON(response); $('#result_form').html('Имя: '+result.name+'<br>Телефон: '+result.phonenumber); }, error: function(response) { // Данные не отправлены $('#result_form').html('Ошибка. Данные не отправлены.'); } }); } </script> <? if (isset($_POST["name"]) && isset($_POST["phonenumber"]) ) { // Формируем массив для JSON ответа $result = array( 'name' => $_POST["name"], 'phonenumber' => $_POST["phonenumber"] ); // Переводим массив в JSON echo json_encode($result); } ?>Написал так, по нажатию на кнопку ничего не происходит
https://wp-kama.ru/id_2018/ajax-v-wordpress.html#ajax-v-admin-paneli-wordpress
Изучите материал "AJAX в админ-панели WordPress"
(почему у Вас JS начинается НЕ с "jQuery(document).ready( function( $ ){")
и сделайте также.
Где ваша функция
add_action( 'wp_ajax_my_action', 'my_action_callback' );
?
Наведите пример скрипта
а также функции.
Функция - пишем в functions.php
А скрипт - можно там же, где и сама форма.
https://fructcode.com/ru/blog/how-to-send-html-form-with-ajax/
Я нашел такой пример, но как написал выше ничего не произошло
<?php add_action( 'add_meta_boxes', 'true_add_metabox' ); function true_add_metabox() { add_meta_box( 'seo_metabox', // ID нашего метабокса 'Отправка ', // заголовок 'SF_send_sms_order', // функция, которая будет выводить поля в мета боксе 'shop_order', // типы постов, для которых его подключим 'normal', // расположение (normal, side, advanced) 'default' // приоритет (default, low, high, core) ); } add_action('wp_ajax_contact_form', 'contact_form'); add_action('wp_ajax_nopriv_contact_form', 'contact_form'); function contact_form() { echo $_POST['name']; } function SF_send_sms_order( $post ) { if (isset( $_GET['post'] ) ) { ?> <form class="form" id="ajax-contact-form" action="#"> <input type="text" name="name" id="name" placeholder="Name" required=""> <button type="submit" class="btn">Submit</button> </form> <script> $('#ajax-contact-form').submit(function(e){ var name = $("#name").val(); $.ajax({ data: {action: 'contact_form', name:name}, type: 'post', url: ajaxurl, success: function(data) { alert(data); // This prints '0', I want this to print whatever name the user inputs in the form. } }); }); </script> <? <?php } } ?>Ну вот такой код, страница перезагружается и ничего не выводит в $_POST['name']
Весь код в файле плагина
Сейчас копирую ваш код себе на локальный сайт, смотрю - что и как.
<?php add_action( 'add_meta_boxes', 'true_add_metabox' ); function true_add_metabox() { add_meta_box( 'seo_metabox', // ID нашего метабокса 'Отправка ', // заголовок 'SF_send_sms_order', // функция, которая будет выводить поля в мета боксе 'shop_order', // типы постов, для которых его подключим 'normal', // расположение (normal, side, advanced) 'default' // приоритет (default, low, high, core) ); } function SF_send_sms_order( $post ) { if ( isset( $_GET['post'] ) ) { ?> <form class="form" id="ajax-contact-form" action="#"> <input type="text" name="name" id="name" placeholder="Name" required=""> <button type="button" id="ajax-contact-form__button" class="btn">Submit</button> </form> <script> jQuery(document).ready(function ($) { $('body').on('click', '#ajax-contact-form__button', function () { alert('клик по кнопке'); var name = $("#name").val(); $.ajax({ data: {action: 'contact_form', name: name}, type: 'post', url: ajaxurl, success: function (data) { alert(data); // This prints '0', I want this to print whatever name the user inputs in the form. } }); }); }); </script> <?php } } add_action( 'wp_ajax_contact_form', 'contact_form' ); function contact_form() { echo $_POST['name']; exit; }Я сменил событие на клик на кнопку, а не на отправку формы.
Для меня так более привычно.
И немного код подправил.
Да, есть реакция. Спасибо!
Теперь подскажите я в функции contact_form() не вижу значение переменной $_GET['post'], ее туда нужна передать?
Вот там передаются переменные, которые будут видны в contact_form()
data: {action: 'contact_form', name: name},А вот вы получили значение с поля:
name = $("#name").val();
Ищите на странице нужные поля, и можно передавать.
http://joxi.ru/12MxJJ9cwJn69m
ID заказа на странице в поле с ID "post_ID"
var post_id = $("#post_ID").val();data: {action: 'contact_form', name: name, post_id: post_id},Ага получилось! Спасибо огромное что откликнулись!
Принимайте мой ответ, как правильный, чтоб вопрос был решеным.
Принимаю ответ как решенный. Степан, спасибо за помощь Сергею!