Как получить доступ к полям связи ACF в JSON API

#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_» на что-то более подходящее для вашего проекта.