WordPress.org

Plugin Directory

Changeset 604205


Ignore:
Timestamp:
09/26/12 15:29:43 (19 months ago)
Author:
japh
Message:

Release to utilise the new Favourites API from Otto42

Location:
favorite-plugins/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • favorite-plugins/trunk/favorite-plugins.php

    r604157 r604205  
    44Plugin URI: http://japh.wordpress.com/plugins/favorite-plugins 
    55Description: Quickly and easily access and install your favorited plugins from WordPress.org, right from your dashboard. 
    6 Version: 0.4 
     6Version: 0.5 
    77Author: Japh 
    88Author URI: http://japh.wordpress.com 
     
    3636 * @copyright 2012 Japh 
    3737 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt GPL2 
    38  * @version 0.4 
     38 * @version 0.5 
    3939 * @link http://japh.wordpress.com/plugins/favorite-plugins 
    4040 * @since 0.1 
     
    6262 * @copyright 2012 Japh 
    6363 * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt GPL2 
    64  * @version 0.4 
     64 * @version 0.5 
    6565 * @since 0.1 
    6666 */ 
    6767class Japh_Favorite_Plugins { 
    6868 
    69     public $version = '0.4'; 
     69    public $version = '0.5'; 
    7070    public $username = null; 
    71     public $favorite_plugins = null; 
    72  
    73     private $plugin_expiry = 60; // Expiry of transient storing plugin results in minutes 
    74     private $html_expiry = 15; // Expiry of the transient storing HTML output in minutes 
    7571 
    7672    /** 
     
    8985        add_action( 'init', array( &$this, 'textdomain' ) ); 
    9086        add_filter( 'install_plugins_tabs', array( &$this, 'add_favorites_tab' ) ); 
    91         add_action( 'install_plugins_favorites', array( &$this, 'do_favorites_tab' ) ); 
     87 
     88        add_action( 'install_plugins_pre_favorites', array( &$this, 'do_favorites_tab' ) ); 
     89        add_action( 'install_plugins_favorites', array( &$this, 'install_plugins_favorites' ), 10, 1 ); 
     90        add_action( 'install_plugins_favorites', 'display_plugins_table'); 
    9291 
    9392        $this->username = get_option( 'jfp_favorite_user' ); 
    94         $this->favorite_plugins = get_transient( 'jfp_favourite_plugins' ); 
    9593 
    9694    } 
     
    120118    /** 
    121119     * Add a Favorites tab to the install plugins tabs 
     120     * 
     121     * This method also checks if there is already a Favorites tab, 
     122     * which is potentially coming to WordPress core in 3.5 
    122123     * 
    123124     * @since 0.1 
     
    135136     * Output contents of the Favorites tab 
    136137     * 
     138     * Props @Otto42 : http://core.trac.wordpress.org/ticket/22002 
     139     * Any code here from Otto is used with permission. 
     140     * 
    137141     * @since 0.1 
    138142     * @param array $paged The current page for the tab 
    139143     * @return void 
    140144     */ 
    141     function do_favorites_tab( $paged ) { 
    142  
    143         if ( ! empty( $_GET['username'] ) && $_GET['username'] != $this->username ) { 
    144  
    145             if ( wp_verify_nonce( $_GET['nonce'], 'favorite-plugins-nonce' ) ) { 
    146  
    147                 update_option( 'jfp_favorite_user', $_GET['username'] ); 
    148                 $this->username = $_GET['username']; 
    149                 $this->favorite_plugins = $this->get_favorites(); 
    150                 set_transient( 'jfp_favorite_plugins', $this->favorite_plugins, 60 * $this->plugin_expiry ); 
    151  
    152             } 
    153  
    154         } elseif ( empty( $this->favorite_plugins ) && ! empty( $this->username ) ) { 
    155  
    156             $this->favorite_plugins = $this->get_favorites(); 
    157             set_transient( 'jfp_favorite_plugins', $this->favorite_plugins, 60 * $this->plugin_expiry ); 
    158  
    159         } 
    160  
    161         /* Let's store the HTML in a transient for an hour */ 
    162  
    163         $html = get_transient( 'jfp_favourite_plugins_html_' . $this->username ); 
    164  
    165         if ( false === $html ) { 
    166  
    167             $html = ''; 
    168  
    169             $plugins = unserialize( $this->favorite_plugins ); 
    170             $plugins_count = count( $plugins ); 
    171  
    172             $html = $this->favorites_table_header( $plugins_count ); 
    173  
    174             $html .= $this->display_favorites_table( $plugins ); 
    175  
    176             $html .= $this->favorites_table_footer( $plugins_count ); 
    177  
    178             set_transient( 'jfp_favourite_plugins_html_' . $this->username, $html, 60 * $this->html_expiry ); 
    179  
    180         } 
    181  
    182         echo $html; 
    183  
    184     } 
    185  
    186     /** 
    187      * Get favorites 
    188      * 
    189      * We'll try and get the favourites from the database, if they're not there, 
    190      * we'll hit WordPress.org and grab them. 
    191      * 
    192      * @since 0.1 
    193      * @return string Serialized string of favorite plugins. FALSE if no plugins. 
    194      */ 
    195     function get_favorites() { 
    196  
    197         $favorite_plugins = $this->fetch_favorites(); 
    198  
    199         if ( ! empty( $favorite_plugins ) ) { 
    200             return serialize( $favorite_plugins ); 
    201         } else { 
    202             return false; 
    203         } 
    204  
    205     } 
    206  
    207     /** 
    208      * Fetch favorites from WordPress.org 
    209      * 
    210      * Grab favorites from the user's profile page on WordPress.org. Parse the 
    211      * HTML of the page to find the favorites and put them into an array. 
    212      * 
    213      * @since 0.1 
    214      * @return string Serialized string of favorite plugins 
    215      */ 
    216     function fetch_favorites() { 
    217         return false; 
    218     } 
    219  
    220     /** 
    221      * Return the table header for the favorite plugins table display 
    222      * 
    223      * @since 0.1 
    224      * @param int $plugins_count Number of plugins to be displayed 
    225      * @return string HTML table header for output 
    226      */ 
    227     function favorites_table_header( $plugins_count ) { 
    228  
    229         $html = ''; 
    230  
    231         // Header 
    232         $html .= '<div class="tablenav top">' . "\n"; 
    233  
    234         $html .= '  <div class="alignleft actions">' . "\n"; 
    235         $html .= '      <form id="favorite-plugins" method="get" action="">' . "\n"; 
    236         $html .= '          <input type="hidden" name="tab" value="favorites">' . "\n"; 
    237         $html .= '          <input type="search" name="username" value="' . ( ! empty( $this->username ) ? $this->username : '' ) . '">' . "\n"; 
    238         $html .= '          <label class="screen-reader-text" for="plugin-favorite-input">' . __( 'Favorite Plugins', 'jfp' ) . '</label>' . "\n"; 
    239         $html .= '          <input type="submit" name="plugin-favorite-input" id="plugin-favorite-input" class="button" value="' . __( 'Get Favorites' , 'jfp' ) . '">' . "\n"; 
    240         $html .= '          <input type="hidden" name="nonce" value="' . wp_create_nonce( 'favorite-plugins-nonce' ) . '">'; 
    241         $html .= '      </form>' . "\n"; 
    242         $html .= '  </div>' . "\n"; 
    243  
    244         $html .= '  <div class="tablenav-pages one-page">' . "\n"; 
    245         $html .= '      <span class="displaying-num">' . sprintf( _n( '%d item', '%d items', $plugins_count ), $plugins_count ) . '</span>' . "\n"; 
    246         $html .= '  </div>' . "\n"; 
    247         $html .= '  <br class="clear">' . "\n"; 
    248         $html .= '</div>' . "\n"; 
    249  
    250         $html .= '<table class="wp-list-table widefat plugin-install" cellspacing="0">' . "\n"; 
    251  
    252         // Table head 
    253         $html .= '  <thead>' . "\n"; 
    254         $html .= '      <tr>' . "\n"; 
    255         $html .= '          <th scope="col" id="name" class="manage-column column-name" style="">' . __( 'Name' ) . '</th>' . "\n"; 
    256         $html .= '          <th scope="col" id="version" class="manage-column column-version" style="">' . __( 'Version' ) . '</th>' . "\n"; 
    257         $html .= '          <th scope="col" id="rating" class="manage-column column-rating" style="">' . __( 'Rating' ) . '</th>' . "\n"; 
    258         $html .= '          <th scope="col" id="description" class="manage-column column-description" style="">' . __( 'Description' ) . '</th>' . "\n"; 
    259         $html .= '      </tr>' . "\n"; 
    260         $html .= '  </thead>' . "\n"; 
    261  
    262         // Table foot 
    263         $html .= '  <tfoot>' . "\n"; 
    264         $html .= '      <tr>' . "\n"; 
    265         $html .= '          <th scope="col" id="name" class="manage-column column-name" style="">' . __( 'Name' ) . '</th>' . "\n"; 
    266         $html .= '          <th scope="col" id="version" class="manage-column column-version" style="">' . __( 'Version' ) . '</th>' . "\n"; 
    267         $html .= '          <th scope="col" id="rating" class="manage-column column-rating" style="">' . __( 'Rating' ) . '</th>' . "\n"; 
    268         $html .= '          <th scope="col" id="description" class="manage-column column-description" style="">' . __( 'Description' ) . '</th>' . "\n"; 
    269         $html .= '      </tr>' . "\n"; 
    270         $html .= '  </tfoot>' . "\n"; 
    271  
    272         return $html; 
    273  
    274     } 
    275  
    276     /** 
    277      * Return the table footer for the favorite plugins table display 
    278      * 
    279      * @since 0.1 
    280      * @param int $plugins_count Number of plugins to be displayed 
    281      * @return string HTML table footer for output 
    282      */ 
    283     function favorites_table_footer( $plugins_count ) { 
    284  
    285         $html = ''; 
    286  
    287         // Table footer 
    288         $html .= '<div class="tablenav bottom">' . "\n"; 
    289         $html .= '  <div class="tablenav-pages one-page">' . "\n"; 
    290         $html .= '      <span class="displaying-num">' . sprintf( _n( '%d item', '%d items', $plugins_count ), $plugins_count ) . '</span>' . "\n"; 
    291         $html .= '  </div>' . "\n"; 
    292         $html .= '  <br class="clear">' . "\n"; 
    293         $html .= '</div>' . "\n"; 
    294  
    295         return $html; 
    296  
    297     } 
    298  
    299     /** 
    300      * Return a table with the favorite plugins for display 
    301      * 
    302      * @since 0.1 
    303      * @param array $favorite_plugins User's favorite plugins serialized 
    304      * @return string HTML table output of plugin list 
    305      */ 
    306     function display_favorites_table( $plugins ) { 
    307  
    308         $html = ''; 
    309  
    310         $html .= '  <tbody id="the-list">' . "\n"; 
    311  
    312         if ( ! empty( $plugins ) ) { 
    313  
    314             // Table rows 
    315             foreach ( $plugins as $plugin ) { 
    316  
    317                 $plugin = $this->get_plugin_info( $plugin ); 
    318  
    319                 $status = install_plugin_install_status( $plugin ); 
    320  
    321                 $plugins_allowedtags = array( 
    322                     'a' => array( 'href' => array(),'title' => array(), 'target' => array() ), 
    323                     'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ), 
    324                     'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(), 
    325                     'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array() 
    326                 ); 
    327  
    328                 $title = wp_kses( $plugin->name, $plugins_allowedtags ); 
    329                 //Limit description to 400char, and remove any HTML. 
    330                 $description = strip_tags( $plugin->sections['description'] ); 
    331                 if ( strlen( $description ) > 400 ) 
    332                     $description = mb_substr( $description, 0, 400 ) . '&#8230;'; 
    333                 //remove any trailing entities 
    334                 $description = preg_replace( '/&[^;\s]{0,6}$/', '', $description ); 
    335                 //strip leading/trailing & multiple consecutive lines 
    336                 $description = trim( $description ); 
    337                 $description = preg_replace( "|(\r?\n)+|", "\n", $description ); 
    338                 //\n => <br> 
    339                 $description = nl2br( $description ); 
    340                 $version = wp_kses( $plugin->version, $plugins_allowedtags ); 
    341  
    342                 $name = strip_tags( $title . ' ' . $version ); 
    343  
    344                 $author = $plugin->author; 
    345                 if ( ! empty( $plugin->author ) ) 
    346                     $author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '.</cite>'; 
    347  
    348                 $author = wp_kses( $author, $plugins_allowedtags ); 
    349  
    350                 $action_links = array(); 
    351                 $action_links[] = '<a href="' . self_admin_url( 'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin->slug . 
    352                                     '&amp;TB_iframe=true&amp;width=600&amp;height=550' ) . '" class="thickbox" title="' . 
    353                                     esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '">' . __( 'Details' ) . '</a>'; 
    354  
    355                 if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) { 
    356                     $status = install_plugin_install_status( $plugin ); 
    357  
    358                     switch ( $status['status'] ) { 
    359                         case 'install': 
    360                             if ( $status['url'] ) 
    361                                 $action_links[] = '<a class="install-now" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>'; 
    362                             break; 
    363                         case 'update_available': 
    364                             if ( $status['url'] ) 
    365                                 $action_links[] = '<a href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . sprintf( __( 'Update Now' ), $status['version'] ) . '</a>'; 
    366                             break; 
    367                         case 'latest_installed': 
    368                         case 'newer_installed': 
    369                             $action_links[] = '<span title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . _x( 'Installed', 'plugin' ) . '</span>'; 
    370                             break; 
    371                     } 
    372                 } 
    373  
    374                 $action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin ); 
    375  
    376                 $html .= '      <tr>' . "\n"; 
    377  
    378                 $html .= '          <td class="name column-name"><strong>' . $title . '</strong>'; 
    379                 $html .= '              <div class="action-links">' . ( !empty( $action_links ) ? implode( ' | ', $action_links ) : '' ) . '</div>'; 
    380                 $html .= '          </td>'; 
    381                 $html .= '          <td class="vers column-version">' . $version . '</td>'; 
    382                 $html .= '          <td class="vers column-rating">'; 
    383                 $html .= '              <div class="star-holder" title="' . sprintf( _n( '(based on %s rating)', '(based on %s ratings)', $plugin->num_ratings ), number_format_i18n( $plugin->num_ratings ) ) . '">'; 
    384                 $html .= '              <div class="star star-rating" style="width: ' . esc_attr( str_replace( ',', '.', $plugin->rating ) ) . 'px"></div>'; 
    385                 $html .= '              </div>'; 
    386                 $html .= '          </td>'; 
    387                 $html .= '          <td class="desc column-description">' . $description . $author . '</td>'; 
    388  
    389                 $html .= '      </tr>' . "\n"; 
    390             } 
    391         } else { 
    392                 $html .= '      <tr class="no-items">' . "\n"; 
    393                 $html .= '          <td class="colspanchange" colspan="4">' . __( 'No favorite plugins found.', 'jfp' ) . '</td>' . "\n"; 
    394                 $html .= '      </tr>' . "\n"; 
    395         } 
    396  
    397         $html .= '  </tbody>' . "\n"; 
    398         $html .= '</table>' . "\n"; 
    399  
    400         return $html; 
    401  
    402     } 
    403  
    404     /** 
    405      * Gather info for a specific plugin from WordPress.org's API 
    406      * 
    407      * @since 0.1 
    408      * @param array $plugin An array representing a specific plugin 
    409      * @return object An object representing a plugin and its info 
    410      */ 
    411     function get_plugin_info( $plugin ) { 
    412  
    413         $plugin = (object) $plugin; 
    414  
    415         $res = null; 
    416  
    417         $request = wp_remote_post( 'http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => 15, 'body' => array( 'action' => 'plugin_information', 'request' => serialize( $plugin ) ) ) ); 
    418         if ( is_wp_error( $request ) ) { 
    419             $res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="http://wordpress.org/support/">support forums</a>.' ), $request->get_error_message() ); 
    420         } else { 
    421             $res = maybe_unserialize( wp_remote_retrieve_body( $request ) ); 
    422             if ( ! is_object( $res ) && ! is_array( $res ) ) 
    423                 $res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="http://wordpress.org/support/">support forums</a>.' ), wp_remote_retrieve_body( $request ) ); 
    424         } 
    425  
    426         return $res; 
    427  
     145    function do_favorites_tab() { 
     146        global $wp_list_table; 
     147 
     148        $this->username = isset( $_REQUEST['user'] ) ? stripslashes( $_REQUEST['user'] ) : $this->username; 
     149        update_option( 'jfp_favorite_user', $this->username ); 
     150 
     151        $args = array( 'user' => $this->username ); 
     152        $api = plugins_api( 'query_plugins', $args ); 
     153 
     154        $wp_list_table->items = $api->plugins; 
     155        $wp_list_table->set_pagination_args( 
     156            array( 
     157                'total_items' => $api->info['results'], 
     158                'per_page' => 10, 
     159            ) 
     160        ); 
     161    } 
     162 
     163    /** 
     164     * Output username form at the top of the favorite plugins table 
     165     * 
     166     * Props @Otto42 : http://core.trac.wordpress.org/ticket/22002 
     167     * Any code here from Otto is used with permission. 
     168     * 
     169     * @since 0.5 
     170     * @param int $page Current pagination number 
     171     * @return void 
     172     */ 
     173    function install_plugins_favorites( $page = 1 ) { 
     174        $this->username = isset( $_REQUEST['user'] ) ? stripslashes( $_REQUEST['user'] ) : $this->username; 
     175        ?> 
     176            <h4><?php _e( 'Find Favorite Plugins for a WordPress.org username:' ); ?></h4> 
     177            <form method="post" enctype="multipart/form-data" action="<?php echo self_admin_url( 'plugin-install.php?tab=favorites' ); ?>"> 
     178                <label class="screen-reader-text" for="user"><?php _e( 'WordPress.org username' ); ?></label> 
     179                <input type="search" id="user" name="user" value="<?php echo esc_attr( $this->username ); ?>" /> 
     180                <input type="submit" class="button" value="<?php esc_attr_e( 'Find Favorites' ); ?>" /> 
     181            </form> 
     182        <?php 
    428183    } 
    429184 
  • favorite-plugins/trunk/readme.txt

    r604157 r604205  
    44Requires at least: 3.4 
    55Tested up to: 3.4.2 
    6 Stable tag: 0.4 
     6Stable tag: 0.5 
    77License: GPLv2 or later 
    88License URI: http://www.gnu.org/licenses/gpl-2.0.html 
     
    4444== Changelog == 
    4545 
     46= 0.5 = 
     47* Switched to utilise the new Favourites API. Props @Otto42. 
     48 
    4649= 0.4 = 
    4750* Removed the HTML parsing library and all scraping code from the plugin 
Note: See TracChangeset for help on using the changeset viewer.