@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
  • Вопрос задан
  • 289 просмотров
Решения вопроса 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. Он решил мою проблему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы