Я делал подобное для отзывов.
Создал тип записей "отзывы".
Форма Contact Form 7 - вместо отправки отзыва с сайта на емейл, через хук добавлял запись "отзыв" с пометкой "черновик".
Потом в админке можно смотреть и публиковать нормальные отзывы.
138 - id формы
Правда у меня еще использовался ACF и возможность с формы загружать фото - без этого можно сократить код в половину.
add_action('wpcf7_before_send_mail', 'send_mail');
function send_mail($form){
global $wpdb;
$submission = WPCF7_Submission::get_instance();
if ( $submission && 138 == $form->id() ) {
$form->skip_mail = true;
$submited = array();
$submited['title'] = $form->title();
$submited['posted_data'] = $submission->get_posted_data();
$uploadedFiles = $submission->uploaded_files();
$data_name = $submited['posted_data']['nm'];
$data_tel = $submited['posted_data']['tel'];
$data_mail = $submited['posted_data']['mail'];
$data_msg = $submited['posted_data']['msg'];
}
$new_post = array(
'post_title' => 'Отзыв о леcтнице',
'post_type'=>'review',
'post_status'=>'draft',
'post_content'=>$data_msg
);
$post_id = wp_insert_post($new_post);
if ($post_id) {
if ($data_name) update_field('reviews_name',$data_name,$post_id);
if ($data_tel) update_field('reviews_tel',$data_tel,$post_id);
if ($data_mail) update_field('reviews_email',$data_mail,$post_id);
$arrImg = array();
foreach ($uploadedFiles as $value) {
$file = $value;
$filename = basename($file);
$upload_file = wp_upload_bits($filename, null, file_get_contents($file));
if (!$upload_file['error']) {
$wp_filetype = wp_check_filetype($filename, null );
$attachment = array(
'post_mime_type' => $wp_filetype['type'],
'post_parent' => $post_id,
'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
'post_content' => '',
'post_status' => 'inherit'
);
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], $post_id );
if (!is_wp_error($attachment_id)) {
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attach_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
wp_update_attachment_metadata( $attachment_id, $attach_data );
$arrImg[] = $attachment_id;
}
}
}
if (count($arrImg) > 0) {
update_field('reviews_img', $arrImg, $post_id );
}
}
}