WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have a script that pulls the facebook likes via facebook graph and writes them in my DB. However it uses file_get_contents_curl for the request and this is causing problems, so I'd like to use the wp_remote_get() command. I've tried to change it but somehow I can't do it (I don't really have PHP knowledge).

Here's the part of the script:

foreach($posts as $post)
    {

        $fb = json_decode(file_get_contents_curl('http://graph.facebook.com/?id='.get_permalink($post->ID)));
        if( !isset( $fb->likes) && isset($fb->shares) )
        {
            $fb->likes = $fb->shares;
        }
        //$fb->likes = isset($fb->likes) ? $fb->likes : 0;
        $myfblikes = sprintf("%04s", (int)$fb->likes);
        update_post_meta($post->ID, 'fb_likes', $myfblikes);
    }
share|improve this question
up vote 3 down vote accepted

You can try this:

foreach( $posts as $post )
{
    $url      = sprintf( 'http://graph.facebook.com/?id=%s', get_permalink( $post->ID ) );
    $response = wp_remote_get( $url,  array( 'timeout' => 15 ) );


    if( ! is_wp_error( $response ) 
        && isset( $response['response']['code'] )        
        && 200 === $response['response']['code'] )
    {
        $body = wp_remote_retrieve_body( $response );
        $fb   = json_decode( $body );

        if( ! isset( $fb->likes ) && isset( $fb->shares ) )
        {
            $fb->likes = $fb->shares;
        }

        if( isset( $fb->likes ) )
        {
            $myfblikes = sprintf( '%04s', (int) $fb->likes );
            update_post_meta( $post->ID, 'fb_likes', $myfblikes );
       }
    }
}

where we can use wp_remote_retrieve_body() to get the response body of wp_remote_get().

share|improve this answer

wp_remote_get returns an array, not a string. So,

foreach($posts as $post) {

    // get remote document as JSON
    $json = wp_remote_get( 'http://graph.facebook.com/?id=' . get_permalink($post->ID) );

    // check for WP_Error
    if(is_wp_error($json))
        return false;

    // Decode JSON and get document body as associative array
    $fbData = json_decode($json['body'], true);

    // return (numeric) array value
    return intval($fbData['likes']);
}

I'm not sure about get_permalink($post->ID) part. That's OK only if you have a FB page for each post.

share|improve this answer

Just change one function with the other. This require also that you change the way you are using json_decode() because wp_remote_get() returns an array and json_decode() requires a string.

foreach($posts as $post) {

    $fb = wp_remote_get('http://graph.facebook.com/?id='.get_permalink($post->ID));
    if($fb && !is_wp_error($fb){
        $body = json_decode(wp_remote_retrieve_body($fb));
        if( !isset( $body->likes) && isset($body->shares) ) {
            $body->likes = $body->shares;
        }
        //$body->likes = isset($body->likes) ? $body->likes : 0;
        $myfblikes = sprintf("%04s", (int)$body->likes);
        update_post_meta($post->ID, 'fb_likes', $myfblikes);
    }
}
share|improve this answer
    
that was the frist thing I tried. It gives me this error Warning: json_decode() expects parameter 1 to be string, array given in /usr/www/users/toaste/zitate/wp-content/plugins/order_posts_by_social/order_post‌​s_by_social.php on line 151 - line 151 is the line I replaced the command btw – nzo Sep 20 '13 at 10:09
1  
That is because you are passing an array to json_decode(), not a string. This error is not related with the wp_remote_get() itself, it is related with its returned value and the way you are using json_decode(). See edited answer. – cybmeta Sep 20 '13 at 10:45

This solved my problem, try out this

 $response = wp_remote_get( 'http://www.example.com/index.html' );
if( is_array($response) ) {
  $header = $response['headers']; // array of http header lines
  $body = $response['body']; // use the content
}
echo $body; // to print content
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.