@Hurricane202

Форма в WordPress не отправляет письма/почему после XHR запроса ничего не происходит?

Здравствуйте, недавно начал осваивать WP, столкнулся с одной проблемой. В гугле не смог найти ответ. Возможно кому-то покажется ерундой, строго не судите.

Суть проблемы:
Хочу сделать отправку писем на email после отправки формы, без использования плагинов, тоесть самостоятельно сделав с помощью jquery обработчик который сделает XHR запрос. Вроде бы все верно(про эстетику не говорю), но после того как XHR запрос отправляется на firstwp/wp-admin/admin-ajax.php?action=send_mail, функция send_mail в functions.php не запускается. Уже 2 дня пытаюсь решить проблему, но без результатов.

Вот html/css разметка моей формы, а также содержимое файла main.js:


Вот код из файла functions.php, тут много всего...
<?php
add_action('wp_enqueue_scripts', 'theme_styles');
add_action('wp_enqueue_scripts', 'theme_scripts');
add_action('after_setup_theme', 'theme_register_nav_menu');
add_action('widgets_init', 'register_my_widgets');
add_action("wp_ajax_send_mail", "send_mail");
add_action("wp_ajax_nopriv_send_mail", "send_mail");


function send_mail() {
	/* Забираем отправленные данные */
  $contactName = $_POST['contactName'];
	$contactEmail = $_POST['contactEmail'];
	$contactSubject = $_POST['contactSubject'];
	$contactMessage = $_POST['contactMessage'];


add_filter( 'wp_mail_from_name', function($from1){  
	return 'Kravetz'; 
} );
add_filter( 'wp_mail_from', function($from2){  
	return 'ddddd65@yandex.ru'; 
} );
	
  $emailTo = 'mmmm@yandex.ru';
  $subject = 'Test mail рассылки!';
  $headers = array(
'From: ddddd65@yandex.ru',
'content-type: text/html'
);
  $mailBody = "$contactName <br/><br/> $contactEmail <br/><br/> $contactSubject";

  wp_mail($emailTo, $subject, $mailBody, $headers);
 wp_die();
};
 
add_action('init', 'my_custom_init');
function my_custom_init(){
	register_post_type('portfolio0', array(
		'labels'             => array(
			'name'               => 'портфолио0', // Основное название типа записи
			'singular_name'      => 'портфолио', // отдельное название записи типа Book
			'add_new'            => 'Добавить новую',
			'add_new_item'       => 'Добавить новую книгу',
			'edit_item'          => 'Редактировать книгу',
			'new_item'           => 'Новая работа',
			'view_item'          => 'Посмотреть работу',
			'search_items'       => 'Найти работу',
			'not_found'          =>  'работ не найдено',
			'not_found_in_trash' => 'В корзине работ не найдено',
			'parent_item_colon'  => '',
			'menu_name'          => 'портфолиоменю'

		  ),
		'public'             => true,
		'publicly_queryable' => true,
		'show_ui'            => true,
		'show_in_menu'       => true,
		'query_var'          => true,
		'rewrite'            => true,
		//'capability_type'    => 'post',
		'has_archive'        => true,
		'hierarchical'       => false,
		'menu_icon'          => 
'dashicons-admin-network',
		'menu_position'      => 4,
		'supports'           => array('title','editor','author','thumbnail','excerpt','comments'),
		'taxonomies'      => array('skills')
	) );

	//function create_taxonomy(){
	// список параметров: http://wp-kama.ru/function/get_taxonomy_labels
	register_taxonomy('skills', array('portfolio0'), array(
		'label'                 => '', // определяется параметром $labels->name
		'labels'                => array(
			'name'              => 'Навыки',
			'singular_name'     => 'Навык',
			'search_items'      => 'Найти навык',
			'all_items'         => 'Все навыки',
			'view_item '        => 'Смотреть навыки',
			'parent_item'       => 'Родительский навык',
			'parent_item_colon' => 'Родительский навык:',
			'edit_item'         => 'Изменить навык',
			'update_item'       => 'Обновить навык',
			'add_new_item'      => 'Добавить новый навык',
			'new_item_name'     => 'Новое имя навыка',
			'menu_name'         => 'Навыки',
		),
		'description'           => '', // описание таксономии
		'public'                => true,
		'publicly_queryable'    => null, // равен аргументу public
		'show_in_nav_menus'     => true, // равен аргументу public
		'show_ui'               => true, // равен аргументу public
		'show_in_menu'          => true, // равен аргументу show_ui
		'show_tagcloud'         => true, // равен аргументу show_ui
		'show_in_rest'          => null, // добавить в REST API
		'rest_base'             => null, // $taxonomy
		'hierarchical'          => false,
		//'update_count_callback' => '_update_post_term_count',
		'rewrite'               => true,
		//'query_var'             => $taxonomy, // название параметра запроса
		'capabilities'          => array(),
		'meta_box_cb'           => null, // html метабокса. callback: `post_categories_meta_box` или `post_tags_meta_box`. false — метабокс отключен.
		'show_admin_column'     => false, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
		'_builtin'              => false,
		'show_in_quick_edit'    => null, // по умолчанию значение show_ui
	) );
//Добавлю тестовый шорт код
}

