/**
  * Handles the description column output.
  *
  * @since 4.3.0
  * @access public
  *
  * @global string $status
  * @global array  $totals
  *
  * @param WP_Theme $theme The current WP_Theme object.
  */
 public function column_description($theme)
 {
     global $status, $totals;
     if ($theme->errors()) {
         $pre = $status == 'broken' ? __('Broken Theme:') . ' ' : '';
         echo '<p><strong class="error-message">' . $pre . $theme->errors()->get_error_message() . '</strong></p>';
     }
     if ($this->is_site_themes) {
         $allowed = $theme->is_allowed('site', $this->site_id);
     } else {
         $allowed = $theme->is_allowed('network');
     }
     $class = !$allowed ? 'inactive' : 'active';
     if (!empty($totals['upgrade']) && !empty($theme->update)) {
         $class .= ' update';
     }
     echo "<div class='theme-description'><p>" . $theme->display('Description') . "</p></div>\n\t\t\t<div class='{$class} second theme-version-author-uri'>";
     $stylesheet = $theme->get_stylesheet();
     $theme_meta = array();
     if ($theme->get('Version')) {
         $theme_meta[] = sprintf(__('Version %s'), $theme->display('Version'));
     }
     $theme_meta[] = sprintf(__('By %s'), $theme->display('Author'));
     if ($theme->get('ThemeURI')) {
         $theme_meta[] = '<a href="' . $theme->display('ThemeURI') . '" title="' . esc_attr__('Visit theme homepage') . '">' . __('Visit Theme Site') . '</a>';
     }
     /**
      * Filter the array of row meta for each theme in the Multisite themes
      * list table.
      *
      * @since 3.1.0
      *
      * @param array    $theme_meta An array of the theme's metadata,
      *                             including the version, author, and
      *                             theme URI.
      * @param string   $stylesheet Directory name of the theme.
      * @param WP_Theme $theme      WP_Theme object.
      * @param string   $status     Status of the theme.
      */
     $theme_meta = apply_filters('theme_row_meta', $theme_meta, $stylesheet, $theme, $status);
     echo implode(' | ', $theme_meta);
     echo '</div>';
 }
 /**
  * @global string $status
  * @global int $page
  * @global string $s
  * @global array $totals
  * @param WP_Theme $theme
  */
 public function single_row($theme)
 {
     global $status, $page, $s, $totals;
     $context = $status;
     if ($this->is_site_themes) {
         $url = "site-themes.php?id={$this->site_id}&amp;";
         $allowed = $theme->is_allowed('site', $this->site_id);
     } else {
         $url = 'themes.php?';
         $allowed = $theme->is_allowed('network');
     }
     // Pre-order.
     $actions = array('enable' => '', 'disable' => '', 'edit' => '', 'delete' => '');
     $stylesheet = $theme->get_stylesheet();
     $theme_key = urlencode($stylesheet);
     if (!$allowed) {
         if (!$theme->errors()) {
             $actions['enable'] = '<a href="' . esc_url(wp_nonce_url($url . 'action=enable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'enable-theme_' . $stylesheet)) . '" title="' . esc_attr__('Enable this theme') . '" class="edit">' . ($this->is_site_themes ? __('Enable') : __('Network Enable')) . '</a>';
         }
     } else {
         $actions['disable'] = '<a href="' . esc_url(wp_nonce_url($url . 'action=disable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'disable-theme_' . $stylesheet)) . '" title="' . esc_attr__('Disable this theme') . '">' . ($this->is_site_themes ? __('Disable') : __('Network Disable')) . '</a>';
     }
     if (current_user_can('edit_themes')) {
         $actions['edit'] = '<a href="' . esc_url('theme-editor.php?theme=' . $theme_key) . '" title="' . esc_attr__('Open this theme in the Theme Editor') . '" class="edit">' . __('Edit') . '</a>';
     }
     if (!$allowed && current_user_can('delete_themes') && !$this->is_site_themes && $stylesheet != get_option('stylesheet') && $stylesheet != get_option('template')) {
         $actions['delete'] = '<a href="' . esc_url(wp_nonce_url('themes.php?action=delete-selected&amp;checked[]=' . $theme_key . '&amp;theme_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-themes')) . '" title="' . esc_attr__('Delete this theme') . '" class="delete">' . __('Delete') . '</a>';
     }
     /**
      * Filter the action links displayed for each theme in the Multisite
      * themes list table.
      *
      * The action links displayed are determined by the theme's status, and
      * which Multisite themes list table is being displayed - the Network
      * themes list table (themes.php), which displays all installed themes,
      * or the Site themes list table (site-themes.php), which displays the
      * non-network enabled themes when editing a site in the Network admin.
      *
      * The default action links for the Network themes list table include
      * 'Network Enable', 'Network Disable', 'Edit', and 'Delete'.
      *
      * The default action links for the Site themes list table include
      * 'Enable', 'Disable', and 'Edit'.
      *
      * @since 2.8.0
      *
      * @param array    $actions An array of action links.
      * @param WP_Theme $theme   The current WP_Theme object.
      * @param string   $context Status of the theme.
      */
     $actions = apply_filters('theme_action_links', array_filter($actions), $theme, $context);
     /**
      * Filter the action links of a specific theme in the Multisite themes
      * list table.
      *
      * The dynamic portion of the hook name, `$stylesheet`, refers to the
      * directory name of the theme, which in most cases is synonymous
      * with the template name.
      *
      * @since 3.1.0
      *
      * @param array    $actions An array of action links.
      * @param WP_Theme $theme   The current WP_Theme object.
      * @param string   $context Status of the theme.
      */
     $actions = apply_filters("theme_action_links_{$stylesheet}", $actions, $theme, $context);
     $class = !$allowed ? 'inactive' : 'active';
     $checkbox_id = "checkbox_" . md5($theme->get('Name'));
     $checkbox = "<input type='checkbox' name='checked[]' value='" . esc_attr($stylesheet) . "' id='" . $checkbox_id . "' /><label class='screen-reader-text' for='" . $checkbox_id . "' >" . __('Select') . " " . $theme->display('Name') . "</label>";
     $id = sanitize_html_class($theme->get_stylesheet());
     if (!empty($totals['upgrade']) && !empty($theme->update)) {
         $class .= ' update';
     }
     echo "<tr id='{$id}' class='{$class}'>";
     list($columns, $hidden) = $this->get_column_info();
     foreach ($columns as $column_name => $column_display_name) {
         $style = '';
         if (in_array($column_name, $hidden)) {
             $style = ' style="display:none;"';
         }
         switch ($column_name) {
             case 'cb':
                 echo "<th scope='row' class='check-column'>{$checkbox}</th>";
                 break;
             case 'name':
                 echo "<td class='theme-title'{$style}><strong>" . $theme->display('Name') . "</strong>";
                 echo $this->row_actions($actions, true);
                 echo "</td>";
                 break;
             case 'description':
                 echo "<td class='column-description desc'{$style}>";
                 if ($theme->errors()) {
                     $pre = $status == 'broken' ? __('Broken Theme:') . ' ' : '';
                     echo '<p><strong class="attention">' . $pre . $theme->errors()->get_error_message() . '</strong></p>';
                 }
                 echo "<div class='theme-description'><p>" . $theme->display('Description') . "</p></div>\r\n\t\t\t\t\t\t<div class='{$class} second theme-version-author-uri'>";
                 $theme_meta = array();
                 if ($theme->get('Version')) {
                     $theme_meta[] = sprintf(__('Version %s'), $theme->display('Version'));
                 }
                 $theme_meta[] = sprintf(__('By %s'), $theme->display('Author'));
                 if ($theme->get('ThemeURI')) {
                     $theme_meta[] = '<a href="' . $theme->display('ThemeURI') . '" title="' . esc_attr__('Visit theme homepage') . '">' . __('Visit Theme Site') . '</a>';
                 }
                 /**
                  * Filter the array of row meta for each theme in the Multisite themes
                  * list table.
                  *
                  * @since 3.1.0
                  *
                  * @param array    $theme_meta An array of the theme's metadata,
                  *                             including the version, author, and
                  *                             theme URI.
                  * @param string   $stylesheet Directory name of the theme.
                  * @param WP_Theme $theme      WP_Theme object.
                  * @param string   $status     Status of the theme.
                  */
                 $theme_meta = apply_filters('theme_row_meta', $theme_meta, $stylesheet, $theme, $status);
                 echo implode(' | ', $theme_meta);
                 echo "</div></td>";
                 break;
             default:
                 echo "<td class='{$column_name} column-{$column_name}'{$style}>";
                 /**
                  * Fires inside each custom column of the Multisite themes list table.
                  *
                  * @since 3.1.0
                  *
                  * @param string   $column_name Name of the column.
                  * @param string   $stylesheet  Directory name of the theme.
                  * @param WP_Theme $theme       Current WP_Theme object.
                  */
                 do_action('manage_themes_custom_column', $column_name, $stylesheet, $theme);
                 echo "</td>";
         }
     }
     echo "</tr>";
     if ($this->is_site_themes) {
         remove_action("after_theme_row_{$stylesheet}", 'wp_theme_update_row');
     }
     /**
      * Fires after each row in the Multisite themes list table.
      *
      * @since 3.1.0
      *
      * @param string   $stylesheet Directory name of the theme.
      * @param WP_Theme $theme      Current WP_Theme object.
      * @param string   $status     Status of the theme.
      */
     do_action('after_theme_row', $stylesheet, $theme, $status);
     /**
      * Fires after each specific row in the Multisite themes list table.
      *
      * The dynamic portion of the hook name, `$stylesheet`, refers to the
      * directory name of the theme, most often synonymous with the template
      * name of the theme.
      *
      * @since 3.5.0
      *
      * @param string   $stylesheet Directory name of the theme.
      * @param WP_Theme $theme      Current WP_Theme object.
      * @param string   $status     Status of the theme.
      */
     do_action("after_theme_row_{$stylesheet}", $stylesheet, $theme, $status);
 }