Обычно свои наработки не выкладываю, но вот держите:
Сама html-форма:
html-код<form class="form-wrapper reviews-form" id="reviews-form">
<h3>Оставить отзыв</h3>
<div class="reviews-form__row">
<div class="form-wrapper__group">
<input type="text" name="name" value="" placeholder="Ваше имя" required>
</div>
<div class="form-wrapper__group">
<input type="text" name="email" value="" placeholder="Ваш e-mail" required>
</div>
<div class="reviews-form__mark-wrapper">
<ul class="reviews-form__marks-list">
<li><button class="green" data-review-mark="positive"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/happy.svg" alt="Положительный" class="svg"></button></li>
<li><button class="yellow" data-review-mark="medium"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/surprised.svg" alt="Удовлетворительный" class="svg"></button></li>
<li><button class="red" data-review-mark="negative"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/sad.svg" alt="Отрицательный" class="svg"></button></li>
</ul>
</div>
</div>
<div class="reivews-form__message-wrapper">
<textarea name="message" placeholder="Ваш отзыв" required></textarea>
<input type="hidden" name="rating" value="" required>
</div>
<button type="submit" class="button button--green">Оставить отзыв</button>
</form>
Обработчики форм:/**
* @module Marks
* @description Выставление оценки в форме
*/
$('button[data-review-mark]').on('click',function(e){
e.preventDefault();
$('button[data-review-mark]').removeClass('active');
$(this).addClass('active');
$('#reviews-form').find('[name="rating"]').val($(this).attr('data-review-mark'));
});
/**
* @module Добавление отзыва
* @description Добавление отзыва
*/
$('#reviews-form').submit(function(e) {
e.preventDefault();
$.ajax({
type: "POST",
url: "/api/newreview.php",
data: $(this).serialize(),
success: function(){
$('#successreviewmodal').modal('show');
},
error: function() {
$('#errormodal').modal('show');
}
});
});
Так как запрос отсылается на /api/newreview.php, то по этому адресу у вас должен располагаться этот файл со следующим кодом:
Код newreview.php:<?php
ini_set("display_errors",1);
error_reporting(E_ALL);
// *
// Подключаем все файлы для работы
// *
require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$user_name = trim($_POST['name']);
$user_mail = trim($_POST['email']);
$message = trim($_POST['message']);
$rating = trim($_POST['rating']);
$post_data = array(
'post_title' => 'Отзыв #' . uniqid(),
'post_content' => $message,
'post_status' => 'pending',
'post_author' => 1,
'post_type' => 'reviews'
);
// Вставляем запись в базу данных
$post_id = wp_insert_post( $post_data );
// *
// Добавляем все дополнительные поля
// *
update_field( 'rating', $rating, $post_id );
update_field( 'author', $user_name, $post_id );
update_field( 'e-mail', $user_email, $post_id );
?>
Так как у нас пост добавляется в кастомный тип записей, нужно его сначала создать. Для этого в файл functions.php добавляем следующее:
Кастомный тип записей/**
* Кастомный тип записей: Отзывы
*/
function create_posttype_reviews() {
register_post_type( 'reviews',
array(
'labels' => array(
'name' => __( 'Отзывы' ),
'singular_name' => __( 'Отзывы' )
),
'public' => true,
'has_archive' => false,
'rewrite' => array('slug' => 'reviews'),
)
);
}
add_action( 'init', 'create_posttype_reviews' );
На этом все. В админке wordpress у вас появится новый блок меню "Отзывы", куда и будут попадать все отзывы. В качестве бонуса, могу вам прикрепить код, который надо поместить в functions.php, благодаря которому, боявится балун с количеством неопубликованных отзывов (так проще их отслеживать):
php код/**
* Уведомления о новых неопубликованных постах
*/
add_action( 'admin_menu', 'add_user_menu_bubble' );
function add_user_menu_bubble(){
global $menu;
// Отзывы
$count = wp_count_posts('reviews')->pending; // на подтверждении
if( $count ){
foreach( $menu as $key => $value ){
if( $menu[$key][2] == 'edit.php?post_type=reviews' ){
$menu[$key][0] .= ' <span class="awaiting-mod"><span class="pending-count">' . $count . '</span></span>';
break;
}
}
}
}
P.S не забудьте проверять всю информацию, поступающую от клиента.
UPD: забыл добавить, чтобы отзывы где-то выводились, вам нужно в каком-то месте шаблона их вывести:
WP Loop<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts(array(
'post_type' => 'reviews',
'posts_per_page' => -1,
'paged' => $paged,
));
?>
<?php if ( have_posts() ) : ?>
<?php $i = 1; ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="col-lg-6">
<?php echo get_template_part('template-parts/content','review'); ?>
</div>
<?php $i++; ?>
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
Так же прошу заметить, что при добавлении нового отзыва (файл newreview.php), в этом блоке кода:
$post_data = array(
'post_title' => 'Отзыв #' . uniqid(),
'post_content' => $message,
'post_status' => 'pending',
'post_author' => 1,
'post_type' => 'reviews'
);
указано:
'post_status' => 'pending',
, что означает добавление всех новых отзывов со статусом На модерации, если нужно отключить эту настройку, то поставьте
'post_status' => 'publish',