Это продолжение статьи о сохранении данных формы WPCF7, где я рассказал о том зачем это может понадобиться и подходе к реализации. Здесь мы перейдем уже более техническим вещам, к коду.
Итак, нам необходимо создать публикацию на основе данных, отправляемых CF7. Мы успешно зацепились на событие отправки письма и готовы программно создать публикацию.
Создание кастомного типа публикации
Первая задача — это регистрация необходимого типа материала, в который мы будем записывать данные из формы. Более подробно это описано здесь.
Пусть это будет тип journal. Добавим его регистрацию в init hook WordPress.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//создаем типы публикаций add_action( 'init', 'create_post_type' ); function create_post_type() { register_post_type( 'journal', array( 'public' => true, // архив нам скорее всего не нужен 'has_archive' => false, // иконка для админки 'menu_icon' => 'dashicons-testimonial', 'menu_position' => 2, 'labels' => array( 'name' => 'Журнал заявок', 'singular_name' => 'Заявка', 'menu_name' => 'Заявки', 'all_items' => 'Все заявки', 'add_new' => 'Добавить', 'add_new_item' => 'Добавить', 'edit_item' => 'Редактировать', 'not_found' => 'Ничего не найдено', 'not_found_in_trash' => 'Корзина пуста' ), // в supports можно также добавить тег 'custom-fields', // если вы не хотите программировать редактирование мета-тегов // в админке, это разрешит WP задействовать "штатный" редактор. // Тем не менее он будет показывать не все Meta данные, // скрывая ключи начинающиеся с "_". 'supports' => array('title', 'thumbnail', 'editor'), )); } |
У нас есть тип публикации, теперь создадим экземпляр статьи данного типа и сохраним в него данные формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/* цепляемся к отправке формы через плагин WPCF7 */ add_action( 'wpcf7_mail_sent', 'hookToProcessFormData', $priority = 10, $accepted_args = 1 ); function hookToProcessFormData($contant_form) { // передаваемый объект $contant_form позволит определить // та ли эта форма, которая требует обработки if ($contant_form->id() == [ID ВАШЕЙ ФОРМЫ]) { // нужно сопоставить имена входных переменных массива POST // с мета-полями нашей публикации $meta_fields = array( 'your-name' => '_journal_name', 'your-city' => '_journal_city', 'your-phone' => '_journal_phone'); $meta_input = array(); foreach ($meta_fields as $field => $metakey) { $meta_input[$metakey] = trim(strip_tags($_POST[$field])); } //базовые данные публикации и мета поля $post_arr = array( // для примера я собираю заголовок статьи из двух полей 'post_title' => $meta_input['_journal_name'] . ', ' . $meta_input['_journal_city'], 'post_type' => 'journal', // статус публикации - ожидает проверки 'post_status' => 'pending', // длинный текст можно сохранить для разнообразия не в мета-поле, // а в post_content публикации 'post_content' => trim(strip_tags($_POST['your_message'])), // собранные ранее мета-поля 'meta_input' => $meta_input, ); //создание публикации $my_post_id = wp_insert_post( $post_arr ); } } |
В итоге мы создали публикацию и получили её ID ($my_post_id). Теперь получив письмо, редактор может зайти и проверить в админ панели соответствующую вкладку с публикациями типа journal.
В коде указаны какие то примеры полей, которые вы определили при настройке формы в WPCF7, адаптируйте список для вашего случая.
Я использовал мета-ключи начинающиеся с ‘_’. Даже если тип материала создан с ключом «custom-fields», такие поля не будут показаны в редакторе. Обычно я программирую редактор для них вручную, чтобы добавить нужное мне оформление. Но вы можете убрать символ подчеркивания и наслаждаться обработкой «custom-fields» от WP.