Как добавить кастомную запись через api или webhook в hivepress на wordpress?

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

Мне нужно программно добавить объявление в плагине/теме hivepress на wordpress
Я не особо часто имею дело с wordpress и не могу разобраться в какую сторону копать?

Пробовал:
через api hivepress, подставив следующий по порядку индекс в DB вместо {listing_id}

curl   -X POST /wp-json/hivepress/v1/listings/{listing_id}   -H "Content-Type: application/json"   -d '{"title":"string","description":"string"}'

curl -X POST /wp-json/hivepress/v1/listings/{listing_id} -H "Content-Type: application/json" -d '{"title":"string","description":"string"}'

не работает, возвращает ошибку 400 Bad request
в самой ошибке body

{   "error": {     "code": 400,     "errors": {       "required": {         "message": "Поле "Описание" является обязательным."       }     }   } }

{ "error": { "code": 400, "errors": { "required": { "message": "Поле "Описание" является обязательным." } } } }

Пробовал через класс внутри самой системы,
добавив этот код через плагин в админ панели

// Create listing. $listing = ( new HivePressModelsListing() )->fill( 	[ 		'title'    => 'Custom title', 		'featured' => true, 	] );  // Save listing. $listing->save();

// Create listing. $listing = ( new HivePressModelsListing() )->fill( [ 'title' => 'Custom title', 'featured' => true, ] ); // Save listing. $listing->save();

ноль реакции

я не могу понять что не так? единственное на что я обратил внимание, что если через апи в адрес запроса подставляешь id ранее добавленной вручную записи то оно работает и вносит изменения...
пробовал в самой базе предварительно вставить строчку и потом обращаться к ней, тоже не хочет работать )))

в целом мне вообще не важно как, но главное чтобы работало
я уже начинаю раздражаться, помогите пожалуйста сохранить душевный покой)

Дополнительные вопросы

yarovikov @weart В документации черным по белому написано, что это для обновления листинга, а не добавления.

Для добавления нового юзайте вэпэшное wp_insert_post

  • ну бывает, иногда сижу, смотрю в книгу а вижу сами знаете
  • mt. NATS, знаю))

Ответы на вопрос 0

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

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

Заказать помощь
Лучший ответ
2
Игорь NetOps Ответ

Ошибка 400 при попытке создать listing через HivePress API часто возникает из-за двух вещей: вы используете endpoint не для создания, а для работы с конкретной записью, и не передаёте обязательные поля в формате, который ожидает HivePress. Подставлять следующий ID в URL не нужно. ID создаёт WordPress/HivePress после успешного POST-запроса.

Сначала проверьте, какие REST routes реально доступны:

curl https://example.com/wp-json/ | grep hivepress

curl https://example.com/wp-json/ | grep hivepress

Если endpoint создания поддерживается, обычно логика такая: POST отправляется в коллекцию, а не в конкретный ID. То есть не /listings/{listing_id}, а что-то вроде /listings. Точный путь зависит от версии HivePress и включённых расширений.

Пример направления:

curl -X POST https://example.com/wp-json/hivepress/v1/listings   -H "Content-Type: application/json"   -H "Authorization: Bearer TOKEN"   -d '{"title":"Тестовое объявление","description":"Описание объявления"}'

curl -X POST https://example.com/wp-json/hivepress/v1/listings -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN" -d '{"title":"Тестовое объявление","description":"Описание объявления"}'

Но в HivePress часто мало передать только title/description. Могут быть обязательные поля: category, vendor, статус, location, price, атрибуты. Поэтому сообщение об ошибке надо читать полностью: оно обычно говорит, какое поле required.

Если публичный REST API неудобен, надёжнее сделать свой небольшой endpoint внутри WordPress и создавать запись через API WordPress/HivePress:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/listing', [
        'methods'  => 'POST',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
        'callback' => function (WP_REST_Request $request) {
            $post_id = wp_insert_post([
                'post_type'    => 'hp_listing',
                'post_status'  => 'draft',
                'post_title'   => sanitize_text_field($request['title']),
                'post_content' => wp_kses_post($request['description']),
            ]);
 
            if (is_wp_error($post_id)) {
                return $post_id;
            }
 
            return ['id' => $post_id];
        },
    ]);
});

add_action('rest_api_init', function () { register_rest_route('custom/v1', '/listing', [ 'methods' => 'POST', 'permission_callback' => function () { return current_user_can('edit_posts'); }, 'callback' => function (WP_REST_Request $request) { $post_id = wp_insert_post([ 'post_type' => 'hp_listing', 'post_status' => 'draft', 'post_title' => sanitize_text_field($request['title']), 'post_content' => wp_kses_post($request['description']), ]); if (is_wp_error($post_id)) { return $post_id; } return ['id' => $post_id]; }, ]); });

После создания записи можно заполнить taxonomy/meta-поля, которые нужны конкретно вашему HivePress. Их лучше посмотреть в базе на уже созданном вручную объявлении.

Итог: не угадывайте ID и не отправляйте данные в URL конкретной записи. Сначала снимите структуру REST routes и обязательные поля, затем либо используйте правильный endpoint создания, либо сделайте свой контролируемый endpoint.

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

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

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

комментарий

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

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