<add_shortcode( 'pocket_items', 'pocket_items_shortcode' );

function pocket_items_shortcode( $atts = array() ) {

    $defaults = array(
        'key'         => '84232-1c30b51dfc7eb5b29a0b2b90',
        'token'       => 'a4ed6383-e2bf-794f-8ebf-511100',
        'tag'         => today,
        'store_items' => '7200',
    );

    $pocket_items = get_pocket_items( shortcode_atts( $defaults, $atts ) );


    if ( empty( $pocket_items ) ) {
        return null;
    }

    $output = '<div class="pocket-items">';

    foreach ( $pocket_items as $item ) {
        $output .= get_pocket_item_html( get_pocket_item_data( $item ) );
    }

    $output .= '</div><!-- .pocket-items -->';

    return $output;
}

function get_pocket_item_data( $item ) {
    $item = (object) $item;

    $data = array(
        'id'         => ! empty( $item->resolved_id )    ? $item->resolved_id:    null,
        'url'        => ! empty( $item->resolved_url )   ? $item->resolved_url:   null,
        'title'      => ! empty( $item->resolved_title ) ? $item->resolved_title: null,
        'time_added' => ! empty( $item->time_added )     ? $item->time_added:     false,
        'authors'    => ! empty( $item->authors )        ? $item->authors:        false,
        'word_count' => ! empty( $item->word_count )     ? $item->word_count:     false,
        'has_image'  => ! empty( $item->has_image )      ? $item->has_image:      false,
        'excerpt'    => ! empty( $item->excerpt )        ? $item->excerpt:        false,
        'tags'       => ! empty( $item->tags )           ? $item->tags:           false,
        'image_src'  => false,
    );

    if ( ! empty( $item->item_id ) ) {
        $data['id'] = $item->item_id;
    }

    if ( ! empty( $item->given_url ) ) {
        $data['url'] = $item->given_url;
    }

    if ( ! empty( $item->given_title ) ) {
        $data['title'] = $item->given_title;
    }

    if ( empty( $data['title'] ) ) {
        $data['title'] = $data['url'];
    }

    if ( ! empty( $item->image['src'] ) ) {
        $data['image_src'] = $item->image['src'];
    }

    return $data;
}

function get_pocket_item_html( $data ) {
    $img_src = $data['image_src'] ? $data['image_src'] : false;
    $class   = 'pocket-item';
    $title   = $data['title'];

    if ( $img_src ) {
        $class .= ' has-image';
    }

    if ( $url = $data['url'] ) {
        $title = '<a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $title ) . '</a>';
    }

    $output = '<div id="pocket-' . absint( $data['id'] ) . '" class="' . $class . '">';

    if ( $img_src ) {
        $output .= '<div class="pocket-image" style="background-image: url(' . esc_url( $img_src ) . ');"></div>';
    }

    $output .= '<div class="pocket-main">';

    $output .= '<h3 class="pocket-title">' . $title . '</h3>';

    $output .= '<div class="pocket-meta">';

    if ( $time = $data['time_added'] ) {
        $output .= '<span class="date-added meta-section">';
        $output .= date( 'M\. j, Y', esc_attr( $time ) );
        $output .= '</span>';
    }

    if ( $authors = $data['authors'] ) {
        foreach ( (array) $authors as $author ) {
            if ( isset( $author['name'] ) ) {

                $name = $author['name'];
                if ( isset( $author['url'] ) ) {
                    $name = '<a href="' . esc_url( $author['url'] ) . '">' . esc_html( $name ) . '</a>';
                }

                $output .= '<span class="author meta-section">' . $name . '</span>';

                break;
            }
        }
    }

    if ( $word_count = $data['word_count'] ) {
        $output .= '<span class="word-count meta-section">';
        $output .= absint( $word_count ) . ' words';
        $output .= '</span>';
    }

    $output .= '</div><!-- .pocket-meta -->';

    if ( $excerpt = $data['excerpt'] ) {
        $output .= '<div class="pocket-excerpt">';
        $output .= wpautop( $excerpt, false );
        $output .= '</div><!-- .pocket-excerpt -->';
    }

    if ( $tags = $data['tags'] ) {
        $output .= '<ul class="pocket-item-tags">';
        foreach ( $tags as $tag => $tag_info ) {
            $output .= '<li>' . esc_html( $tag ) . '</li>';
        }
        $output .= '</ul>';
    }

    $output .= '</div><!-- .pocket-main -->';

    $output .= '</div><!-- #pocket-' . absint( $data['id'] ) . ' -->';

    return $output;
}

function get_pocket_items( $args = array() ) {
    $defaults = array(
        'key'         => null,
        'token'       => null,
        'tag'         => null,
        'count'       => 10,
        'store_items' => '7200',
    );

    $args = wp_parse_args( $args, $defaults );

    if ( ! isset( $args['key'], $args['token'] ) ) {
        return false;
    }

   
    $request_args = array(
        'consumer_key' => $args['key'],
        'access_token' => $args['token'],
        'tag'          => $args['tag'],
        'detailType'   => 'complete',
        'state'        => 'all',
        'count'        => $args['count'],
    );

    $cache_tag      = 'my_pocket_reading_list';
    $cache_args_tag = 'my_pocket_reading_list_args';

    if ( ! empty( $args['store_items'] ) ) {
        $cache      = get_transient( $cache_tag );
        $cache_args = get_transient( $cache_args_tag );

   
        if ( ! empty( $cache ) && $cache_args === $request_args ) {
            return $cache;
        }
    }

    $request = get_pocket_response( 'https://getpocket.com/v3/get', $request_args );

    if ( ! $request || empty( $request['list'] ) ) {
        return false;
    }

    if ( ! empty( $args['store_items'] ) ) {
        set_transient( $cache_tag, $request['list'], $args['store_items'] );
        set_transient( $cache_args_tag, $request_args, $args['store_items'] );
    }

    return $request['list'];
}


function get_pocket_response( $url, $post ) {
    $response = wp_safe_remote_post( $url, array( 'body' => $post ) );

    if ( is_wp_error( $response ) ) {
        return false;
    }

    return json_decode( wp_remote_retrieve_body( $response ), true );
}
Laura PettittComment