Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON API to show Advanced Custom Fields - WordPress

Tags:

json

wordpress

I am developing a magazine WordPress site that will have a json feed for a Mobile App. I set the backend up using Advanced Custom Fields with a Repeater Field for Multiple Articles and Multiple Pages within each article. http://www.advancedcustomfields.com/add-ons/repeater-field/ Screen shot of Repeater Fields

I am using the JSON API but this does not include any of my custom fields. Is there currently a plugin that can do this?

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

like image 863
SPillai Avatar asked Apr 12 '12 22:04

SPillai


People also ask

What is ACF JSON?

ACF Local JSON is one of my favourite features of Advanced Custom Fields. It was a feature added in version 5 that allows you to save your field group settings to a JSON file within your project. It's really easy to get started, just create a directory in your theme called acf-json .

How do I export advanced custom fields in WordPress?

To export Advanced Custom Fields, go to WP All Export › New Export and select the post type or custom post type attached to your ACF fields. Set up the export using drag & drop, then process the export and proceed to download the export file.

How do I fetch API data in WordPress?

If you want to use the Fetch API with WordPress, you simply have to call the fetch function in your JavaScript code. Follow that function with a . then handler to access the content. You can then display it on your website or in your web application.


2 Answers

@Myke: you helped me tremendously. Here's my humble addition:

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);
}
like image 82
jake Avatar answered Oct 14 '22 19:10

jake


Update for Wordpress 4.7

With the release of Wordpress 4.7 the REST functionality is no longer provided as a distinct plugin, rather its rolled in (no plugin required).

The previous filters don't appear to work. However the following snippet does (can be in your 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;
};

Note the filter is a wild card filter, applied like

apply_filters("rest_prepare_$type", ...

so if you have multiple content types (custom), you will need to do:

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 It appears that rest_prepare_x is called per record. So if you are pinging the index endpoint, it will be called multiple times (so you don't need to check if its posts or post)

like image 37
Chris Avatar answered Oct 14 '22 19:10

Chris