#json #wordpress #angularjs #advanced-custom-fields
#json #wordpress #angularjs #расширенные пользовательские поля
Вопрос:
я фанат WordPress и большую часть времени работаю с плагином Advanced Custom Fields. У меня есть два пользовательских типа записей, которые связаны вместе с полем отношений из плагина ACF. В настоящее время я работаю над мобильной версией, в которой я использую плагин JSON API и AngularJS. Это работает отлично, вместо этого значения поля отношений.
Это я вижу в файле JSON с 1 связанным ресурсом:
["a:1:{i:0;s:3:"163";}", "a:1:{i:0;s:3:"163";}"]
и это для 2 связанных ресурсов:
["a:2:{i:0;s:3:"261";i:1;s:2:"56";}", "a:2:{i:0;s:3:"261";i:1;s:2:"56";}"]
Обновить
Это фрагмент из файла JSON. Связанные поля являются «Динамиками» с уродливыми идентификаторами в них. Это то, что я получаю из JSON API из WordPress.
"custom_fields": {
"main_statement": [
"",
""
],
"type_of_presentation": [
"keynote",
"keynote"
],
"room": [
"no_room",
"no_room"
],
"skill_level": [
"null",
"null"
],
"start_date": [
"1412084700",
"1412084700"
],
"end_date": [
"1412087700",
"1412087700"
],
"speakers": [
"a:1:{i:0;s:3:"154";}",
"a:1:{i:0;s:3:"154";}"
]
}
Есть ли у вас какие-либо подсказки, как я могу извлечь идентификаторы из этой грязной вещи, чтобы я мог искать идентификаторы во всем объекте JSON для отображения связанных сообщений?
Большое спасибо!
С наилучшими пожеланиями
Комментарии:
1. отображаемые данные не являются допустимыми в формате JSON, трудно помочь с неверными данными
2. привет, @charlietfl Я скопировал некоторый код из JSON, надеюсь, это поможет.
3.
speakers
данные представляют собой массивы с сериями php,json_decode()
сначала их
Ответ №1:
Данные «Динамиков» представляют собой сериализованный массив php.
Таким образом, вам в основном просто нужно использовать функцию unserialize() php. Я протестировал это, и это, действительно, извлекает идентификаторы в массивах
json_decode () не будет работать с данными, отличными от JSON.
Ответ №2:
Во-первых, я бы настоятельно рекомендовал перейти на WP REST API v2, который в конечном итоге будет включен в ядро WordPress.
Отвечая на ваш вопрос, проблема в том, что используемый вами JSON API -плагин отображает данные точно так, как они хранятся в базе данных MySQL. Для того, чтобы объекты PHP были сохранены в базе данных, они должны быть сериализованы. a:1:{i:0;s:3:"154";}
это сериализованное представление массива PHP array("154")
.
Что нам нужно сделать, так это применить maybe_unserialize к каждому значению пользовательского поля в ответе. К счастью, автор плагина JSON API включил json_api_import_wp_post
действие в плагин, которое запускается сразу после формирования объекта post ответа. Вы можете добавить приведенный ниже фрагмент кода в свою тему functions.php или пользовательский плагин (если он у вас есть для проекта).
/**
* Apply maybe_unserialize on all post's custom_fields in a JSON API response.
*
* @param JSON_API_Post $api_post The result of JSON_API_Post->import_wp_object
* @param WP_Post $wp_post WP_Post that was converted
* @return JSON_API_Post
*/
function namespace_unserialize_json_api_import_wp_post($api_post, $wp_post) {
// Check if there are custom_fields
if( isset($api_post->custom_fields) ) {
// Loop them all through
foreach($api_post->custom_fields as $key => $custom_field) {
// All of the custom_field values are arrays, so apply maybe_unserialize
// to all the array items with maybe_unserialize and set it as the key
$api_post->custom_fields->$key = array_map('maybe_unserialize', $custom_field);
}
}
return $api_post;
}
// Add namespace_unserialize_json_api_import_wp_post to the json_api_import_wp_post action hook.
add_action('json_api_import_wp_post', 'namespace_unserialize_json_api_import_wp_post', 10, 2);
Примечание: Замените «namespace_» на что-то более подходящее для вашего проекта.