WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Добавить 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
    stepan1693 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 месяц назад

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

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