使用WP REST API设置ACF

时间:2017-03-27 22:56:12

标签: php wordpress rest advanced-custom-fields

我使用以下插件从WordPress REST API获取JSON数据:

高级自定义字段PRO WP REST API ACF到REST API

我有一个名为"自定义导航"的自定义帖子类型。我有一个自定义字段组(通过ACF)称为"自定义导航项"仅在帖子类型为自定义导航时应用。该组中的字段称为"图像"和#34; Caption",我无法获得它的价值。

这里是我设置菜单并为ACF添加REST API插件的过滤器的地方。这些按预期工作。     

function custom_setup() {
    // This theme uses wp_nav_menu() in two locations.
    register_nav_menus( array(
        'topnav'    => 'Top Menu',
        'footer-left-nav' => 'Footer Top Menu 1',
        'footer-center-left-nav' => 'Footer Top Menu 2',
        'footer-center-right-nav' => 'Footer Top Menu 3',
        'footer-right-nav' => 'Footer Top Menu 4',
        'footer-bottom-left-nav' => 'Footer Bottom Menu 1',
        'footer-bottom-right-nav' => 'Footer Bottom Menu 2',
    ) );

    // Enable the option show in rest
    add_filter( 'acf/rest_api/field_settings/show_in_rest', '__return_true' );

    // Enable the option edit in rest
    add_filter( 'acf/rest_api/field_settings/edit_in_rest', '__return_true' );
}

add_action( 'after_setup_theme', ‘custom_setup' );

此函数将我的自定义帖子类型菜单项设置为WP REST API。这样做就像预期的那样。但是,这些帖子类型菜单项的ACF字段不发送

function wp_api_v2_custom_get_menu_data ($data) {

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $data['id'] ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[$data['id']] );
    $menuItems = wp_get_nav_menu_items($menu->term_id);

    return $menuItems;
    } else {
        return array();
    }
}

add_action( 'rest_api_init', function () {
    register_rest_route( 'menus/v1', '/menus/(?P<id>[a-zA-Z(-]+)', array(
        'methods' => 'GET',
        'callback' => 'wp_api_v2_custom_get_menu_data',
    ) );
} );

这是我设置自定义帖子类型的功能

function custom_nav_post_type() {
    register_post_type(‘custom_nav',
        array (
            'name'             => ‘Custom Navigation',
            'singular_name'        => 'CustomNav',
            'can_export'        => TRUE,
            'exclude_from_search'    => FALSE,
            'has_archive'        => TRUE,
            'hierarchical'        => TRUE,
            'label'            => 'Custom Navigation',
            'menu_position'        => 5,
            'public'            => TRUE,
            'publicly_queryable'    => TRUE,
            'query_var'        => ‘customnav',
            'rewrite'            => array ( 'slug' => 'shop' ),
            'show_ui'        => TRUE,
            'show_in_menu'    => TRUE,
            'show_in_nav_menus'    => TRUE,
            'show_in_rest'        => TRUE,
            'rest_base'        => 'shop',
                'rest_controller_class'    => 'WP_REST_Posts_Controller',
            'supports'        => array ('title')
        )
    );
}
add_action( 'init', 'custom_nav_post_type' );
?>

这一切的输出

[
{
    "id":184,
    "acf":[

    ]
},
{
    "id":183,
    "acf":[

    ]
},
{
    "id":182,
    "acf":[

    ]
},
{
    "id":181,
    "acf":[

    ]
},
{
    "id":180,
    "acf":[

    ]
},
{
    "id":176,
    "acf":[

    ]
}
]

对于我出错的地方的任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

以下是我如何解决它。我错过了自定义帖子类型的过滤器,我将其添加到“custom_setup”函数中。

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

所以过滤器是一个外卡过滤器,应用

apply_filter("rest_prepare_YOUR-CUSTOM-POST-TYPE-NAME-HERE", ...