WordPress как на ладони

Добавить 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.
Как сделать правильно и получить данные с формы?

0
Сергей
2.5 лет назад
  • 2
    stepan2278 www.weblancer.net/users/stepanko/?affili...

    Скорее всего, вы свою форму вставили в форму другую.

    <form>
    ...
    	<form>...</form>
    ...
    </form>

    Поэтому советую делать отправку своей формы на AJAX - через JS посылать запрос
    и потом через хук wp_ajax_
    писать обработку
    Читать

    Сергей 2.5 лет назад

    вот я тоже подумал что она вложена.
    а можна с примером?

    stepan 2.5 лет назад

    https://wp-kama.ru/id_2018/ajax-v-wordpress.html#ajax-v-admin-paneli-wordpress
    Я же выше ссылку добавил.
    Там пример есть.
    Если будут трудности - спрашивайте.

    stepan 2.5 лет назад

    https://stackoverflow.com/questions/10398783/jquery-serialize-form-and-other-parameters
    Вот там пример, как собрать ВСЕ данные с формы и передать их

    Сергей 2.5 лет назад

    так сходу не дается...

    Сергей 2.5 лет назад
    <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); 
    }
    ?>

    Написал так, по нажатию на кнопку ничего не происходит

    stepan 2.5 лет назад

    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
    А скрипт - можно там же, где и сама форма.

    Сергей 2.5 лет назад

    https://fructcode.com/ru/blog/how-to-send-html-form-with-ajax/
    Я нашел такой пример, но как написал выше ничего не произошло

    Сергей 2.5 лет назад
    <?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']
    Весь код в файле плагина

    stepan 2.5 лет назад

    Сейчас копирую ваш код себе на локальный сайт, смотрю - что и как.

    stepan 2.5 лет назад

    <?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;
    }

    Я сменил событие на клик на кнопку, а не на отправку формы.
    Для меня так более привычно.
    И немного код подправил.

    Сергей 2.5 лет назад

    Да, есть реакция. Спасибо!
    Теперь подскажите я в функции contact_form() не вижу значение переменной $_GET['post'], ее туда нужна передать?

    stepan 2.5 лет назад

    Вот там передаются переменные, которые будут видны в contact_form()

    data: {action: 'contact_form', name: name},

    А вот вы получили значение с поля:
    name = $("#name").val();
    Ищите на странице нужные поля, и можно передавать.

    stepan 2.5 лет назад

    http://joxi.ru/12MxJJ9cwJn69m
    ID заказа на странице в поле с ID "post_ID"

    var post_id = $("#post_ID").val();
    data: {action: 'contact_form', name: name, post_id: post_id},
    Сергей 2.5 лет назад

    Ага получилось! Спасибо огромное что откликнулись!

    stepan 2.5 лет назад

    Принимайте мой ответ, как правильный, чтоб вопрос был решеным.

    campusboy 2.5 лет назад

    Принимаю ответ как решенный. Степан, спасибо за помощь Сергею!

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация