Вставка/изменение meta через rest api
-
WP версия 6.8, плагин WordPress REST API Authentication
вроде как запрос должен идти на posts/post_id/meta но я не вижу такого роутера в списке api и запрос туда ничего не меняет, возвращает инфу по посту, нужное поле:
[«myhome_130»]=>
array(1) {
[0]=>
string(13) «$ 100,200,300»
}но в базе(таблица wp_postmeta) ключ выглядит иначе: myhome_130_myhome_13
может его(роутер) где нить руками надо добавить?
-
Тема изменена 4 дня, 3 часа назад пользователем
dvladimirov77.
-
Тема изменена 4 дня, 3 часа назад пользователем
-
Спасибо, поле в описании роутера нашёл, но вот чего то не хочет меняться.
Отправляю так:
$meta = new stdClass();
$meta->myhome_130_myhome_13 = $row[‘price_obj’];
$obj = [
‘slug’ => $row[‘ssylka’] . ‘_’ . $row[‘kod’],
‘title’ => make_object_title($row),
‘content’ => string_normalize($row[‘opis’]),
‘status’ => ‘publish’,
‘myhome_5495’ => $myhome_5495,
‘myhome_9508’ => $myhome_9508,
‘myhome_14’ => $myhome_14,
‘meta’ => $meta,
];-
Ответ изменён 4 дня, 2 часа назад пользователем
dvladimirov77.
Что то Вы перемудрили. Там обычный json объект
плюс проверьте, чтобы при регистрации полей они были доступны по рест апи ‘show_in_rest’ => true,
примеры https://rudrastyh.com/wordpress/add-meta-fields-with-rest-api.html
Запутанно как то всё получается. Пост в базе есть, ид — 15691 в таблице wp_posts.
Но… он создан через плагин MyHome, он не виден в списке постов на /wp-admin/edit.php, у него свой роутер — /wp/v2/listings/(?P<id>[\d]+) и там нет мета поля.
А если я пытаюсь сохранить через роутер /wp/v2/posts/(?P<id>[\d]+), то получаю ошибку rest_post_invalid_id
пытаюсь сохранить через роутер /wp/v2/posts/(?P[\d]+),
Надеюсь Вы не имеете ввиду прямо такой url
Возможно изначально лучше рассказать что Вы хотите получить, а не то что Вы делаете. Может есть альтернативные варианты решения задачи.
Конечно же не такой урл у апи, это из списка роутеров /wp-json/ скопировал 🙂
Я хочу через апи изменить/добавить значение поля meta_value в таблице wp_postmeta
у Вас внешний сервис, сайт, услуга? Или просто через апи в рамках самого вордпресс? Потому что апи обычно используют чтобы менять из вне… обычными запросами…
Именно так — с другого сайта надо заливать данные в ВП.
Сами посты через роутер темы/плагина я создаю без проблем. А вот с мета полями засада приключилась. Сама тема MyHome, https://tangiblewp.com/.
Честно говоря уже не понимаю что у Вас может не так пойти. Делаю обычный запрос например на /wp-json/wp/v2/posts/20945, в теле отправляю json
{
"title": "Новый какой то заголовок",
"meta":{
"footnotes": "998"
}
}и все работает. Важно чтобы эти метаполя были доступны для запросов rest. Эта доступность определяется как писал выше. Это в принципе легко проверить, если на странице гутенберг и они отображаются для редактирования то значит все нормально.
Через /wp-json/wp/v2/posts/20945 не получается отправить — апи ругается: rest_post_invalid_id
Эта тема/плагин имеют собственный роутер, а у него — нет мета аргумента, попробую скрин закинуть, может получится 🙂
Скрин никак, текстом:
/wp/v2/listings/(?P[\d]+)
namespace "wp/v2"
methods (5)[ "GET", "POST", "PUT", "PATCH", "DELETE" ]
endpoints
0 { methods: (1)[…], allow_batch: {…}, args: {…} }
1
methods (3)[ "POST", "PUT", "PATCH" ]
allow_batch { v1: true }
args
id { description: "Unique identifier for the post.", type: "integer", required: false }
date { description: "The date the post was published, in the site's timezone.", format: "date-time", required: false, … }
date_gmt { description: "The date the post was published, as GMT.", format: "date-time", required: false, … }
slug { description: "An alphanumeric identifier for the post unique to its type.", type: "string", required: false }
status { description: "A named status for the post.", type: "string", required: false, … }
password { description: "A password to protect access to the content and excerpt.", type: "string", required: false }
title { description: "The title for the post.", type: "object", required: false, … }
content { description: "The content for the post.", type: "object", required: false, … }
author { description: "The ID for the author of the post.", type: "integer", required: false }
template { description: "The theme file to use to display the post.", type: "string", required: false }
myhome_5495 { description: "The terms assigned to the post in the myhome_5495 taxonomy.", type: "array", required: false, … }
myhome_14 { description: "The terms assigned to the post in the myhome_14 taxonomy.", type: "array", required: false, … }
myhome_9508 { description: "The terms assigned to the post in the myhome_9508 taxonomy.", type: "array", required: false, … }
myhome_15545 { description: "The terms assigned to the post in the myhome_15545 taxonomy.", type: "array", required: false, … }
myhome_4661 { description: "The terms assigned to the post in the myhome_4661 taxonomy.", type: "array", required: false, … }-
Ответ изменён 3 дня, 4 часа назад пользователем
dvladimirov77.
Извините, я забыл что у Вас свой роут listings . Я примеры даю для стандартных роутов.
Если сделать гет запрос на пост через рест апи, то что приходит в ответ? Приложите полный ответ. Если в ответе нет данных по нужным полям, то скорей всего не получится поменять без доработок.
Даже когда отдельный роут, например созданный тип записи через acf то приходит в ответ информация и мета поля можно поменять типа так
{
"title": "Новый какой то заголовок",
"acf":{
"ooo": "998"
}
}И кстати, тема у Вас платная, нужно бы в поддержку написать и они уж точно помогут.
-
Ответ изменён 3 дня, 3 часа назад пользователем
ravilr63.
В поддержку написано, жду ответ.
Роутеры проще наверное показать в сети — https://m2metr.ru/wp-json/
Я думал может как нить через инит мета поля поднять, на вроде register_term_meta.
Но я пока в ВП ничего не понимаю, а доков и примеров очень мало в сети(ну или я не нахожу :)).
Через листинг такое прилетает:
object(stdClass)#2 (50) {
["id"]=>
int(15691)
["date"]=>
string(19) "2025-06-08T09:23:09"
["date_gmt"]=>
string(19) "2025-06-08T09:23:09"
["guid"]=>
object(stdClass)#3 (2) {
["rendered"]=>
string(72) "https://wp.q/listing/prodazha_kvartira_4k_1_3_et__v_evpatoriya_0_452250/"
["raw"]=>
string(72) "https://wp.q/listing/prodazha_kvartira_4k_1_3_et__v_evpatoriya_0_452250/"
}
["modified"]=>
string(19) "2025-06-10T07:01:06"
["modified_gmt"]=>
string(19) "2025-06-10T07:01:06"
["password"]=>
string(0) ""
["slug"]=>
string(50) "prodazha_kvartira_4k_1_3_et__v_evpatoriya_0_452250"
["status"]=>
string(7) "publish"
["type"]=>
string(14) "myhome_listing"
["link"]=>
string(72) "https://wp.q/listing/prodazha_kvartira_4k_1_3_et__v_evpatoriya_0_452250/"
["title"]=>
object(stdClass)#4 (2) {
["raw"]=>
string(6) "112233"
["rendered"]=>
string(6) "112233"
}
["content"]=>
object(stdClass)#5 (4) {
["raw"]=>
string(2018) "<p>Продается 3 х уровневая, большая квартира (Таунхауз), со своим гаражем, в престижном жилом комплексе "Мойнаки", имеющем свой уникальный парк с краснокнижными деревьями. В квартире 3 выхода, один через гараж; 4 очень просторные, светлые комнаты. На первом этаже прихожая, с/у, огромная кухня - гостинная с дорогой мебелью и встроенной техникой (остается покупателям), гараж,выделена своя територия - зона отдыха. На 2 этаже две большие спальни с балконами, в одной вместительная гардеробная(так же с выходом на балкон), большая прачечная комната с душевой кабинкой и с/у, просторная кладовая комната. На 3 этаже огромный спортзал с выделенной спальной зоной и большая комната с выходом на балкон и своей ванной комнатой(с душевой кабиной и ванной, и с/у). Квартира с автономным отоплением, с дорогой мебелью и техникой, выполнен евро ремонт. Дом находится на закрытой територии, со своими зонами отдыха,детские и спортивные площадки, бассейном и парком, имеются дополнительные места для авто. Все необходимое в шаговой доступности. Один собственник, документы РФ.Торг. Принимается любая форма оплаты.</p>"
["rendered"]=>
string(2050) "
<p>Продается 3 х уровневая, большая квартира (Таунхауз), со своим гаражем, в престижном жилом комплексе “Мойнаки”, имеющем свой уникальный парк с краснокнижными деревьями. В квартире 3 выхода, один через гараж; 4 очень просторные, светлые комнаты. На первом этаже прихожая, с/у, огромная кухня – гостинная с дорогой мебелью и встроенной техникой (остается покупателям), гараж,выделена своя територия – зона отдыха. На 2 этаже две большие спальни с балконами, в одной вместительная гардеробная(так же с выходом на балкон), большая прачечная комната с душевой кабинкой и с/у, просторная кладовая комната. На 3 этаже огромный спортзал с выделенной спальной зоной и большая комната с выходом на балкон и своей ванной комнатой(с душевой кабиной и ванной, и с/у). Квартира с автономным отоплением, с дорогой мебелью и техникой, выполнен евро ремонт. Дом находится на закрытой територии, со своими зонами отдыха,детские и спортивные площадки, бассейном и парком, имеются дополнительные места для авто. Все необходимое в шаговой доступности. Один собственник, документы РФ.Торг. Принимается любая форма оплаты.</p>
"
["protected"]=>
bool(false)
["block_version"]=>
int(0)
}
["author"]=>
int(1)
["template"]=>
string(0) ""
["permalink_template"]=>
string(32) "https://wp.q/listing/%pagename%/"
["generated_slug"]=>
string(6) "112233"
["class_list"]=>
array(8) {
[0]=>
string(10) "post-15691"
[1]=>
string(14) "myhome_listing"
[2]=>
string(19) "type-myhome_listing"
[3]=>
string(14) "status-publish"
[4]=>
string(6) "hentry"
[5]=>
string(20) "myhome_5495-for-sale"
[6]=>
string(18) "myhome_14-kvartira"
[7]=>
string(22) "myhome_9508-evpatoriya"
}
["myhome_5495"]=>
array(1) {
[0]=>
string(8) "For Sale"
}
["myhome_14"]=>
array(1) {
[0]=>
string(16) "Квартира"
}
["myhome_130"]=>
array(1) {
[0]=>
string(8) "$ 444.10"
}
["myhome_5974"]=>
array(0) {
}
["myhome_9508"]=>
array(1) {
[0]=>
string(18) "Евпатория"
}
["myhome_15545"]=>
array(0) {
}
["myhome_5462"]=>
string(0) ""
["myhome_5463"]=>
string(0) ""
["myhome_340"]=>
string(0) ""
["myhome_9694"]=>
string(0) ""
["myhome_9733"]=>
string(0) ""
["myhome_15544"]=>
string(0) ""
["myhome_4661"]=>
array(0) {
}
["myhome_145"]=>
string(0) ""
["myhome_344"]=>
string(0) ""
["myhome_345"]=>
object(stdClass)#6 (2) {
["url"]=>
string(0) ""
["embed"]=>
string(0) ""
}
["myhome_3411"]=>
object(stdClass)#7 (2) {
["url"]=>
string(0) ""
["embed"]=>
string(0) ""
}
["myhome_153"]=>
object(stdClass)#8 (2) {
["address"]=>
string(0) ""
["location"]=>
bool(false)
}
["myhome_15694"]=>
string(5) "1 2 3"
["_edit_lock"]=>
string(12) "1749528887:1"
["_edit_last"]=>
string(1) "1"
["expire"]=>
string(0) ""
["featured_expire"]=>
string(0) ""
["views"]=>
string(2) "11"
["phone_reveals"]=>
string(1) "0"
["favorite_count"]=>
string(1) "0"
["myhome_5974_myhome_13"]=>
string(0) ""
["myhome_5973_myhome_13"]=>
string(0) ""
["myhome_130_myhome_13"]=>
string(6) "444.10"
["featured"]=>
string(1) "0"
["myhome_15692"]=>
string(61) "https://www.m2baza.ru/images/foto/49/foto/6842a885110dde8.jpg"
["_links"]=>
object(stdClass)#11 (9) {
["self"]=>
array(1) {
[0]=>
object(stdClass)#9 (2) {
["href"]=>
string(41) "https://wp.q/wp-json/wp/v2/listings/15691"
["targetHints"]=>
object(stdClass)#10 (1) {
["allow"]=>
array(5) {
[0]=>
string(3) "GET"
[1]=>
string(4) "POST"
[2]=>
string(3) "PUT"
[3]=>
string(5) "PATCH"
[4]=>
string(6) "DELETE"
}
}
}
}
["collection"]=>
array(1) {
[0]=>
object(stdClass)#12 (1) {
["href"]=>
string(35) "https://wp.q/wp-json/wp/v2/listings"
}
}
["about"]=>
array(1) {
[0]=>
object(stdClass)#13 (1) {
["href"]=>
string(47) "https://wp.q/wp-json/wp/v2/types/myhome_listing"
}
}
["author"]=>
array(1) {
[0]=>
object(stdClass)#14 (2) {
["embeddable"]=>
bool(true)
["href"]=>
string(34) "https://wp.q/wp-json/wp/v2/users/1"
}
}
["wp:attachment"]=>
array(1) {
[0]=>
object(stdClass)#15 (1) {
["href"]=>
string(45) "https://wp.q/wp-json/wp/v2/media?parent=15691"
}
}
["wp:action-publish"]=>
array(1) {
[0]=>
object(stdClass)#16 (1) {
["href"]=>
string(41) "https://wp.q/wp-json/wp/v2/listings/15691"
}
}
["wp:action-unfiltered-html"]=>
array(1) {
[0]=>
object(stdClass)#17 (1) {
["href"]=>
string(41) "https://wp.q/wp-json/wp/v2/listings/15691"
}
}
["wp:action-assign-author"]=>
array(1) {
[0]=>
object(stdClass)#18 (1) {
["href"]=>
string(41) "https://wp.q/wp-json/wp/v2/listings/15691"
}
}
["curies"]=>
array(1) {
[0]=>
object(stdClass)#19 (3) {
["name"]=>
string(2) "wp"
["href"]=>
string(23) "https://api.w.org/{rel}"
["templated"]=>
bool(true)
}
}
}
}А если на роутер пост кидать, то так:
object(stdClass)#2 (3) {
[«code»]=>
string(20) «rest_post_invalid_id»
[«message»]=>
string(16) «Invalid post ID.»
[«data»]=>
object(stdClass)#3 (1) {
[«status»]=>
int(404)
}
}Подсказали решение, указать мой тип страницы: myhome_listing
add_action(«rest_insert_myhome_listing», function (\WP_Post $post, $request, $creating) {
$metas = $request->get_param(«meta»);
if (is_array($metas)) {
foreach ($metas as $name => $value) {
update_post_meta($post->ID, $name, $value);
}
}
}, 10, 3); -
Ответ изменён 4 дня, 2 часа назад пользователем
- Для ответа на тему необходимо авторизоваться.