JSON API для отображения расширенных настраиваемых полей - WordPress

Я занимаюсь разработкой сайта WordPress для журналов, который будет содержать json-канал для мобильного приложения. Я создал бэкэнд, используя Расширенные пользовательские поля с полем повторителя для нескольких статей и нескольких страниц в каждой статье.http://www.advancedcustomfields.com/add-ons/repeater-field/ Screen shot of Repeater Fields

Я использую JSON API, но это не относится к моим настраиваемым полям. Есть ли в настоящее время плагин, который может сделать это?

These are the Custom Fields 'slug names' of the previous fields

 Denish18 мая 2012 г., 14:42
У меня такой же проект журналирования для ipad, и мой WebAdmin - это WordPress. Скажите, пожалуйста, как вы управляли этими выходами ACF в JSON? ...

Ответы на вопрос(6)

Пришел сюда с поиском с тем же вопросом. Это еще не полностью проверено, но я думаю, что это на правильном пути. Проверьте это.

У меня на один уровень меньше вложенности, чем у вас, поэтому, возможно, его придется немного изменить. Но плагин JSON API имеет фильтр с именем json_api_encode. У меня есть повторитель под названием спецификации, который выглядит следующим образом.

http://d.pr/i/YMvv

В моем файле функций у меня есть это.

add_filter('json_api_encode', 'my_encode_specs');

function my_encode_specs($response) {
  if (isset($response['posts'])) {
    foreach ($response['posts'] as $post) {
      my_add_specs($post); // Add specs to each post
    }
  } else if (isset($response['post'])) {
    my_add_specs($response['post']); // Add a specs property
  }
  return $response;
}

function my_add_specs(&$post) {
  $post->specs = get_field('specifications', $post->id);
}

Который добавляет пользовательское значение к выходу JSON API. Обратите внимание, что функция get_field из ACF отлично работает здесь для возврата массива значений повторителей.

Надеюсь это поможет!

 26 окт. 2012 г., 10:01
Отличный пример! Большое спасибо. У вас были какие-то изменения для работы с JSON API? Есть еще советы для пользовательских полей / пост мета?

Я не уверен, что вы все еще заинтересованы в решении, но мне удалось изменить файл плагинов json-api models / post.php для отображения данных повторителя в виде массива. Это модификация модификации, сделаннойhttp://wordpress-problem.com/marioario-on-plugin-json-api-fixed-get-all-custom-fields-the-right-way/

замените функцию set_custom_fields_value () на следующую:

function set_custom_fields_value() {

    global $json_api;

    if ($json_api->include_value('custom_fields') && $json_api->query->custom_fields) {

        // Query string params for this query var
        $params = trim($json_api->query->custom_fields);

        // Get all custom fields if true|all|* is passed
        if ($params === "*" || $params === "true" || $params === "all") {

            $wp_custom_fields = get_post_custom($this->id);
            $this->custom_fields = new stdClass();

            // Loop through our custom fields and place on property
            foreach($wp_custom_fields as $key => $val) {
                if (get_field($key)) {
                    $this->custom_fields->$key = get_field($key);
                } else if ($val) {
                    // Some fields are stored as serialized arrays.
                    // This method does not support multidimensionals... 
                    // but didn't see anything wrong with this approach
                    $current_custom_field = @unserialize($wp_custom_fields[$key][0]);

                    if (is_array($current_custom_field)) {

                        // Loop through the unserialized array
                        foreach($current_custom_field as $sub_key => $sub_val) {

                            // Lets append these for correct JSON output
                            $this->custom_fields->$key->$sub_key = $sub_val;
                        }

                    } else {

                        // Break this value of this custom field out of its array
                        // and place it on the stack like usual
                        $this->custom_fields->$key = $wp_custom_fields[$key][0];

                    }
                }
            }
        } else {

            // Well this is the old way but with the unserialized array fix
            $,params = explode(',', $params);
            $wp_custom_fields = get_post_custom($this->id);
            $this->custom_fields = new stdClass();

            foreach ($params as $key) {

                if (isset($wp_custom_fields[$key]) && $wp_custom_fields[$key][0] ) {
                    $current_custom_field = @unserialize($wp_custom_fields[$key][0]);

                    if (is_array($current_custom_field)) {
                        foreach($current_custom_field as $sub_key => $sub_val) {
                            $this->custom_fields->$key->$sub_key = $sub_val;
                        }

                    } else {
                        $this->custom_fields->$key = $wp_custom_fields[$key][0];

                    }

                }
            }
        }

    } else {
        unset($this->custom_fields);

    }
}

