WP Rest API + AngularJS : How to grab Featured Image for display on page?

10,793

Solution 1

To get featured images response, please add _embed on the query string. example:

http://demo.wp-api.org/wp-json/wp/v2/posts/?_embed

Then, access the featured images in returned JSON response using _embedded['wp:featuredmedia'][0].media_details.sizes.thumbnail.source_url

var app = angular.module('myApp', ['ngSanitize']);
    app.controller('Ctrl', function($http, $scope) {
        $http.get("http://ogmda.com/wp/wp-json/wp/v2/posts?_embed").success(function(data) {
        $scope.posts = data;

        var firstFeaturedImageUrl = $scope.posts[0]._embedded['wp:featuredmedia'][0].media_details.sizes.thumbnail.source_url;
    });
});

Solution 2

A better way would be to integrate the URL of the featured image into the json response so that you get it all in a single request. You can add the following code (inside your-theme/functions.php) to achieve this:

//Get image URL
function get_thumbnail_url($post){
    if(has_post_thumbnail($post['id'])){
        $imgArray = wp_get_attachment_image_src( get_post_thumbnail_id( $post['id'] ), 'full' ); // replace 'full' with 'thumbnail' to get a thumbnail
        $imgURL = $imgArray[0];
        return $imgURL;
    } else {
        return false;
    }
}
//integrate with WP-REST-API
function insert_thumbnail_url() {
     register_rest_field( 'post',
                          'featured_image',  //key-name in json response
                           array(
                             'get_callback'    => 'get_thumbnail_url',
                             'update_callback' => null,
                             'schema'          => null,
                             )
                         );
     }
//register action
add_action( 'rest_api_init', 'insert_thumbnail_url' );

Then in your view, you can use {{ post.featured_image }}

Note: To get the same image in different sizes, use above wp_get_attachment_image_src function that accepts any valid image size, or an array of width and height values in pixels as its second parameter.

Share:
10,793

Related videos on Youtube

redshift
Author by

redshift

I've received so much help on this site over the years that I hope I can contribute back in some small way.

Updated on June 04, 2022

Comments

  • redshift
    redshift almost 2 years

    I am accessing Wordpress data through an HTTP REST API plugin (this wordpress plugin: http://v2.wp-api.org/). I know how to grab my post title, but how do I display the featured image associated with that post using this plugin? My test shows the post title and the featured image ID, but I am unsure how to display the actual image. Test Example.

    Here's my code:

        <div ng-app="myApp">
        <div ng-controller="Ctrl">
            <div ng-repeat="post in posts | limitTo: 1">
                <h2 ng-bind-html="post.title.rendered"></h2>
    
                <p>{{ post.featured_image }}</p>
    
            </div>
        </div>
    </div>
    
    
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-sanitize.min.js"></script>
    
    <script>
    
    var app = angular.module('myApp', ['ngSanitize']);
        app.controller('Ctrl', function($http, $scope) {
            $http.get("http://ogmda.com/wp/wp-json/wp/v2/posts").success(function(data) {
            $scope.posts = data;
        });
    });
    
    </script>
    
  • per.eight
    per.eight about 8 years
    @sakarya Yes it does support custom post type, be sure to set 'show_in_rest'=> true in initialisation of your custom post type. Heres more detailed way v2.wp-api.org/extending/custom-content-types
  • sakarya
    sakarya about 8 years
    I'm writing custom endpoints with custom values. When my app finish I will share my codes.