WordPress.org

Plugin Directory

Changeset 675218


Ignore:
Timestamp:
03/02/13 00:35:42 (14 months ago)
Author:
aaroncampbell
Message:

Version 2.5.0-alpha:

  • oAuth for new Twitter API
  • Support for lists
Location:
twitter-widget-pro/trunk
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • twitter-widget-pro/trunk/readme.txt

    r618376 r675218  
    131131== Upgrade Notice == 
    132132 
     133= 2.5.0 = 
     134Upgrade to the new Twitter API and add support for lists 
     135 
    133136= 2.4.1 = 
    134137Better support for hashtags with international characters & new German translation 
     
    174177 
    175178== Changelog == 
     179 
     180= 2.5.0 = 
     181* Use the new Twitter API with oAuth 
     182* Adds support for lists 
     183* No longer supports non-https Twitter requests (Twitter API requirement) 
    176184 
    177185= 2.4.1 = 
  • twitter-widget-pro/trunk/tlc-transients.php

    r599782 r675218  
    88 
    99        public function init() { 
    10             if ( isset( $_POST['_tlc_update'] ) ) { 
    11                 $update = get_transient( 'tlc_up__' . $_POST['key'] ); 
     10            if ( isset( $_POST['_tlc_update'] ) 
     11                && ( 0 === strpos( $_POST['_tlc_update'], 'tlc_lock_' ) ) 
     12                && isset( $_POST['key'] ) 
     13            ) { 
     14                $update = get_transient( 'tlc_up__' . md5( $_POST['key'] ) ); 
    1215                if ( $update && $update[0] == $_POST['_tlc_update'] ) { 
    1316                    tlc_transient( $update[1] ) 
    1417                        ->expires_in( $update[2] ) 
     18                        ->extend_on_fail( $update[5] ) 
    1519                        ->updates_with( $update[3], (array) $update[4] ) 
    1620                        ->set_lock( $update[0] ) 
     
    2125        } 
    2226    } 
    23 } 
    24  
    25 new TLC_Transient_Update_Server; 
     27 
     28    new TLC_Transient_Update_Server; 
     29} 
    2630 
    2731if ( !class_exists( 'TLC_Transient' ) ) { 
    2832    class TLC_Transient { 
    2933        public $key; 
     34        public $raw_key; 
    3035        private $lock; 
    3136        private $callback; 
    3237        private $params; 
    3338        private $expiration = 0; 
     39        private $extend_on_fail = 0; 
    3440        private $force_background_updates = false; 
    3541 
    3642        public function __construct( $key ) { 
    37             $this->key = substr( $key, 0, 37 ); 
     43            $this->raw_key = $key; 
     44            $this->key = md5( $key ); 
     45        } 
     46 
     47        private function raw_get() { 
     48            return get_transient( 'tlc__' . $this->key ); 
    3849        } 
    3950 
    4051        public function get() { 
    41             $data = get_transient( $this->key ); 
     52            $data = $this->raw_get(); 
    4253            if ( false === $data ) { 
    4354                // Hard expiration 
     
    6172        private function schedule_background_fetch() { 
    6273            if ( !$this->has_update_lock() ) { 
    63                 set_transient( 'tlc_up__' . $this->key, array( $this->new_update_lock(), $this->key, $this->expiration, $this->callback, $this->params ), 300 ); 
     74                set_transient( 'tlc_up__' . $this->key, array( $this->new_update_lock(), $this->raw_key, $this->expiration, $this->callback, $this->params, $this->extend_on_fail ), 300 ); 
    6475                add_action( 'shutdown', array( $this, 'spawn_server' ) ); 
    6576            } 
     
    6980        public function spawn_server() { 
    7081            $server_url = home_url( '/?tlc_transients_request' ); 
    71             wp_remote_post( $server_url, array( 'body' => array( '_tlc_update' => $this->lock, 'key' => $this->key ), 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) ); 
     82            wp_remote_post( $server_url, array( 'body' => array( '_tlc_update' => $this->lock, 'key' => $this->raw_key ), 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) ); 
    7283        } 
    7384 
     
    8293                $this->set( $data ); 
    8394            } catch( Exception $e ) { 
    84                 $data = false; 
     95                if ( $this->extend_on_fail > 0 ) { 
     96                    $data = $this->raw_get(); 
     97                    if ( $data ) { 
     98                        $data = $data[1]; 
     99                        $old_expiration = $this->expiration; 
     100                        $this->expiration = $this->extend_on_fail; 
     101                        $this->set( $data ); 
     102                        $this->expiration = $old_expiration; 
     103                    } 
     104                } else { 
     105                    $data = false; 
     106                } 
    85107            } 
    86108            $this->release_update_lock(); 
     
    90112        public function set( $data ) { 
    91113            // We set the timeout as part of the transient data. 
    92             // The actual transient has no TTL. This allows for soft expiration. 
     114            // The actual transient has a far-future TTL. This allows for soft expiration. 
    93115            $expiration = ( $this->expiration > 0 ) ? time() + $this->expiration : 0; 
    94             set_transient( $this->key, array( $expiration, $data ) ); 
     116            $transient_expiration = ( $this->expiration > 0 ) ? $this->expiration + 31536000 : 0; // 31536000 = 60*60*24*365 ~= one year 
     117            set_transient( 'tlc__' . $this->key, array( $expiration, $data ), $transient_expiration ); 
    95118            return $this; 
    96119        } 
     
    104127 
    105128        private function new_update_lock() { 
    106             $this->lock = md5( uniqid( microtime() . mt_rand(), true ) ); 
     129            $this->lock = uniqid( 'tlc_lock_', true ); 
    107130            return $this->lock; 
    108131        } 
     
    130153        public function expires_in( $seconds ) { 
    131154            $this->expiration = (int) $seconds; 
     155            return $this; 
     156        } 
     157 
     158        public function extend_on_fail( $seconds ) { 
     159            $this->extend_on_fail = (int) $seconds; 
    132160            return $this; 
    133161        } 
  • twitter-widget-pro/trunk/wp-twitter-widget.php

    r658175 r675218  
    44 * Plugin URI: http://bluedogwebservices.com/wordpress-plugin/twitter-widget-pro/ 
    55 * Description: A widget that properly handles twitter feeds, including @username, #hashtag, and link parsing.  It can even display profile images for the users.  Requires PHP5. 
    6  * Version: 2.4.1 
     6 * Version: 2.5.0-alpha 
    77 * Author: Aaron D. Campbell 
    88 * Author URI: http://ran.ge/ 
     
    3131require_once( 'tlc-transients.php' ); 
    3232require_once( 'range-plugin-framework.php' ); 
    33 define( 'TWP_VERSION', '2.4.0' ); 
     33define( 'TWP_VERSION', '2.5.0-alpha' ); 
    3434 
    3535/** 
     
    6262        $instance = $this->_getInstanceSettings( $instance ); 
    6363        $wpTwitterWidget = wpTwitterWidget::getInstance(); 
     64        $users = $wpTwitterWidget->get_users_list( true ); 
     65        $lists = $wpTwitterWidget->get_lists(); 
     66 
    6467?> 
    6568            <p> 
    6669                <label for="<?php echo $this->get_field_id( 'username' ); ?>"><?php _e( 'Twitter username:', $this->_slug ); ?></label> 
    67                 <input class="widefat" id="<?php echo $this->get_field_id( 'username' ); ?>" name="<?php echo $this->get_field_name( 'username' ); ?>" type="text" value="<?php esc_attr_e( $instance['username'] ); ?>" /> 
    68             </p> 
     70                <select id="<?php echo $this->get_field_id( 'username' ); ?>" name="<?php echo $this->get_field_name( 'username' ); ?>"> 
     71                    <option></option> 
     72                    <?php 
     73                    $selected = false; 
     74                    foreach ( $users as $u ) { 
     75                        ?> 
     76                        <option value="<?php echo esc_attr( strtolower( $u['screen_name'] ) ); ?>"<?php $s = selected( strtolower( $u['screen_name'] ), strtolower( $instance['username'] ) ) ?>><?php echo esc_html( $u['screen_name'] ); ?></option> 
     77                        <?php 
     78                        if ( ! empty( $s ) ) 
     79                            $selected = true; 
     80                    } 
     81                    ?> 
     82                </select> 
     83            </p> 
     84            <p> 
     85                <label for="<?php echo $this->get_field_id( 'list' ); ?>"><?php _e( 'Twitter list:', $this->_slug ); ?></label> 
     86                <select id="<?php echo $this->get_field_id( 'list' ); ?>" name="<?php echo $this->get_field_name( 'list' ); ?>"> 
     87                    <option></option> 
     88                    <?php 
     89                    foreach ( $lists as $user => $user_lists ) { 
     90                        echo '<optgroup label="' . esc_attr( $user ) . '">'; 
     91                        foreach ( $user_lists as $list_id => $list_name ) { 
     92                            ?> 
     93                            <option value="<?php echo esc_attr( $user . '::' . $list_id ); ?>"<?php $s = selected( $user . '::' . $list_id, strtolower( $instance['list'] ) ) ?>><?php echo esc_html( $list_name ); ?></option> 
     94                            <?php 
     95                        } 
     96                        echo '</optgroup>'; 
     97                    } 
     98                    ?> 
     99                </select> 
     100            </p> 
     101            <?php 
     102            if ( ! $selected && ! empty( $instance['username'] ) ) { 
     103                $query_args = array( 
     104                    'action' => 'authorize', 
     105                    'screen_name' => $instance['username'], 
     106                ); 
     107                $authorize_user_url = wp_nonce_url( add_query_arg( $query_args, $wpTwitterWidget->get_options_url() ), 'authorize' ); 
     108                ?> 
     109            <p> 
     110                <a href="<?php echo esc_url( $authorize_user_url ); ?>" style="color:red;"> 
     111                    <?php _e( 'You need to authorize this account.', $this->_slug ); ?> 
     112                </a> 
     113            </p> 
     114                <?php 
     115            } 
     116            ?> 
    69117            <p> 
    70118                <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Give the feed a title ( optional ):', $this->_slug ); ?></label> 
     
    189237 */ 
    190238class wpTwitterWidget extends RangePlugin { 
    191     private $_api_url; 
     239    /** 
     240     * @var wpTwitter 
     241     */ 
     242    private $_wp_twitter_oauth; 
    192243 
    193244    /** 
     
    197248 
    198249    protected function _init() { 
     250        require_once( 'lib/wp-twitter.php' ); 
     251 
    199252        $this->_hook = 'twitterWidgetPro'; 
    200253        $this->_file = plugin_basename( __FILE__ ); 
     
    219272        add_filter( 'widget_twitter_content', 'convert_chars' ); 
    220273        add_filter( $this->_slug .'-opt-twp', array( $this, 'filterSettings' ) ); 
     274        add_filter( $this->_slug .'-opt-twp-authed-users', array( $this, 'authed_users_option' ) ); 
    221275        add_shortcode( 'twitter-widget', array( $this, 'handleShortcodes' ) ); 
    222276 
     
    227281 
    228282    protected function _post_settings_init() { 
    229         if ( ! in_array( $this->_settings['twp']['http_vs_https'], array( 'http', 'https' ) ) ) 
    230             $this->_settings['twp']['http_vs_https'] = 'https'; 
    231         $this->_api_url = $this->_settings['twp']['http_vs_https'] . '://api.twitter.com/1/'; 
     283        $oauth_settings = array( 
     284            'consumer-key'    => $this->_settings['twp']['consumer-key'], 
     285            'consumer-secret' => $this->_settings['twp']['consumer-secret'], 
     286        ); 
     287        $this->_wp_twitter_oauth = new wpTwitter( $oauth_settings ); 
     288 
     289        // We want to fill 'twp-authed-users' but not overwrite them when saving 
     290        $this->_settings['twp-authed-users'] = apply_filters($this->_slug.'-opt-twp-authed-users', get_option('twp-authed-users')); 
    232291    } 
    233292 
     
    259318            exit; 
    260319        } 
     320 
     321        if ( 'authorize' == $_GET['action'] ) { 
     322            check_admin_referer( 'authorize' ); 
     323            $auth_redirect = add_query_arg( array( 'action' => 'authorized' ), $this->get_options_url() ); 
     324            $token = $this->_wp_twitter_oauth->getRequestToken( $auth_redirect ); 
     325            if ( is_wp_error( $token ) ) 
     326                return; 
     327            update_option( '_twp_request_token_'.$token['nonce'], $token ); 
     328            $screen_name = empty( $_GET['screen_name'] )? '':$_GET['screen_name']; 
     329            wp_redirect( $this->_wp_twitter_oauth->get_authorize_url( $screen_name ) ); 
     330            exit; 
     331        } 
     332        if ( 'authorized' == $_GET['action'] ) { 
     333            $redirect_args = array( 
     334                'message'    => strtolower( $_GET['action'] ), 
     335                'authorized' => '', 
     336            ); 
     337            if ( empty( $_GET['oauth_verifier'] ) || empty( $_GET['nonce'] ) ) 
     338                wp_safe_redirect( add_query_arg( $redirect_args, $this->get_options_url() ) ); 
     339 
     340            $this->_wp_twitter_oauth->set_token( get_option( '_twp_request_token_'.$_GET['nonce'] ) ); 
     341            delete_option( '_twp_request_token_'.$_GET['nonce'] ); 
     342 
     343            $token = $this->_wp_twitter_oauth->get_access_token( $_GET['oauth_verifier'] ); 
     344            $this->_settings['twp-authed-users'][strtolower($token['screen_name'])] = $token; 
     345            update_option( 'twp-authed-users', $this->_settings['twp-authed-users'] ); 
     346 
     347            $redirect_args['authorized'] = $token['screen_name']; 
     348            wp_safe_redirect( add_query_arg( $redirect_args, $this->get_options_url() ) ); 
     349            exit; 
     350        } 
    261351    } 
    262352 
    263353    public function show_messages() { 
    264         if ( ! empty( $_GET['message'] ) && 'clear-locks' == $_GET['message'] ) { 
    265             if ( empty( $_GET['locks_cleared'] ) || 0 == $_GET['locks_cleared'] ) 
    266                 $msg = __( 'There were no locks to clear!', $this->_slug ); 
    267             else 
    268                 $msg = sprintf( _n( 'Successfully cleared %d lock.', 'Successfully cleared %d locks.', $_GET['locks_cleared'], $this->_slug ), $_GET['locks_cleared'] ); 
    269             echo "<div class='updated'>" . esc_html( $msg ) . '</div>'; 
     354        if ( ! empty( $_GET['message'] ) ) { 
     355            if ( 'clear-locks' == $_GET['message'] ) { 
     356                if ( empty( $_GET['locks_cleared'] ) || 0 == $_GET['locks_cleared'] ) 
     357                    $msg = __( 'There were no locks to clear!', $this->_slug ); 
     358                else 
     359                    $msg = sprintf( _n( 'Successfully cleared %d lock.', 'Successfully cleared %d locks.', $_GET['locks_cleared'], $this->_slug ), $_GET['locks_cleared'] ); 
     360            } elseif ( 'authorized' == $_GET['message'] ) { 
     361                if ( ! empty( $_GET['authorized'] ) ) 
     362                    $msg = sprintf( __( 'Successfully authorized @%s', $this->_slug ), $_GET['authorized'] ); 
     363                else 
     364                    $msg = __( 'There was a problem authorizing your account.', $this->_slug ); 
     365            } 
     366            echo "<div class='updated'><p>" . esc_html( $msg ) . '</p></div>'; 
     367        } 
     368 
     369        if ( empty( $this->_settings['twp']['consumer-key'] ) || empty( $this->_settings['twp']['consumer-secret'] ) ) { 
     370            $msg = sprintf( __( 'You need to <a href="%s">set up your Twitter app keys</a>.', $this->_slug ), $this->get_options_url() ); 
     371            echo '<div class="error"><p>' . $msg . '</p></div>'; 
     372        } 
     373 
     374        if ( empty( $this->_settings['twp-authed-users'] ) ) { 
     375            $msg = sprintf( __( 'You need to <a href="%s">authorize your Twitter accounts</a>.', $this->_slug ), $this->get_options_url() ); 
     376            echo '<div class="error"><p>' . $msg . '</p></div>'; 
    270377        } 
    271378    } 
    272379 
    273380    public function add_options_meta_boxes() { 
     381        add_meta_box( $this->_slug . '-oauth', __( 'Authenticated Twitter Accounts', $this->_slug ), array( $this, 'oauth_meta_box' ), 'range-' . $this->_slug, 'main' ); 
    274382        add_meta_box( $this->_slug . '-general-settings', __( 'General Settings', $this->_slug ), array( $this, 'general_settings_meta_box' ), 'range-' . $this->_slug, 'main' ); 
    275383        add_meta_box( $this->_slug . '-defaults', __( 'Default Settings for Shortcodes', $this->_slug ), array( $this, 'default_settings_meta_box' ), 'range-' . $this->_slug, 'main' ); 
    276384    } 
    277385 
     386    public function oauth_meta_box() { 
     387        $authorize_url = wp_nonce_url( add_query_arg( array( 'action' => 'authorize' ) ), 'authorize' ); 
     388 
     389        ?> 
     390        <table class="widefat"> 
     391            <thead> 
     392                <tr valign="top"> 
     393                    <th scope="row"> 
     394                        <?php _e( 'Username', $this->_slug );?> 
     395                    </th> 
     396                    <th scope="row"> 
     397                        <?php _e( 'Lists Rate Usage', $this->_slug );?> 
     398                    </th> 
     399                    <th scope="row"> 
     400                        <?php _e( 'Statuses Rate Usage', $this->_slug );?> 
     401                    </th> 
     402                </tr> 
     403            </thead> 
     404        <?php 
     405        foreach ( $this->_settings['twp-authed-users'] as $u ) { 
     406            $this->_wp_twitter_oauth->set_token( $u ); 
     407            $user_info = $this->_wp_twitter_oauth->send_authed_request( 'account/verify_credentials', 'GET' ); 
     408            $style = $auth_link = ''; 
     409            if ( is_wp_error( $user_info ) ) { 
     410                $query_args = array( 
     411                    'action' => 'authorize', 
     412                    'screen_name' => $u['screen_name'], 
     413                ); 
     414                $authorize_user_url = wp_nonce_url( add_query_arg( $query_args ), 'authorize' ); 
     415                $style = 'color:red;'; 
     416                $auth_link = ' - <a href="' . esc_url( $authorize_user_url ) . '">' . __( 'Reauthorize', $this->_slug ) . '</a>'; 
     417            } 
     418            ?> 
     419                <tr valign="top"> 
     420                    <th scope="row" style="<?php echo esc_attr( $style ); ?>"> 
     421                        <strong>@<?php echo esc_html( $u['screen_name'] ) . $auth_link; ?></strong> 
     422                    </th> 
     423                    <?php 
     424                    $rates = $this->_wp_twitter_oauth->send_authed_request( 'application/rate_limit_status', 'GET', array( 'resources' => 'statuses,lists' ) ); 
     425                    if ( ! is_wp_error( $rates ) ) { 
     426                        $display_rates = array( 
     427                            __( 'Lists', $this->_slug ) => $rates->resources->lists->{'/lists/statuses'}, 
     428                            __( 'Statuses', $this->_slug ) => $rates->resources->statuses->{'/statuses/user_timeline'}, 
     429                        ); 
     430                        foreach ( $display_rates as $title => $rate ) { 
     431                        ?> 
     432                        <td> 
     433                            <strong><?php echo esc_html( $title ); ?></strong> 
     434                            <p> 
     435                                <?php echo sprintf( __( 'Used: %d', $this->_slug ), $rate->limit - $rate->remaining ); ?><br /> 
     436                                <?php echo sprintf( __( 'Remaining: %d', $this->_slug ), $rate->remaining ); ?><br /> 
     437                                <?php 
     438                                $minutes = ceil( ( $rate->reset - gmdate( 'U' ) ) / 60 ); 
     439                                echo sprintf( _n( 'Limits reset in: %d minutes', 'Limits reset in: %d minutes', $minutes, $this->_slug ), $minutes ); 
     440                                ?><br /> 
     441                                <small><?php _e( 'This is overall usage, not just usage from Twitter Widget Pro', $this->_slug ); ?></small> 
     442                            </p> 
     443                        </td> 
     444                        <?php 
     445                        } 
     446                    } else { 
     447                        ?> 
     448                        <td> 
     449                            <p><?php _e( 'There was an error checking your rate limit.', $this->_slug ); ?></p> 
     450                        </td> 
     451                        <td> 
     452                            <p><?php _e( 'There was an error checking your rate limit.', $this->_slug ); ?></p> 
     453                        </td> 
     454                        <?php 
     455                    } 
     456                    ?> 
     457                </tr> 
     458                <?php 
     459            } 
     460        ?> 
     461        </table> 
     462        <?php 
     463        if ( empty( $this->_settings['twp']['consumer-key'] ) || empty( $this->_settings['twp']['consumer-secret'] ) ) { 
     464        ?> 
     465        <p> 
     466            <strong><?php _e( 'You need to fill in the Consumer key and Consumer secret before you can authorize accounts.', $this->_slug ) ?></strong> 
     467        </p> 
     468        <?php 
     469        } else { 
     470        ?> 
     471        <p> 
     472            <a href="<?php echo esc_url( $authorize_url );?>" class="button button-large button-primary"><?php _e( 'Authorize New Account', $this->_slug ); ?></a> 
     473        </p> 
     474        <?php 
     475        } 
     476    } 
    278477    public function general_settings_meta_box() { 
    279478        $clear_locks_url = wp_nonce_url( add_query_arg( array( 'action' => 'clear-locks' ) ), 'clear-locks' ); 
     
    282481                    <tr valign="top"> 
    283482                        <th scope="row"> 
    284                             <?php _e( "HTTP vs HTTPS", $this->_slug );?> 
     483                            <label for="twp_consumer_key"><?php _e( 'Consumer key', $this->_slug );?></label> 
    285484                        </th> 
    286485                        <td> 
    287                             <input class="checkbox" type="radio" value="https" id="twp_http_vs_https_https" name="twp[http_vs_https]"<?php checked( $this->_settings['twp']['http_vs_https'], 'https' ); ?> /> 
    288                             <label for="twp_http_vs_https_https"><?php _e( 'Use Twitter API via HTTPS', $this->_slug ); ?></label> 
    289                             <br /> 
    290                             <input class="checkbox" type="radio" value="http" id="twp_http_vs_https_http" name="twp[http_vs_https]"<?php checked( $this->_settings['twp']['http_vs_https'], 'http' ); ?> /> 
    291                             <label for="twp_http_vs_https_http"><?php _e( 'Use Twitter API via HTTP', $this->_slug ); ?></label> 
    292                             <br /> 
    293                             <small><?php _e( "Some servers seem to have issues connecting via HTTPS.  If you're experiencing issues with your feed not updating, try setting this to HTTP.", $this->_slug ); ?></small> 
     486                            <input id="twp_consumer_key" name="twp[consumer-key]" type="text" class="regular-text code" value="<?php esc_attr_e( $this->_settings['twp']['consumer-key'] ); ?>" size="40" /> 
    294487                        </td> 
    295488                    </tr> 
     489                    <tr valign="top"> 
     490                        <th scope="row"> 
     491                            <label for="twp_consumer_secret"><?php _e( 'Consumer secret', $this->_slug );?></label> 
     492                        </th> 
     493                        <td> 
     494                            <input id="twp_consumer_secret" name="twp[consumer-secret]" type="text" class="regular-text code" value="<?php esc_attr_e( $this->_settings['twp']['consumer-secret'] ); ?>" size="40" /> 
     495                        </td> 
     496                    </tr> 
     497                    <?php 
     498                    if ( empty( $this->_settings['twp']['consumer-key'] ) || empty( $this->_settings['twp']['consumer-secret'] ) ) { 
     499                    ?> 
     500                    <tr valign="top"> 
     501                        <th scope="row">&nbsp;</th> 
     502                        <td> 
     503                            <strong><?php _e( 'Directions to get the Consumer Key and Consumer Secret', $this->_slug ) ?></strong> 
     504                            <ol> 
     505                                <li><a href="https://dev.twitter.com/apps/new"><?php _e( 'Add a new Twitter application', $this->_slug ) ?></a></li> 
     506                                <li><?php _e( "Fill in Name, Description, Website, and Callback URL (don't leave any blank) with anything you want" ) ?></a></li> 
     507                                <li><?php _e( "Agree to rules, fill out captcha, and submit your application" ) ?></a></li> 
     508                                <li><?php _e( "Copy the Consumer key and Consumer secret into the fields above" ) ?></a></li> 
     509                                <li><?php _e( "Click the Update Options button at the bottom of this page" ) ?></a></li> 
     510                            </ol> 
     511                        </td> 
     512                    </tr> 
     513                    <?php 
     514                    } 
     515                    ?> 
    296516                    <tr> 
    297517                        <th scope="row"> 
     
    303523                        </td> 
    304524                    </tr> 
    305                     <tr> 
    306                         <th scope="row"> 
    307                             <?php _e( 'Current API Usage', $this->_slug );?> 
    308                         </th> 
    309                         <td> 
    310                             <?php 
    311                             $limit_url = $this->_api_url . "account/rate_limit_status.json"; 
    312                             $resp = wp_remote_request( $limit_url ); 
    313  
    314                             if ( !is_wp_error( $resp ) && $resp['response']['code'] >= 200 && $resp['response']['code'] < 300 ) { 
    315                                 $decodedResponse = json_decode( $resp['body'] ); 
    316                                 ?> 
    317                                 <p> 
    318                                     <?php echo sprintf( __( 'Used: %d', $this->_slug ), $decodedResponse->hourly_limit - $decodedResponse->remaining_hits ); ?><br /> 
    319                                     <?php echo sprintf( __( 'Remaining: %d', $this->_slug ), $decodedResponse->remaining_hits ); ?><br /> 
    320                                     <?php 
    321                                     $minutes = ceil( ( $decodedResponse->reset_time_in_seconds - gmdate( 'U' ) ) / 60 ); 
    322                                     echo sprintf( _n( 'Limits reset in: %d minutes', 'Limits reset in: %d minutes', $minutes, $this->_slug ), $minutes ); 
    323                                     ?><br /> 
    324                                     <small><?php _e( 'This is overall usage, not just usage from Twitter Widget Pro', $this->_slug ); ?></small> 
    325                                 </p> 
    326                                 <?php 
    327                             } else { 
    328                                 ?> 
    329                                 <p><?php _e( 'There was an error checking your rate limit.', $this->_slug ); ?></p> 
    330                                 <?php 
    331                             } 
    332                             ?> 
    333                         </td> 
    334                     </tr> 
    335525                </table> 
    336526        <?php 
    337527    } 
    338528    public function default_settings_meta_box() { 
     529        $users = $this->get_users_list( true ); 
     530        $lists = $this->get_lists(); 
    339531        ?> 
    340532                <p><?php _e( 'These settings are the default for the shortcodes and all of them can be overridden by specifying a different value in the shortcode itself.  All settings for widgets are locate in the individual widget.', $this->_slug ) ?></p> 
     
    345537                        </th> 
    346538                        <td> 
    347                             <input id="twp_username" name="twp[username]" type="text" class="regular-text code" value="<?php esc_attr_e( $this->_settings['twp']['username'] ); ?>" size="40" /> 
     539                            <select id="twp_username" name="twp[username]"> 
     540                                <option></option> 
     541                                <?php 
     542                                $selected = false; 
     543                                foreach ( $users as $u ) { 
     544                                    ?> 
     545                                    <option value="<?php echo esc_attr( strtolower( $u['screen_name'] ) ); ?>"<?php $s = selected( strtolower( $u['screen_name'] ), strtolower( $this->_settings['twp']['username'] ) ) ?>><?php echo esc_html( $u['screen_name'] ); ?></option> 
     546                                    <?php 
     547                                    if ( ! empty( $s ) ) 
     548                                        $selected = true; 
     549                                } 
     550                                ?> 
     551                            </select> 
     552                            <?php 
     553                            if ( ! $selected && ! empty( $this->_settings['twp']['username'] ) ) { 
     554                                $query_args = array( 
     555                                    'action' => 'authorize', 
     556                                    'screen_name' => $this->_settings['twp']['username'], 
     557                                ); 
     558                                $authorize_user_url = wp_nonce_url( add_query_arg( $query_args, $this->get_options_url() ), 'authorize' ); 
     559                                ?> 
     560                            <p> 
     561                                <a href="<?php echo esc_url( $authorize_user_url ); ?>" style="color:red;"> 
     562                                    <?php _e( 'You need to authorize this account.', $this->_slug ); ?> 
     563                                </a> 
     564                            </p> 
     565                                <?php 
     566                            } 
     567                            ?> 
     568                        </td> 
     569                    </tr> 
     570                    <tr valign="top"> 
     571                        <th scope="row"> 
     572                            <label for="twp_list"><?php _e( 'Twitter list:', $this->_slug ); ?></label> 
     573                        </th> 
     574                        <td> 
     575                            <select id="twp_list" name="twp[list]"> 
     576                                <option></option> 
     577                                <?php 
     578                                foreach ( $lists as $user => $user_lists ) { 
     579                                    echo '<optgroup label="' . esc_attr( $user ) . '">'; 
     580                                    foreach ( $user_lists as $list_id => $list_name ) { 
     581                                        ?> 
     582                                        <option value="<?php echo esc_attr( $user . '::' . $list_id ); ?>"<?php $s = selected( $user . '::' . $list_id, strtolower( $this->_settings['twp']['list'] ) ) ?>><?php echo esc_html( $list_name ); ?></option> 
     583                                        <?php 
     584                                    } 
     585                                    echo '</optgroup>'; 
     586                                } 
     587                                ?> 
     588                            </select> 
    348589                        </td> 
    349590                    </tr> 
     
    631872 
    632873        if ( empty( $args['title'] ) ) 
    633             $args['title'] = "Twitter: {$args['username']}"; 
     874            $args['title'] = sprintf( __( 'Twitter: %s', $this->_slug ), $args['username'] ); 
    634875 
    635876        $args['title'] = apply_filters( 'twitter-widget-title', $args['title'], $args ); 
     
    709950 
    710951        $widgetContent .= '</ul>'; 
    711         if ( 'true' == $args['showfollow'] ) { 
     952        if ( 'true' == $args['showfollow'] && ! empty( $args['username'] ) ) { 
    712953            $widgetContent .= '<div class="follow-button">'; 
    713954            $linkText = "@{$args['username']}"; 
     
    7791020     */ 
    7801021    private function _getTweets( $widgetOptions ) { 
    781         $key = 'twp_' . md5( $this->_getFeedUrl( $widgetOptions ) ); 
     1022        $key = 'twp_' . md5( maybe_serialize( $this->_get_feed_request_settings( $widgetOptions ) ) ); 
    7821023        return tlc_transient( $key ) 
    7831024            ->expires_in( 300 ) // cache for 5 minutes 
     1025            ->extend_on_fail( 120 ) // On a failed call, don't try again for 2 minutes 
    7841026            ->updates_with( array( $this, 'parseFeed' ), array( $widgetOptions ) ) 
    7851027            ->get(); 
     
    7931035     */ 
    7941036    public function parseFeed( $widgetOptions ) { 
    795         $feedUrl = $this->_getFeedUrl( $widgetOptions ); 
    796         $resp = wp_remote_request( $feedUrl, array( 'timeout' => $widgetOptions['fetchTimeOut'] ) ); 
    797  
    798         if ( !is_wp_error( $resp ) && $resp['response']['code'] >= 200 && $resp['response']['code'] < 300 ) { 
    799             $decodedResponse = json_decode( $resp['body'] ); 
    800             if ( empty( $decodedResponse ) || ! is_array( $decodedResponse ) ) { 
     1037        $parameters = $this->_get_feed_request_settings( $widgetOptions ); 
     1038        $response = array(); 
     1039 
     1040        if ( ! empty( $parameters['screen_name'] ) ) { 
     1041            if ( empty( $this->_settings['twp-authed-users'][strtolower( $parameters['screen_name'] )] ) ) { 
    8011042                if ( empty( $widgetOptions['errmsg'] ) ) 
    802                     $widgetOptions['errmsg'] = __( 'Invalid Twitter Response.', $this->_slug ); 
    803             } elseif( !empty( $decodedResponse->error ) ) { 
    804                 if ( empty( $widgetOptions['errmsg'] ) ) 
    805                     $widgetOptions['errmsg'] = $decodedResponse->error; 
     1043                    $widgetOptions['errmsg'] = __( 'Account needs to be authorized', $this->_slug ); 
    8061044            } else { 
    807                 return $decodedResponse; 
     1045                $this->_wp_twitter_oauth->set_token( $this->_settings['twp-authed-users'][strtolower( $parameters['screen_name'] )] ); 
     1046                $response = $this->_wp_twitter_oauth->send_authed_request( 'statuses/user_timeline', 'GET', $parameters ); 
     1047                if ( ! is_wp_error( $response ) ) 
     1048                    return $response; 
    8081049            } 
    809         } else { 
    810             // Failed to fetch url; 
    811             if ( empty( $widgetOptions['errmsg'] ) ) 
    812                 $widgetOptions['errmsg'] = __( 'Could not connect to Twitter', $this->_slug ); 
    813         } 
    814         do_action( 'widget_twitter_parsefeed_error', $resp, $feedUrl, $widgetOptions ); 
     1050        } elseif ( ! empty( $parameters['list_id'] ) ) { 
     1051            $user = array_shift( explode( '::', $widgetOptions['list'] ) ); 
     1052            $this->_wp_twitter_oauth->set_token( $this->_settings['twp-authed-users'][strtolower( $user )] ); 
     1053 
     1054            $response = $this->_wp_twitter_oauth->send_authed_request( 'statuses/user_timeline', 'GET', $parameters ); 
     1055            if ( ! is_wp_error( $response ) ) 
     1056                return $response; 
     1057        } 
     1058 
     1059        if ( empty( $widgetOptions['errmsg'] ) ) 
     1060            $widgetOptions['errmsg'] = __( 'Invalid Twitter Response.', $this->_slug ); 
     1061        do_action( 'widget_twitter_parsefeed_error', $response, $parameters, $widgetOptions ); 
    8151062        throw new Exception( $widgetOptions['errmsg'] ); 
    8161063    } 
    8171064 
    8181065    /** 
    819      * Gets the URL for the desired feed. 
     1066     * Gets the parameters for the desired feed. 
    8201067     * 
    8211068     * @param array $widgetOptions - settings needed such as username, feet type, etc 
    822      * @param string[optional] $type - 'rss' or 'json' 
    823      * @param bool[optional] $count - If true, it adds the count parameter to the URL 
    824      * @return string - Twitter feed URL 
     1069     * @return array - Parameters ready to pass to a Twitter request 
    8251070     */ 
    826     private function _getFeedUrl( $widgetOptions, $type = 'json', $count = true ) { 
    827         if ( !in_array( $type, array( 'rss', 'json' ) ) ) 
    828             $type = 'json'; 
    829  
    830         $req = $this->_api_url . "statuses/user_timeline.{$type}"; 
    831  
     1071    private function _get_feed_request_settings( $widgetOptions ) { 
    8321072        /** 
    8331073         * user_id 
     
    8441084         */ 
    8451085 
    846         $req = add_query_arg( array( 'screen_name' => $widgetOptions['username'] ), $req ); 
    847         if ( $count ) 
    848             $req = add_query_arg( array( 'count' => $widgetOptions['items'] ), $req ); 
     1086        $parameters = array( 
     1087            'count'       => $widgetOptions['items'], 
     1088        ); 
     1089 
     1090        if ( ! empty( $widgetOptions['username'] ) ) 
     1091            $parameters['screen_name'] = $widgetOptions['username']; 
     1092        elseif ( ! empty( $widgetOptions['list'] ) ) 
     1093            $parameters['list_id'] = array_pop( explode( '::', $widgetOptions['list'] ) ); 
    8491094 
    8501095        if ( 'true' == $widgetOptions['hidereplies'] ) 
    851             $req = add_query_arg( array( 'exclude_replies' => 'true' ), $req ); 
     1096            $parameters['exclude_replies'] = 'true'; 
    8521097 
    8531098        if ( 'true' == $widgetOptions['showretweets'] ) 
    854             $req = add_query_arg( array( 'include_rts' => 'true' ), $req ); 
    855  
    856         return $req; 
     1099            $parameters['include_rts'] = 'true'; 
     1100 
     1101        return $parameters; 
     1102 
    8571103    } 
    8581104 
     
    9161162            'title' => $user->name 
    9171163        ); 
    918         $img = $this->_api_url . 'users/profile_image'; 
    919         $img = add_query_arg( array( 'screen_name' => $user->screen_name ), $img ); 
    920         $img = add_query_arg( array( 'size' => $args['avatar'] ), $img ); 
     1164        $replace = ( 'original' == $args['avatar'] )? '':"_{$args['avatar']}."; 
     1165        $img = str_replace( '_normal.', $replace, $user->profile_image_url_https ); 
    9211166 
    9221167        return $this->_buildLink( "<img alt='{$user->name}' src='{$img}' />", $linkAttrs, true ); 
     
    10071252    } 
    10081253 
     1254    public function authed_users_option( $settings ) { 
     1255        if ( ! is_array( $settings ) ) 
     1256            return array(); 
     1257        return $settings; 
     1258    } 
     1259 
    10091260    public function filterSettings( $settings ) { 
    10101261        $defaultArgs = array( 
     1262            'consumer-key'    => '', 
     1263            'consumer-secret' => '', 
    10111264            'title'           => '', 
    10121265            'errmsg'          => '', 
    10131266            'fetchTimeOut'    => '2', 
    10141267            'username'        => '', 
     1268            'list'            => '', 
    10151269            'http_vs_https'   => 'https', 
    10161270            'hidereplies'     => 'false', 
     
    10461300        return $this->fixAvatar( wp_parse_args( $settings, $this->_settings['twp'] ) ); 
    10471301    } 
     1302 
     1303    public function get_users_list( $authed = false ) { 
     1304        $users = $this->_settings['twp-authed-users']; 
     1305        if ( $authed ) { 
     1306            if ( ! empty( $this->_authed_users ) ) 
     1307                return $this->_authed_users; 
     1308            foreach ( $users as $key => $u ) { 
     1309                $this->_wp_twitter_oauth->set_token( $u ); 
     1310                $rates = $this->_wp_twitter_oauth->send_authed_request( 'application/rate_limit_status', 'GET', array( 'resources' => 'statuses,lists' ) ); 
     1311                if ( is_wp_error( $rates ) ) 
     1312                    unset( $users[$key] ); 
     1313            } 
     1314            $this->_authed_users = $users; 
     1315        } 
     1316        return $users; 
     1317    } 
     1318 
     1319    public function get_lists() { 
     1320        if ( ! empty( $this->_lists ) ) 
     1321            return $this->_lists; 
     1322        $this->_lists =  array(); 
     1323        foreach ( $this->_settings['twp-authed-users'] as $key => $u ) { 
     1324            $this->_wp_twitter_oauth->set_token( $u ); 
     1325            $user_lists = $this->_wp_twitter_oauth->send_authed_request( 'lists/list', 'GET', array( 'resources' => 'statuses,lists' ) ); 
     1326 
     1327            if ( ! empty( $user_lists ) && ! is_wp_error( $user_lists ) ) { 
     1328                $this->_lists[$key] = array(); 
     1329                foreach ( $user_lists as $l ) { 
     1330                    $this->_lists[$key][$l->id] = $l->name; 
     1331                } 
     1332            } 
     1333        } 
     1334        return $this->_lists; 
     1335    } 
    10481336} 
    10491337// Instantiate our class 
Note: See TracChangeset for help on using the changeset viewer.