add_shortcode( 'iframe', 'Gi' );
function Gi( $atts ) {
	$atts = shortcode_atts( array(
		'href' => 'http://wp-kama.ru',
		'width' => '600px',
		'height' => '550px',
	), $atts, 'iframe' );

	return '<iframe src="'. $atts['href'] .'" width="'. $atts['width'] .'" height="'. $atts['height'] .'"> <p> Your browser does not support iframes.</p></iframe>';
};


function theme_register_nav_menu(){
	register_nav_menu('top', 'меню в шапке');
	add_theme_support( 'title-tag' );
	//add_theme_support( 'post-thumbnails', array( 'post' ) );
		add_theme_support( 'post-thumbnails', array( 'portfolio0' ) );
	add_theme_support( 'post-formats', array( 'aside', 'video' ) );
	//add_image_size( 'post-thumb', 1300, 500, true );
	add_image_size( 'category-thumb', 100, 100, true );
};

function theme_register_nav_menu2(){
	register_nav_menu('bottom1', 'меню в подвале1');
};

function register_my_widgets(){
	register_sidebar( array(
		'name'          => 'Right Sidebar',
		'id'            => "right_sidebar",
		'description'   => 'мой сайдбар',
		'before_widget' => '<div class="widget %2$s">',
		'after_widget'  => "</div>\n",
		'before_title'  => '<h5 class="widgettitle">',
		'after_title'   => "</h5>\n",
	) );
}

function theme_styles(){
 //wp_enqueue_style('styles', get_stylesheet_uri());
	wp_enqueue_style('default', get_template_directory_uri() . '/assets/css/default.css');
	wp_enqueue_style('layout', get_template_directory_uri() . '/assets/css/layout.css');
	//wp_enqueue_style('media-queries', get_template_directory_uri() . '/css/media-queries.css');

};



function theme_scripts(){
 wp_deregister_script('jquery');
 wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js');
 wp_enqueue_script('jquery');
	wp_enqueue_script('flexslider', get_template_directory_uri() . '/assets/js/jquery.flexslider.js', ['jquery'], null, true);
	wp_enqueue_script('doubletaptogo', get_template_directory_uri() . '/assets/js/doubletaptogo.js', ['jquery'], null, true);
	wp_enqueue_script('init', get_template_directory_uri() . '/assets/js/init.js', ['jquery'], null, true);
	wp_enqueue_script('modernizr', get_template_directory_uri() . '/assets/js/modernizr.js', null, null, false);
	wp_enqueue_script('main', get_template_directory_uri() . '/assets/js/main.js', ['jquery'], null, true);

};


5d6af9bb4f95b987654959.png
  • Вопрос задан
  • 300 просмотров
Решения вопроса 1
@Hurricane202 Автор вопроса
Нашел решение данной проблемы, оставлю тут , т к возможно пригодится таким же "начинающим" как я.

В общем если вы решили сделать на Вордпрессе форму без использования плагинов, которая при этом не будет перезагружать после отправки всю страницу и будет отправлять на почту сообщения, Вам следует:

1)Сделать JS файл с обработчиком (можно использовать jquery как в моем примере выше) который будет делать AJAX запрос.
2)Все AJAX запросы WP проходят через файл admin-ajax.php, тоесть вы не можете сразу прописать в запросе url вашей функции в functions.php или название php файла обработчика. Этот url должен выглядеть примерно так: firstwp/wp-admin/admin-ajax.php?action=send_mail .
Это приведет к созданию событий wp_ajax_send_mail и wp_ajax_nopriv_send_mail в файле admin-ajax.php
3)В файле functions.php нам нужно создать "действия" которые выводят функцию когда произойдут события wp_ajax_send_mail и wp_ajax_nopriv_send_mail.
4)В функции можно использовать wp_mail, но в моем случае на локальном сервере Open Server этого было мало и все сообщения уходили в папку OSPanel\userdata\temp\email.
Если хостинга у вас нет, но хочется чтобы все работало, следует воспользоваться PHPMailer. Он решил мою проблему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы