Как реализовать форму добавления кастомного типа записи на странице сайта?

Ссылка скопирована
1 ответ

Здравствуйте! На странице сайта нужно добавить форму добавления кастомного типа записи. Сама кастомная запись уже создана, также как и зарегистрированны таксономии и созданы поля при помощи ACF. Помогите с направлением, не знаю как начать и что делать.... Плюс, это должно быть реализовано ajaxом

Дополнительно:

Я правильно понял - тебе нужно возможность добавление записей кастомного типа с фронта? Или что?

  • Refguser, Да, именно так! Не спрашивайте пожалуйста зачем, просто надо)))
  • Ответы:

    Помогите с направлением, не знаю как начать и что делать....

    Есть масса плагинов для постинга с фронта.
    Искать так, так и тп.

    Но работа с кастомными сущностями как правило в платных версиях.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция Security Ответ

    Форму добавления кастомного типа записи на фронте лучше делать через обычную HTML-форму, nonce-проверку и wp_insert_post(). ACF-поля и таксономии можно заполнить после создания записи.

    Минимальная схема:

    • на странице выводите форму;
    • добавляете nonce;
    • на init или template_redirect обрабатываете POST;
    • создаёте запись в статусе pending или draft;
    • записываете таксономии и ACF-поля;
    • делаете redirect, чтобы не было повторной отправки формы.

    Пример обработки:

    add_action('template_redirect', function () {
        if (empty($_POST['frontend_cpt_submit'])) {
            return;
        }
     
        if (
            empty($_POST['_wpnonce']) ||
            !wp_verify_nonce($_POST['_wpnonce'], 'frontend_cpt_create')
        ) {
            wp_die('Ошибка безопасности формы');
        }
     
        $post_id = wp_insert_post([
            'post_type'    => 'my_cpt',
            'post_status'  => 'pending',
            'post_title'   => sanitize_text_field($_POST['title'] ?? ''),
            'post_content' => wp_kses_post($_POST['content'] ?? ''),
        ], true);
     
        if (is_wp_error($post_id)) {
            wp_die($post_id->get_error_message());
        }
     
        if (!empty($_POST['my_tax'])) {
            wp_set_object_terms($post_id, [(int) $_POST['my_tax']], 'my_taxonomy');
        }
     
        if (function_exists('update_field')) {
            update_field('field_name', sanitize_text_field($_POST['acf_value'] ?? ''), $post_id);
        }
     
        wp_safe_redirect(add_query_arg('created', '1', wp_get_referer()));
        exit;
    });

    add_action('template_redirect', function () { if (empty($_POST['frontend_cpt_submit'])) { return; } if ( empty($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'frontend_cpt_create') ) { wp_die('Ошибка безопасности формы'); } $post_id = wp_insert_post([ 'post_type' => 'my_cpt', 'post_status' => 'pending', 'post_title' => sanitize_text_field($_POST['title'] ?? ''), 'post_content' => wp_kses_post($_POST['content'] ?? ''), ], true); if (is_wp_error($post_id)) { wp_die($post_id->get_error_message()); } if (!empty($_POST['my_tax'])) { wp_set_object_terms($post_id, [(int) $_POST['my_tax']], 'my_taxonomy'); } if (function_exists('update_field')) { update_field('field_name', sanitize_text_field($_POST['acf_value'] ?? ''), $post_id); } wp_safe_redirect(add_query_arg('created', '1', wp_get_referer())); exit; });

    Файлы и изображения обрабатываются отдельно через media_handle_upload(). Не давайте всем подряд публиковать сразу в publish, если нет модерации. Для публичной формы лучше использовать pending.

    Не выводите поля ACF на фронте “как есть”, если форма доступна гостям. Даже если поле выглядит безобидно, его нужно очищать под тип данных: текст через sanitize_text_field(), HTML через ограниченный wp_kses(), числа через приведение к int или float. Иначе через форму можно занести мусорную разметку или опасный HTML.

    Итог: начинайте не с ACF, а с безопасного создания записи. Когда запись создана, к ней уже можно прикрепить термины, ACF-поля, изображения и дополнительные метаданные. Для первого запуска делайте статус pending, проверяйте nonce и после успешной отправки всегда делайте redirect.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно