[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-admin/includes/ -> class-wp-theme-install-list-table.php (source)

   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   *
  15   * @see WP_Themes_List_Table
  16   */
  17  class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
  18  
  19      public $features = array();
  20  
  21      /**
  22       * @return bool
  23       */
  24  	public function ajax_user_can() {
  25          return current_user_can( 'install_themes' );
  26      }
  27  
  28      /**
  29       * @global array  $tabs
  30       * @global string $tab
  31       * @global int    $paged
  32       * @global string $type
  33       * @global array  $theme_field_defaults
  34       */
  35  	public function prepare_items() {
  36          require  ABSPATH . 'wp-admin/includes/theme-install.php';
  37  
  38          global $tabs, $tab, $paged, $type, $theme_field_defaults;
  39  
  40          $tab = ! empty( $_REQUEST['tab'] ) ? sanitize_text_field( $_REQUEST['tab'] ) : '';
  41  
  42          $search_terms  = array();
  43          $search_string = '';
  44          if ( ! empty( $_REQUEST['s'] ) ) {
  45              $search_string = strtolower( wp_unslash( $_REQUEST['s'] ) );
  46              $search_terms  = array_unique( array_filter( array_map( 'trim', explode( ',', $search_string ) ) ) );
  47          }
  48  
  49          if ( ! empty( $_REQUEST['features'] ) ) {
  50              $this->features = $_REQUEST['features'];
  51          }
  52  
  53          $paged = $this->get_pagenum();
  54  
  55          $per_page = 36;
  56  
  57          // These are the tabs which are shown on the page,
  58          $tabs              = array();
  59          $tabs['dashboard'] = __( 'Search' );
  60          if ( 'search' === $tab ) {
  61              $tabs['search'] = __( 'Search Results' );
  62          }
  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 string[] $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, true ) ) ) {
  86              $tab = key( $tabs );
  87          }
  88  
  89          $args = array(
  90              'page'     => $paged,
  91              'per_page' => $per_page,
  92              'fields'   => $theme_field_defaults,
  93          );
  94  
  95          switch ( $tab ) {
  96              case 'search':
  97                  $type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';
  98                  switch ( $type ) {
  99                      case 'tag':
 100                          $args['tag'] = array_map( 'sanitize_key', $search_terms );
 101                          break;
 102                      case 'term':
 103                          $args['search'] = $search_string;
 104                          break;
 105                      case 'author':
 106                          $args['author'] = $search_string;
 107                          break;
 108                  }
 109  
 110                  if ( ! empty( $this->features ) ) {
 111                      $args['tag']      = $this->features;
 112                      $_REQUEST['s']    = implode( ',', $this->features );
 113                      $_REQUEST['type'] = 'tag';
 114                  }
 115  
 116                  add_action( 'install_themes_table_header', 'install_theme_search_form', 10, 0 );
 117                  break;
 118  
 119              case 'featured':
 120                  // case 'popular':
 121              case 'new':
 122              case 'updated':
 123                  $args['browse'] = $tab;
 124                  break;
 125  
 126              default:
 127                  $args = false;
 128                  break;
 129          }
 130  
 131          /**
 132           * Filters API request arguments for each Install Themes screen tab.
 133           *
 134           * The dynamic portion of the hook name, `$tab`, refers to the theme install
 135           * tab.
 136           *
 137           * Possible hook names include:
 138           *
 139           *  - `install_themes_table_api_args_dashboard`
 140           *  - `install_themes_table_api_args_featured`
 141           *  - `install_themes_table_api_args_new`
 142           *  - `install_themes_table_api_args_search`
 143           *  - `install_themes_table_api_args_updated`
 144           *  - `install_themes_table_api_args_upload`
 145           *
 146           * @since 3.7.0
 147           *
 148           * @param array|false $args Theme install API arguments.
 149           */
 150          $args = apply_filters( "install_themes_table_api_args_{$tab}", $args );
 151  
 152          if ( ! $args ) {
 153              return;
 154          }
 155  
 156          $api = themes_api( 'query_themes', $args );
 157  
 158          if ( is_wp_error( $api ) ) {
 159              wp_die( '<p>' . $api->get_error_message() . '</p> <p><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try Again' ) . '</a></p>' );
 160          }
 161  
 162          $this->items = $api->themes;
 163  
 164          $this->set_pagination_args(
 165              array(
 166                  'total_items'     => $api->info['results'],
 167                  'per_page'        => $args['per_page'],
 168                  'infinite_scroll' => true,
 169              )
 170          );
 171      }
 172  
 173      /**
 174       */
 175  	public function no_items() {
 176          _e( 'No themes match your request.' );
 177      }
 178  
 179      /**
 180       * @global array $tabs
 181       * @global string $tab
 182       * @return array
 183       */
 184  	protected function get_views() {
 185          global $tabs, $tab;
 186  
 187          $display_tabs = array();
 188          foreach ( (array) $tabs as $action => $text ) {
 189              $display_tabs[ 'theme-install-' . $action ] = array(
 190                  'url'     => self_admin_url( 'theme-install.php?tab=' . $action ),
 191                  'label'   => $text,
 192                  'current' => $action === $tab,
 193              );
 194          }
 195  
 196          return $this->get_views_links( $display_tabs );
 197      }
 198  
 199      /**
 200       * Displays the theme install table.
 201       *
 202       * Overrides the parent display() method to provide a different container.
 203       *
 204       * @since 3.1.0
 205       */
 206  	public function display() {
 207          wp_nonce_field( 'fetch-list-' . get_class( $this ), '_ajax_fetch_list_nonce' );
 208          ?>
 209          <div class="tablenav top themes">
 210              <div class="alignleft actions">
 211                  <?php
 212                  /**
 213                   * Fires in the Install Themes list table header.
 214                   *
 215                   * @since 2.8.0
 216                   */
 217                  do_action( 'install_themes_table_header' );
 218                  ?>
 219              </div>
 220              <?php $this->pagination( 'top' ); ?>
 221              <br class="clear" />
 222          </div>
 223  
 224          <div id="availablethemes">
 225              <?php $this->display_rows_or_placeholder(); ?>
 226          </div>
 227  
 228          <?php
 229          $this->tablenav( 'bottom' );
 230      }
 231  
 232      /**
 233       * Generates the list table rows.
 234       *
 235       * @since 3.1.0
 236       */
 237  	public function display_rows() {
 238          $themes = $this->items;
 239          foreach ( $themes as $theme ) {
 240              ?>
 241                  <div class="available-theme installable-theme">
 242                  <?php
 243                      $this->single_row( $theme );
 244                  ?>
 245                  </div>
 246              <?php
 247          } // End foreach $theme_names.
 248  
 249          $this->theme_installer();
 250      }
 251  
 252      /**
 253       * Prints a theme from the WordPress.org API.
 254       *
 255       * @since 3.1.0
 256       *
 257       * @global array $themes_allowedtags
 258       *
 259       * @param stdClass $theme {
 260       *     An object that contains theme data returned by the WordPress.org API.
 261       *
 262       *     @type string $name           Theme name, e.g. 'Twenty Twenty-One'.
 263       *     @type string $slug           Theme slug, e.g. 'twentytwentyone'.
 264       *     @type string $version        Theme version, e.g. '1.1'.
 265       *     @type string $author         Theme author username, e.g. 'melchoyce'.
 266       *     @type string $preview_url    Preview URL, e.g. 'https://2021.wordpress.net/'.
 267       *     @type string $screenshot_url Screenshot URL, e.g. 'https://wordpress.org/themes/twentytwentyone/'.
 268       *     @type float  $rating         Rating score.
 269       *     @type int    $num_ratings    The number of ratings.
 270       *     @type string $homepage       Theme homepage, e.g. 'https://wordpress.org/themes/twentytwentyone/'.
 271       *     @type string $description    Theme description.
 272       *     @type string $download_link  Theme ZIP download URL.
 273       * }
 274       */
 275  	public function single_row( $theme ) {
 276          global $themes_allowedtags;
 277  
 278          if ( empty( $theme ) ) {
 279              return;
 280          }
 281  
 282          $name   = wp_kses( $theme->name, $themes_allowedtags );
 283          $author = wp_kses( $theme->author, $themes_allowedtags );
 284  
 285          /* translators: %s: Theme name. */
 286          $preview_title = sprintf( __( 'Preview &#8220;%s&#8221;' ), $name );
 287          $preview_url   = add_query_arg(
 288              array(
 289                  'tab'   => 'theme-information',
 290                  'theme' => $theme->slug,
 291              ),
 292              self_admin_url( 'theme-install.php' )
 293          );
 294  
 295          $actions = array();
 296  
 297          $install_url = add_query_arg(
 298              array(
 299                  'action' => 'install-theme',
 300                  'theme'  => $theme->slug,
 301              ),
 302              self_admin_url( 'update.php' )
 303          );
 304  
 305          $update_url = add_query_arg(
 306              array(
 307                  'action' => 'upgrade-theme',
 308                  'theme'  => $theme->slug,
 309              ),
 310              self_admin_url( 'update.php' )
 311          );
 312  
 313          $status = $this->_get_theme_status( $theme );
 314  
 315          switch ( $status ) {
 316              case 'update_available':
 317                  $actions[] = sprintf(
 318                      '<a class="install-now" href="%s" title="%s">%s</a>',
 319                      esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ),
 320                      /* translators: %s: Theme version. */
 321                      esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ),
 322                      __( 'Update' )
 323                  );
 324                  break;
 325              case 'newer_installed':
 326              case 'latest_installed':
 327                  $actions[] = sprintf(
 328                      '<span class="install-now" title="%s">%s</span>',
 329                      esc_attr__( 'This theme is already installed and is up to date' ),
 330                      _x( 'Installed', 'theme' )
 331                  );
 332                  break;
 333              case 'install':
 334              default:
 335                  $actions[] = sprintf(
 336                      '<a class="install-now" href="%s" title="%s">%s</a>',
 337                      esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ),
 338                      /* translators: %s: Theme name. */
 339                      esc_attr( sprintf( _x( 'Install %s', 'theme' ), $name ) ),
 340                      _x( 'Install Now', 'theme' )
 341                  );
 342                  break;
 343          }
 344  
 345          $actions[] = sprintf(
 346              '<a class="install-theme-preview" href="%s" title="%s">%s</a>',
 347              esc_url( $preview_url ),
 348              /* translators: %s: Theme name. */
 349              esc_attr( sprintf( __( 'Preview %s' ), $name ) ),
 350              __( 'Preview' )
 351          );
 352  
 353          /**
 354           * Filters the install action links for a theme in the Install Themes list table.
 355           *
 356           * @since 3.4.0
 357           *
 358           * @param string[] $actions An array of theme action links. Defaults are
 359           *                          links to Install Now, Preview, and Details.
 360           * @param stdClass $theme   An object that contains theme data returned by the
 361           *                          WordPress.org API.
 362           */
 363          $actions = apply_filters( 'theme_install_actions', $actions, $theme );
 364  
 365          ?>
 366          <a class="screenshot install-theme-preview" href="<?php echo esc_url( $preview_url ); ?>" title="<?php echo esc_attr( $preview_title ); ?>">
 367              <img src="<?php echo esc_url( $theme->screenshot_url . '?ver=' . $theme->version ); ?>" width="150" alt="" />
 368          </a>
 369  
 370          <h3><?php echo $name; ?></h3>
 371          <div class="theme-author">
 372          <?php
 373              /* translators: %s: Theme author. */
 374              printf( __( 'By %s' ), $author );
 375          ?>
 376          </div>
 377  
 378          <div class="action-links">
 379              <ul>
 380                  <?php foreach ( $actions as $action ) : ?>
 381                      <li><?php echo $action; ?></li>
 382                  <?php endforeach; ?>
 383                  <li class="hide-if-no-js"><a href="#" class="theme-detail"><?php _e( 'Details' ); ?></a></li>
 384              </ul>
 385          </div>
 386  
 387          <?php
 388          $this->install_theme_info( $theme );
 389      }
 390  
 391      /**
 392       * Prints the wrapper for the theme installer.
 393       */
 394  	public function theme_installer() {
 395          ?>
 396          <div id="theme-installer" class="wp-full-overlay expanded">
 397              <div class="wp-full-overlay-sidebar">
 398                  <div class="wp-full-overlay-header">
 399                      <a href="#" class="close-full-overlay button"><?php _e( 'Close' ); ?></a>
 400                      <span class="theme-install"></span>
 401                  </div>
 402                  <div class="wp-full-overlay-sidebar-content">
 403                      <div class="install-theme-info"></div>
 404                  </div>
 405                  <div class="wp-full-overlay-footer">
 406                      <button type="button" class="collapse-sidebar button" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
 407                          <span class="collapse-sidebar-arrow"></span>
 408                          <span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
 409                      </button>
 410                  </div>
 411              </div>
 412              <div class="wp-full-overlay-main"></div>
 413          </div>
 414          <?php
 415      }
 416  
 417      /**
 418       * Prints the wrapper for the theme installer with a provided theme's data.
 419       * Used to make the theme installer work for no-js.
 420       *
 421       * @param stdClass $theme A WordPress.org Theme API object.
 422       */
 423  	public function theme_installer_single( $theme ) {
 424          ?>
 425          <div id="theme-installer" class="wp-full-overlay single-theme">
 426              <div class="wp-full-overlay-sidebar">
 427                  <?php $this->install_theme_info( $theme ); ?>
 428              </div>
 429              <div class="wp-full-overlay-main">
 430                  <iframe src="<?php echo esc_url( $theme->preview_url ); ?>"></iframe>
 431              </div>
 432          </div>
 433          <?php
 434      }
 435  
 436      /**
 437       * Prints the info for a theme (to be used in the theme installer modal).
 438       *
 439       * @global array $themes_allowedtags
 440       *
 441       * @param stdClass $theme A WordPress.org Theme API object.
 442       */
 443  	public function install_theme_info( $theme ) {
 444          global $themes_allowedtags;
 445  
 446          if ( empty( $theme ) ) {
 447              return;
 448          }
 449  
 450          $name   = wp_kses( $theme->name, $themes_allowedtags );
 451          $author = wp_kses( $theme->author, $themes_allowedtags );
 452  
 453          $install_url = add_query_arg(
 454              array(
 455                  'action' => 'install-theme',
 456                  'theme'  => $theme->slug,
 457              ),
 458              self_admin_url( 'update.php' )
 459          );
 460  
 461          $update_url = add_query_arg(
 462              array(
 463                  'action' => 'upgrade-theme',
 464                  'theme'  => $theme->slug,
 465              ),
 466              self_admin_url( 'update.php' )
 467          );
 468  
 469          $status = $this->_get_theme_status( $theme );
 470  
 471          ?>
 472          <div class="install-theme-info">
 473          <?php
 474          switch ( $status ) {
 475              case 'update_available':
 476                  printf(
 477                      '<a class="theme-install button button-primary" href="%s" title="%s">%s</a>',
 478                      esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ),
 479                      /* translators: %s: Theme version. */
 480                      esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ),
 481                      __( 'Update' )
 482                  );
 483                  break;
 484              case 'newer_installed':
 485              case 'latest_installed':
 486                  printf(
 487                      '<span class="theme-install" title="%s">%s</span>',
 488                      esc_attr__( 'This theme is already installed and is up to date' ),
 489                      _x( 'Installed', 'theme' )
 490                  );
 491                  break;
 492              case 'install':
 493              default:
 494                  printf(
 495                      '<a class="theme-install button button-primary" href="%s">%s</a>',
 496                      esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ),
 497                      __( 'Install' )
 498                  );
 499                  break;
 500          }
 501          ?>
 502              <h3 class="theme-name"><?php echo $name; ?></h3>
 503              <span class="theme-by">
 504              <?php
 505                  /* translators: %s: Theme author. */
 506                  printf( __( 'By %s' ), $author );
 507              ?>
 508              </span>
 509              <?php if ( isset( $theme->screenshot_url ) ) : ?>
 510                  <img class="theme-screenshot" src="<?php echo esc_url( $theme->screenshot_url . '?ver=' . $theme->version ); ?>" alt="" />
 511              <?php endif; ?>
 512              <div class="theme-details">
 513                  <?php
 514                  wp_star_rating(
 515                      array(
 516                          'rating' => $theme->rating,
 517                          'type'   => 'percent',
 518                          'number' => $theme->num_ratings,
 519                      )
 520                  );
 521                  ?>
 522                  <div class="theme-version">
 523                      <strong><?php _e( 'Version:' ); ?> </strong>
 524                      <?php echo wp_kses( $theme->version, $themes_allowedtags ); ?>
 525                  </div>
 526                  <div class="theme-description">
 527                      <?php echo wp_kses( $theme->description, $themes_allowedtags ); ?>
 528                  </div>
 529              </div>
 530              <input class="theme-preview-url" type="hidden" value="<?php echo esc_url( $theme->preview_url ); ?>" />
 531          </div>
 532          <?php
 533      }
 534  
 535      /**
 536       * Send required variables to JavaScript land
 537       *
 538       * @since 3.4.0
 539       *
 540       * @global string $tab  Current tab within Themes->Install screen
 541       * @global string $type Type of search.
 542       *
 543       * @param array $extra_args Unused.
 544       */
 545  	public function _js_vars( $extra_args = array() ) {
 546          global $tab, $type;
 547          parent::_js_vars( compact( 'tab', 'type' ) );
 548      }
 549  
 550      /**
 551       * Checks to see if the theme is already installed.
 552       *
 553       * @since 3.4.0
 554       *
 555       * @param stdClass $theme A WordPress.org Theme API object.
 556       * @return string Theme status.
 557       */
 558  	private function _get_theme_status( $theme ) {
 559          $status = 'install';
 560  
 561          $installed_theme = wp_get_theme( $theme->slug );
 562          if ( $installed_theme->exists() ) {
 563              if ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '=' ) ) {
 564                  $status = 'latest_installed';
 565              } elseif ( version_compare( $installed_theme->get( 'Version' ), $theme->version, '>' ) ) {
 566                  $status = 'newer_installed';
 567              } else {
 568                  $status = 'update_available';
 569              }
 570          }
 571  
 572          return $status;
 573      }
 574  }


Generated : Sat Oct 5 08:20:01 2024 Cross-referenced by PHPXref