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
    stepan2273 www.weblancer.net/users/stepanko/?affili...

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

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

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

    Сергей год назад

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

    stepan год назад

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

    stepan год назад

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

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

    stepan год назад

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

    stepan год назад

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

    stepan год назад

    <?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'], ее туда нужна передать?

    stepan год назад

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

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

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

    stepan год назад

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

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

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

    stepan год назад

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

    campusboy год назад

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

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