Текущая версия ACF распечатывает объект custom_fields при вызове JSON API, содержащий все поля, относящиеся к Post или Page. Я отредактировал версию @Myke, чтобы добавить определенные настраиваемые поля со страницы параметров ACF к каждому сообщению или странице. К сожалению, нет функции get_fields () для всей страницы параметров, поэтому вам придется редактировать ее в зависимости от структуры ваших полей.

add_filter('json_api_encode', 'json_api_encode_acf');

function json_api_encode_acf($response) {
    if (isset($response['posts'])) {
        foreach ($response['posts'] as $post) {
            json_api_add_acf($post); // Add specs to each post
        }
    }
    else if (isset($response['post'])) {
        json_api_add_acf($response['post']); // Add a specs property
    }
    else if (isset($response['page'])) {
        json_api_add_acf($response['page']); // Add a specs to a page
    }

    return $response;
}

function json_api_add_acf(&$post) {
    $post->custom_fields->NAME_OF_YOUR_CUSTOM_FIELD = get_field( 'NAME_OF_YOUR_CUSTOM_FIELD', 'option' );
}

@Myke: вы мне очень помогли. Вот мое скромное дополнение:

add_filter('json_api_encode', 'json_api_encode_acf');


function json_api_encode_acf($response) 
{
    if (isset($response['posts'])) {
        foreach ($response['posts'] as $post) {
            json_api_add_acf($post); // Add specs to each post
        }
    } 
    else if (isset($response['post'])) {
        json_api_add_acf($response['post']); // Add a specs property
    }

    return $response;
}

function json_api_add_acf(&$post) 
{
    $post->acf = get_fields($post->id);
}
 30 авг. 2013 г., 22:38
Потрясающе - работал как шарм!
 13 авг. 2013 г., 12:31
Это гениально
 10 сент. 2013 г., 23:41
Спасатель! Мне потребовалось немного времени, чтобы выяснить, куда его поместить, пришлось прочитать почти всю документацию JSON API для WP. (JSON-api.php)

Обновление дляWordpress 4.7

С выпуском Wordpress 4.7 функциональность REST больше не предоставляется как отдельный плагин, а добавлен (не требуется).

Предыдущие фильтры не работают. Однако следующий фрагмент (может быть в вашемfunctions.php):

>= PHP 5.3

add_filter('rest_prepare_post', function($response) {
    $response->data['acf'] = get_fields($response->data['id']);
    return $response;
});

< PHP 5.3

add_filter('rest_prepare_post', 'append_acf');

function append_acf($response) {
    $response->data['acf'] = get_fields($response->data['id']);
    return $response;
};

Обратите внимание, что фильтр является фильтром подстановочных знаков, применяемым как

apply_filters("rest_prepare_$type", ...

поэтому, если у вас есть несколько типов контента (пользовательский), вам нужно будет сделать:

add_filter('rest_prepare_multiple_choice', 'append_acf');
add_filter('rest_prepare_vocabularies', 'append_acf');

function append_acf($response) {
    $response->data['acf'] = get_fields($response->data['id']);
    return $response;
};

Note Похоже, чтоrest_prepare_x называетсяper record, Поэтому, если вы пропингуете конечную точку индекса, она будет вызываться несколько раз (так что вам не нужно проверять, есть ли в ней сообщения или сообщения)

Теперь есть небольшой плагин, который добавляет фильтр для вас.

https://github.com/PanManAms/WP-JSON-API-ACF

 30 дек. 2016 г., 19:48
Большое спасибо за это! Оно работало завораживающе! :-D
 03 февр. 2017 г., 17:22
Спасибо братан за это

Ваш ответ на вопрос