home *** CD-ROM | disk | FTP | other *** search
/ HTML Examples / WP.iso / wordpress / wp-admin / includes / class-wp-theme-install-list-table.php < prev    next >
Encoding:
PHP Script  |  2017-10-02  |  14.2 KB  |  470 lines

  1. <?php
  2. /**
  3.  * List Table API: WP_Theme_Install_List_Table class
  4.  *
  5.  * @package WordPress
  6.  * @subpackage Administration
  7.  * @since 3.1.0
  8.  */
  9.  
  10. /**
  11.  * Core class used to implement displaying themes to install in a list table.
  12.  *
  13.  * @since 3.1.0
  14.  * @access private
  15.  *
  16.  * @see WP_Themes_List_Table
  17.  */
  18. class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
  19.  
  20.     public $features = array();
  21.  
  22.     /**
  23.      *
  24.      * @return bool
  25.      */
  26.     public function ajax_user_can() {
  27.         return current_user_can( 'install_themes' );
  28.     }
  29.  
  30.     /**
  31.      *
  32.      * @global array  $tabs
  33.      * @global string $tab
  34.      * @global int    $paged
  35.      * @global string $type
  36.      * @global array  $theme_field_defaults
  37.      */
  38.     public function prepare_items() {
  39.         include( ABSPATH . 'wp-admin/includes/theme-install.php' );
  40.  
  41.         global $tabs, $tab, $paged, $type, $theme_field_defaults;
  42.         wp_reset_vars( array( 'tab' ) );
  43.  
  44.         $search_terms = array();
  45.         $search_string = '';
  46.         if ( ! empty( $_REQUEST['s'] ) ){
  47.             $search_string = strtolower( wp_unslash( $_REQUEST['s'] ) );
  48.             $search_terms = array_unique( array_filter( array_map( 'trim', explode( ',', $search_string ) ) ) );
  49.         }
  50.  
  51.         if ( ! empty( $_REQUEST['features'] ) )
  52.             $this->features = $_REQUEST['features'];
  53.  
  54.         $paged = $this->get_pagenum();
  55.  
  56.         $per_page = 36;
  57.  
  58.         // These are the tabs which are shown on the page,
  59.         $tabs = array();
  60.         $tabs['dashboard'] = __( 'Search' );
  61.         if ( 'search' === $tab )
  62.             $tabs['search']    = __( 'Search Results' );
  63.         $tabs['upload'] = __( 'Upload' );
  64.         $tabs['featured'] = _x( 'Featured', 'themes' );
  65.         //$tabs['popular']  = _x( 'Popular', 'themes' );
  66.         $tabs['new']      = _x( 'Latest', 'themes' );
  67.         $tabs['updated']  = _x( 'Recently Updated', 'themes' );
  68.  
  69.         $nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.
  70.  
  71.         /** This filter is documented in wp-admin/theme-install.php */
  72.         $tabs = apply_filters( 'install_themes_tabs', $tabs );
  73.  
  74.         /**
  75.          * Filters tabs not associated with a menu item on the Install Themes screen.
  76.          *
  77.          * @since 2.8.0
  78.          *
  79.          * @param array $nonmenu_tabs The tabs that don't have a menu item on
  80.          *                            the Install Themes screen.
  81.          */
  82.         $nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );
  83.  
  84.         // If a non-valid menu tab has been selected, And it's not a non-menu action.
  85.         if ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )
  86.             $tab = key( $tabs );
  87.  
  88.         $args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );
  89.  
  90.         switch ( $tab ) {
  91.             case 'search':
  92.                 $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
  93.                 switch ( $type ) {
  94.                     case 'tag':
  95.                         $args['tag'] = array_map( 'sanitize_key', $search_terms );
  96.                         break;
  97.                     case 'term':
  98.                         $args['search'] = $search_string;
  99.                         break;
  100.                     case 'author':
  101.                         $args['author'] = $search_string;
  102.                         break;
  103.                 }
  104.  
  105.                 if ( ! empty( $this->features ) ) {
  106.                     $args['tag'] = $this->features;
  107.                     $_REQUEST['s'] = implode( ',', $this->features );
  108.                     $_REQUEST['type'] = 'tag';
  109.                 }
  110.  
  111.                 add_action( 'install_themes_table_header', 'install_theme_search_form', 10, 0 );
  112.                 break;
  113.  
  114.             case 'featured':
  115.             // case 'popular':
  116.             case 'new':
  117.             case 'updated':
  118.                 $args['browse'] = $tab;
  119.                 break;
  120.  
  121.             default:
  122.                 $args = false;
  123.                 break;
  124.         }
  125.  
  126.         /**
  127.          * Filters API request arguments for each Install Themes screen tab.
  128.          *
  129.          * The dynamic portion of the hook name, `$tab`, refers to the theme install
  130.          * tabs. Default tabs are 'dashboard', 'search', 'upload', 'featured',
  131.          * 'new', and 'updated'.
  132.          *
  133.          * @since 3.7.0
  134.          *
  135.          * @param array $args An array of themes API arguments.
  136.          */
  137.         $args = apply_filters( "install_themes_table_api_args_{$tab}", $args );
  138.  
  139.         if ( ! $args )
  140.             return;
  141.  
  142.         $api = themes_api( 'query_themes', $args );
  143.  
  144.         if ( is_wp_error( $api ) )
  145.             wp_die( $api->get_error_message() . '</p> <p><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );
  146.  
  147.         $this->items = $api->themes;
  148.  
  149.         $this->set_pagination_args( array(
  150.             'total_items' => $api->info['results'],
  151.             'per_page' => $args['per_page'],
  152.             'infinite_scroll' => true,
  153.         ) );
  154.     }
  155.  
  156.     /**
  157.      */
  158.     public function no_items() {
  159.         _e( 'No themes match your request.' );
  160.     }
  161.  
  162.     /**
  163.      *
  164.      * @global array $tabs
  165.      * @global string $tab
  166.      * @return array
  167.      */
  168.     protected function get_views() {
  169.         global $tabs, $tab;
  170.  
  171.         $display_tabs = array();
  172.         foreach ( (array) $tabs as $action => $text ) {
  173.             $current_link_attributes = ( $action === $tab ) ? ' class="current" aria-current="page"' : '';
  174.             $href = self_admin_url('theme-install.php?tab=' . $action);
  175.             $display_tabs['theme-install-'.$action] = "<a href='$href'$current_link_attributes>$text</a>";
  176.         }
  177.  
  178.         return $display_tabs;
  179.     }
  180.  
  181.     /**
  182.      */
  183.     public function display() {
  184.         wp_nonce_field( "fetch-list-" . get_class( $this ), '_ajax_fetch_list_nonce' );
  185. ?>
  186.         <div class="tablenav top themes">
  187.             <div class="alignleft actions">
  188.                 <?php
  189.                 /**
  190.                  * Fires in the Install Themes list table header.
  191.                  *
  192.                  * @since 2.8.0
  193.                  */
  194.                 do_action( 'install_themes_table_header' );
  195.                 ?>
  196.             </div>
  197.             <?php $this->pagination( 'top' ); ?>
  198.             <br class="clear" />
  199.         </div>
  200.  
  201.         <div id="availablethemes">
  202.             <?php $this->display_rows_or_placeholder(); ?>
  203.         </div>
  204.  
  205.         <?php
  206.         $this->tablenav( 'bottom' );
  207.     }
  208.  
  209.     /**
  210.      */
  211.     public function display_rows() {
  212.         $themes = $this->items;
  213.         foreach ( $themes as $theme ) {
  214.                 ?>
  215.                 <div class="available-theme installable-theme"><?php
  216.                     $this->single_row( $theme );
  217.                 ?></div>
  218.         <?php } // end foreach $theme_names
  219.  
  220.         $this->theme_installer();
  221.     }
  222.  
  223.     /**
  224.      * Prints a theme from the WordPress.org API.
  225.      *
  226.      * @since 3.1.0
  227.      *
  228.      * @global array $themes_allowedtags
  229.      *
  230.      * @param object $theme {
  231.      *     An object that contains theme data returned by the WordPress.org API.
  232.      *
  233.      *     @type string $name           Theme name, e.g. 'Twenty Seventeen'.
  234.      *     @type string $slug           Theme slug, e.g. 'twentyseventeen'.
  235.      *     @type string $version        Theme version, e.g. '1.1'.
  236.      *     @type string $author         Theme author username, e.g. 'melchoyce'.
  237.      *     @type string $preview_url    Preview URL, e.g. 'http://2017.wordpress.net/'.
  238.      *     @type string $screenshot_url Screenshot URL, e.g. 'https://wordpress.org/themes/twentyseventeen/'.
  239.      *     @type float  $rating         Rating score.
  240.      *     @type int    $num_ratings    The number of ratings.
  241.      *     @type string $homepage       Theme homepage, e.g. 'https://wordpress.org/themes/twentyseventeen/'.
  242.      *     @type string $description    Theme description.
  243.      *     @type string $download_link  Theme ZIP download URL.
  244.      * }
  245.      */
  246.     public function single_row( $theme ) {
  247.         global $themes_allowedtags;
  248.  
  249.         if ( empty( $theme ) )
  250.             return;
  251.  
  252.         $name   = wp_kses( $theme->name,   $themes_allowedtags );
  253.         $author = wp_kses( $theme->author, $themes_allowedtags );
  254.  
  255.         $preview_title = sprintf( __('Preview “%s”'), $name );
  256.         $preview_url   = add_query_arg( array(
  257.             'tab'   => 'theme-information',
  258.             'theme' => $theme->slug,
  259.         ), self_admin_url( 'theme-install.php' ) );
  260.  
  261.         $actions = array();
  262.  
  263.         $install_url = add_query_arg( array(
  264.             'action' => 'install-theme',
  265.             'theme'  => $theme->slug,
  266.         ), self_admin_url( 'update.php' ) );
  267.  
  268.         $update_url = add_query_arg( array(
  269.             'action' => 'upgrade-theme',
  270.             'theme'  => $theme->slug,
  271.         ), self_admin_url( 'update.php' ) );
  272.  
  273.         $status = $this->_get_theme_status( $theme );
  274.  
  275.         switch ( $status ) {
  276.             case 'update_available':
  277.                 $actions[] = '<a class="install-now" href="' . esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ) . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ) . '">' . __( 'Update' ) . '</a>';
  278.                 break;
  279.             case 'newer_installed':
  280.             case 'latest_installed':
  281.                 $actions[] = '<span class="install-now" title="' . esc_attr__( 'This theme is already installed and is up to date' ) . '">' . _x( 'Installed', 'theme' ) . '</span>';
  282.                 break;
  283.             case 'install':
  284.             default:
  285.                 $actions[] = '<a class="install-now" href="' . esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ) . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';
  286.                 break;
  287.         }
  288.  
  289.         $actions[] = '<a class="install-theme-preview" href="' . esc_url( $preview_url ) . '" title="' . esc_attr( sprintf( __( 'Preview %s' ), $name ) ) . '">' . __( 'Preview' ) . '</a>';
  290.  
  291.         /**
  292.          * Filters the install action links for a theme in the Install Themes list table.
  293.          *
  294.          * @since 3.4.0
  295.          *
  296.          * @param array    $actions An array of theme action hyperlinks. Defaults are
  297.          *                          links to Install Now, Preview, and Details.
  298.          * @param WP_Theme $theme   Theme object.
  299.          */
  300.         $actions = apply_filters( 'theme_install_actions', $actions, $theme );
  301.  
  302.         ?>
  303.         <a class="screenshot install-theme-preview" href="<?php echo esc_url( $preview_url ); ?>" title="<?php echo esc_attr( $preview_title ); ?>">
  304.             <img src="<?php echo esc_url( $theme->screenshot_url ); ?>" width="150" alt="" />
  305.         </a>
  306.  
  307.         <h3><?php echo $name; ?></h3>
  308.         <div class="theme-author"><?php printf( __( 'By %s' ), $author ); ?></div>
  309.  
  310.         <div class="action-links">
  311.             <ul>
  312.                 <?php foreach ( $actions as $action ): ?>
  313.                     <li><?php echo $action; ?></li>
  314.                 <?php endforeach; ?>
  315.                 <li class="hide-if-no-js"><a href="#" class="theme-detail"><?php _e('Details') ?></a></li>
  316.             </ul>
  317.         </div>
  318.  
  319.         <?php
  320.         $this->install_theme_info( $theme );
  321.     }
  322.  
  323.     /**
  324.      * Prints the wrapper for the theme installer.
  325.      */
  326.     public function theme_installer() {
  327.         ?>
  328.         <div id="theme-installer" class="wp-full-overlay expanded">
  329.             <div class="wp-full-overlay-sidebar">
  330.                 <div class="wp-full-overlay-header">
  331.                     <a href="#" class="close-full-overlay button"><?php _e( 'Close' ); ?></a>
  332.                     <span class="theme-install"></span>
  333.                 </div>
  334.                 <div class="wp-full-overlay-sidebar-content">
  335.                     <div class="install-theme-info"></div>
  336.                 </div>
  337.                 <div class="wp-full-overlay-footer">
  338.                     <button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
  339.                         <span class="collapse-sidebar-arrow"></span>
  340.                         <span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
  341.                     </button>
  342.                 </div>
  343.             </div>
  344.             <div class="wp-full-overlay-main"></div>
  345.         </div>
  346.         <?php
  347.     }
  348.  
  349.     /**
  350.      * Prints the wrapper for the theme installer with a provided theme's data.
  351.      * Used to make the theme installer work for no-js.
  352.      *
  353.      * @param object $theme - A WordPress.org Theme API object.
  354.      */
  355.     public function theme_installer_single( $theme ) {
  356.         ?>
  357.         <div id="theme-installer" class="wp-full-overlay single-theme">
  358.             <div class="wp-full-overlay-sidebar">
  359.                 <?php $this->install_theme_info( $theme ); ?>
  360.             </div>
  361.             <div class="wp-full-overlay-main">
  362.                 <iframe src="<?php echo esc_url( $theme->preview_url ); ?>"></iframe>
  363.             </div>
  364.         </div>
  365.         <?php
  366.     }
  367.  
  368.     /**
  369.      * Prints the info for a theme (to be used in the theme installer modal).
  370.      *
  371.      * @global array $themes_allowedtags
  372.      *
  373.      * @param object $theme - A WordPress.org Theme API object.
  374.      */
  375.     public function install_theme_info( $theme ) {
  376.         global $themes_allowedtags;
  377.  
  378.         if ( empty( $theme ) )
  379.             return;
  380.  
  381.         $name   = wp_kses( $theme->name,   $themes_allowedtags );
  382.         $author = wp_kses( $theme->author, $themes_allowedtags );
  383.  
  384.         $install_url = add_query_arg( array(
  385.             'action' => 'install-theme',
  386.             'theme'  => $theme->slug,
  387.         ), self_admin_url( 'update.php' ) );
  388.  
  389.         $update_url = add_query_arg( array(
  390.             'action' => 'upgrade-theme',
  391.             'theme'  => $theme->slug,
  392.         ), self_admin_url( 'update.php' ) );
  393.  
  394.         $status = $this->_get_theme_status( $theme );
  395.  
  396.         ?>
  397.         <div class="install-theme-info"><?php
  398.             switch ( $status ) {
  399.                 case 'update_available':
  400.                     echo '<a class="theme-install button button-primary" href="' . esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ) . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ) . '">' . __( 'Update' ) . '</a>';
  401.                     break;
  402.                 case 'newer_installed':
  403.                 case 'latest_installed':
  404.                     echo '<span class="theme-install" title="' . esc_attr__( 'This theme is already installed and is up to date' ) . '">' . _x( 'Installed', 'theme' ) . '</span>';
  405.                     break;
  406.                 case 'install':
  407.                 default:
  408.                     echo '<a class="theme-install button button-primary" href="' . esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ) . '">' . __( 'Install' ) . '</a>';
  409.                     break;
  410.             } ?>
  411.             <h3 class="theme-name"><?php echo $name; ?></h3>
  412.             <span class="theme-by"><?php printf( __( 'By %s' ), $author ); ?></span>
  413.             <?php if ( isset( $theme->screenshot_url ) ): ?>
  414.                 <img class="theme-screenshot" src="<?php echo esc_url( $theme->screenshot_url ); ?>" alt="" />
  415.             <?php endif; ?>
  416.             <div class="theme-details">
  417.                 <?php wp_star_rating( array( 'rating' => $theme->rating, 'type' => 'percent', 'number' => $theme->num_ratings ) ); ?>
  418.                 <div class="theme-version">
  419.                     <strong><?php _e('Version:') ?> </strong>
  420.                     <?php echo wp_kses( $theme->version, $themes_allowedtags ); ?>
  421.                 </div>
  422.                 <div class="theme-description">
  423.                     <?php echo wp_kses( $theme->description, $themes_allowedtags ); ?>
  424.                 </div>
  425.             </div>
  426.             <input class="theme-preview-url" type="hidden" value="<?php echo esc_url( $theme->preview_url ); ?>" />
  427.         </div>
  428.         <?php
  429.     }
  430.  
  431.     /**
  432.      * Send required variables to JavaScript land
  433.      *
  434.      * @since 3.4.0
  435.      *
  436.      * @global string $tab  Current tab within Themes->Install screen
  437.      * @global string $type Type of search.
  438.      *
  439.      * @param array $extra_args Unused.
  440.      */
  441.     public function _js_vars( $extra_args = array() ) {
  442.         global $tab, $type;
  443.         parent::_js_vars( compact( 'tab', 'type' ) );
  444.     }
  445.  
  446.     /**
  447.      * Check to see if the theme is already installed.
  448.      *
  449.      * @since 3.4.0
  450.      *
  451.      * @param object $theme - A WordPress.org Theme API object.
  452.      * @return string Theme status.
  453.      */
  454.     private function _get_theme_status( $theme ) {
  455.         $status = 'install';
  456.  
  457.         $installed_theme = wp_get_theme( $theme->slug );
  458.         if ( $installed_theme->exists() ) {
  459.             if ( version_compare( $installed_theme->get('Version'), $theme->version, '=' ) )
  460.                 $status = 'latest_installed';
  461.             elseif ( version_compare( $installed_theme->get('Version'), $theme->version, '>' ) )
  462.                 $status = 'newer_installed';
  463.             else
  464.                 $status = 'update_available';
  465.         }
  466.  
  467.         return $status;
  468.     }
  469. }
  470.