[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-admin/ -> upload.php (source)

   1  <?php
   2  /**
   3   * Media Library administration panel.
   4   *
   5   * @package WordPress
   6   * @subpackage Administration
   7   */
   8  
   9  /** WordPress Administration Bootstrap */
  10  require_once  __DIR__ . '/admin.php';
  11  
  12  if ( ! current_user_can( 'upload_files' ) ) {
  13      wp_die( __( 'Sorry, you are not allowed to upload files.' ) );
  14  }
  15  
  16  $message = '';
  17  if ( ! empty( $_GET['posted'] ) ) {
  18      $message = __( 'Media file updated.' );
  19  
  20      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'posted' ), $_SERVER['REQUEST_URI'] );
  21      unset( $_GET['posted'] );
  22  }
  23  
  24  if ( ! empty( $_GET['attached'] ) && absint( $_GET['attached'] ) ) {
  25      $attached = absint( $_GET['attached'] );
  26  
  27      if ( 1 === $attached ) {
  28          $message = __( 'Media file attached.' );
  29      } else {
  30          $message = sprintf(
  31              /* translators: %s: Number of media files. */
  32              _n( '%s media file attached.', '%s media files attached.', $attached ),
  33              number_format_i18n( $attached )
  34          );
  35      }
  36  
  37      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );
  38      unset( $_GET['detach'], $_GET['attached'] );
  39  }
  40  
  41  if ( ! empty( $_GET['detach'] ) && absint( $_GET['detach'] ) ) {
  42      $detached = absint( $_GET['detach'] );
  43  
  44      if ( 1 === $detached ) {
  45          $message = __( 'Media file detached.' );
  46      } else {
  47          $message = sprintf(
  48              /* translators: %s: Number of media files. */
  49              _n( '%s media file detached.', '%s media files detached.', $detached ),
  50              number_format_i18n( $detached )
  51          );
  52      }
  53  
  54      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );
  55      unset( $_GET['detach'], $_GET['attached'] );
  56  }
  57  
  58  if ( ! empty( $_GET['deleted'] ) && absint( $_GET['deleted'] ) ) {
  59      $deleted = absint( $_GET['deleted'] );
  60  
  61      if ( 1 === $deleted ) {
  62          $message = __( 'Media file permanently deleted.' );
  63      } else {
  64          $message = sprintf(
  65              /* translators: %s: Number of media files. */
  66              _n( '%s media file permanently deleted.', '%s media files permanently deleted.', $deleted ),
  67              number_format_i18n( $deleted )
  68          );
  69      }
  70  
  71      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'deleted' ), $_SERVER['REQUEST_URI'] );
  72      unset( $_GET['deleted'] );
  73  }
  74  
  75  if ( ! empty( $_GET['trashed'] ) && absint( $_GET['trashed'] ) ) {
  76      $trashed = absint( $_GET['trashed'] );
  77  
  78      if ( 1 === $trashed ) {
  79          $message = __( 'Media file moved to the Trash.' );
  80      } else {
  81          $message = sprintf(
  82              /* translators: %s: Number of media files. */
  83              _n( '%s media file moved to the Trash.', '%s media files moved to the Trash.', $trashed ),
  84              number_format_i18n( $trashed )
  85          );
  86      }
  87  
  88      $message .= sprintf(
  89          ' <a href="%1$s">%2$s</a>',
  90          esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids=' . ( isset( $_GET['ids'] ) ? $_GET['ids'] : '' ), 'bulk-media' ) ),
  91          __( 'Undo' )
  92      );
  93  
  94      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'trashed' ), $_SERVER['REQUEST_URI'] );
  95      unset( $_GET['trashed'] );
  96  }
  97  
  98  if ( ! empty( $_GET['untrashed'] ) && absint( $_GET['untrashed'] ) ) {
  99      $untrashed = absint( $_GET['untrashed'] );
 100  
 101      if ( 1 === $untrashed ) {
 102          $message = __( 'Media file restored from the Trash.' );
 103      } else {
 104          $message = sprintf(
 105              /* translators: %s: Number of media files. */
 106              _n( '%s media file restored from the Trash.', '%s media files restored from the Trash.', $untrashed ),
 107              number_format_i18n( $untrashed )
 108          );
 109      }
 110  
 111      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'untrashed' ), $_SERVER['REQUEST_URI'] );
 112      unset( $_GET['untrashed'] );
 113  }
 114  
 115  $messages[1] = __( 'Media file updated.' );
 116  $messages[2] = __( 'Media file permanently deleted.' );
 117  $messages[3] = __( 'Error saving media file.' );
 118  $messages[4] = __( 'Media file moved to the Trash.' ) . sprintf(
 119      ' <a href="%1$s">%2$s</a>',
 120      esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids=' . ( isset( $_GET['ids'] ) ? $_GET['ids'] : '' ), 'bulk-media' ) ),
 121      __( 'Undo' )
 122  );
 123  $messages[5] = __( 'Media file restored from the Trash.' );
 124  
 125  if ( ! empty( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) {
 126      $message = $messages[ $_GET['message'] ];
 127  
 128      $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message' ), $_SERVER['REQUEST_URI'] );
 129  }
 130  
 131  $modes = array( 'grid', 'list' );
 132  
 133  if ( isset( $_GET['mode'] ) && in_array( $_GET['mode'], $modes, true ) ) {
 134      $mode = $_GET['mode'];
 135      update_user_option( get_current_user_id(), 'media_library_mode', $mode );
 136  } else {
 137      $mode = get_user_option( 'media_library_mode', get_current_user_id() ) ? get_user_option( 'media_library_mode', get_current_user_id() ) : 'grid';
 138  }
 139  
 140  if ( 'grid' === $mode ) {
 141      wp_enqueue_media();
 142      wp_enqueue_script( 'media-grid' );
 143      wp_enqueue_script( 'media' );
 144  
 145      // Remove the error parameter added by deprecation of wp-admin/media.php.
 146      add_filter(
 147          'removable_query_args',
 148          function () {
 149              return array( 'error' );
 150          },
 151          10,
 152          0
 153      );
 154  
 155      $q = $_GET;
 156      // Let JS handle this.
 157      unset( $q['s'] );
 158      $vars   = wp_edit_attachments_query_vars( $q );
 159      $ignore = array( 'mode', 'post_type', 'post_status', 'posts_per_page' );
 160      foreach ( $vars as $key => $value ) {
 161          if ( ! $value || in_array( $key, $ignore, true ) ) {
 162              unset( $vars[ $key ] );
 163          }
 164      }
 165  
 166      wp_localize_script(
 167          'media-grid',
 168          '_wpMediaGridSettings',
 169          array(
 170              'adminUrl'  => parse_url( self_admin_url(), PHP_URL_PATH ),
 171              'queryVars' => (object) $vars,
 172          )
 173      );
 174  
 175      get_current_screen()->add_help_tab(
 176          array(
 177              'id'      => 'overview',
 178              'title'   => __( 'Overview' ),
 179              'content' =>
 180                  '<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first.' ) . '</p>' .
 181                  '<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>' .
 182                  '<p>' . __( 'To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media.' ) . '</p>',
 183          )
 184      );
 185  
 186      get_current_screen()->add_help_tab(
 187          array(
 188              'id'      => 'attachment-details',
 189              'title'   => __( 'Attachment Details' ),
 190              'content' =>
 191                  '<p>' . __( 'Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved.' ) . '</p>' .
 192                  '<p>' . __( 'Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly.' ) . '</p>' .
 193                  '<p>' . __( 'You can also delete individual items and access the extended edit screen from the details dialog.' ) . '</p>',
 194          )
 195      );
 196  
 197      get_current_screen()->set_help_sidebar(
 198          '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
 199          '<p>' . __( '<a href="https://wordpress.org/documentation/article/media-library-screen/">Documentation on Media Library</a>' ) . '</p>' .
 200          '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
 201      );
 202  
 203      // Used in the HTML title tag.
 204      $title       = __( 'Media Library' );
 205      $parent_file = 'upload.php';
 206  
 207      require_once  ABSPATH . 'wp-admin/admin-header.php';
 208      ?>
 209      <div class="wrap" id="wp-media-grid" data-search="<?php _admin_search_query(); ?>">
 210          <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
 211  
 212          <?php
 213          if ( current_user_can( 'upload_files' ) ) {
 214              ?>
 215              <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action aria-button-if-js"><?php echo esc_html__( 'Add New Media File' ); ?></a>
 216              <?php
 217          }
 218          ?>
 219  
 220          <hr class="wp-header-end">
 221  
 222          <?php
 223          if ( ! empty( $message ) ) {
 224              wp_admin_notice(
 225                  $message,
 226                  array(
 227                      'id'                 => 'message',
 228                      'additional_classes' => array( 'updated' ),
 229                      'dismissible'        => true,
 230                  )
 231              );
 232          }
 233  
 234          $js_required_message = sprintf(
 235              /* translators: %s: List view URL. */
 236              __( 'The grid view for the Media Library requires JavaScript. <a href="%s">Switch to the list view</a>.' ),
 237              'upload.php?mode=list'
 238          );
 239          wp_admin_notice(
 240              $js_required_message,
 241              array(
 242                  'additional_classes' => array( 'error', 'hide-if-js' ),
 243              )
 244          );
 245          ?>
 246      </div>
 247      <?php
 248      require_once  ABSPATH . 'wp-admin/admin-footer.php';
 249      exit;
 250  }
 251  
 252  $wp_list_table = _get_list_table( 'WP_Media_List_Table' );
 253  $pagenum       = $wp_list_table->get_pagenum();
 254  
 255  // Handle bulk actions.
 256  $doaction = $wp_list_table->current_action();
 257  
 258  if ( $doaction ) {
 259      check_admin_referer( 'bulk-media' );
 260  
 261      $post_ids = array();
 262  
 263      if ( 'delete_all' === $doaction ) {
 264          $post_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='attachment' AND post_status = 'trash'" );
 265          $doaction = 'delete';
 266      } elseif ( isset( $_REQUEST['media'] ) ) {
 267          $post_ids = $_REQUEST['media'];
 268      } elseif ( isset( $_REQUEST['ids'] ) ) {
 269          $post_ids = explode( ',', $_REQUEST['ids'] );
 270      }
 271      $post_ids = array_map( 'intval', (array) $post_ids );
 272  
 273      $location = 'upload.php';
 274      $referer  = wp_get_referer();
 275      if ( $referer ) {
 276          if ( str_contains( $referer, 'upload.php' ) ) {
 277              $location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer );
 278          }
 279      }
 280  
 281      switch ( $doaction ) {
 282          case 'detach':
 283              wp_media_attach_action( $_REQUEST['parent_post_id'], 'detach' );
 284              break;
 285  
 286          case 'attach':
 287              wp_media_attach_action( $_REQUEST['found_post_id'] );
 288              break;
 289  
 290          case 'trash':
 291              if ( empty( $post_ids ) ) {
 292                  break;
 293              }
 294              foreach ( $post_ids as $post_id ) {
 295                  if ( ! current_user_can( 'delete_post', $post_id ) ) {
 296                      wp_die( __( 'Sorry, you are not allowed to move this item to the Trash.' ) );
 297                  }
 298  
 299                  if ( ! wp_trash_post( $post_id ) ) {
 300                      wp_die( __( 'Error in moving the item to Trash.' ) );
 301                  }
 302              }
 303              $location = add_query_arg(
 304                  array(
 305                      'trashed' => count( $post_ids ),
 306                      'ids'     => implode( ',', $post_ids ),
 307                  ),
 308                  $location
 309              );
 310              break;
 311          case 'untrash':
 312              if ( empty( $post_ids ) ) {
 313                  break;
 314              }
 315              foreach ( $post_ids as $post_id ) {
 316                  if ( ! current_user_can( 'delete_post', $post_id ) ) {
 317                      wp_die( __( 'Sorry, you are not allowed to restore this item from the Trash.' ) );
 318                  }
 319  
 320                  if ( ! wp_untrash_post( $post_id ) ) {
 321                      wp_die( __( 'Error in restoring the item from Trash.' ) );
 322                  }
 323              }
 324              $location = add_query_arg( 'untrashed', count( $post_ids ), $location );
 325              break;
 326          case 'delete':
 327              if ( empty( $post_ids ) ) {
 328                  break;
 329              }
 330              foreach ( $post_ids as $post_id_del ) {
 331                  if ( ! current_user_can( 'delete_post', $post_id_del ) ) {
 332                      wp_die( __( 'Sorry, you are not allowed to delete this item.' ) );
 333                  }
 334  
 335                  if ( ! wp_delete_attachment( $post_id_del ) ) {
 336                      wp_die( __( 'Error in deleting the attachment.' ) );
 337                  }
 338              }
 339              $location = add_query_arg( 'deleted', count( $post_ids ), $location );
 340              break;
 341          default:
 342              $screen = get_current_screen()->id;
 343  
 344              /** This action is documented in wp-admin/edit.php */
 345              $location = apply_filters( "handle_bulk_actions-{$screen}", $location, $doaction, $post_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
 346      }
 347  
 348      wp_redirect( $location );
 349      exit;
 350  } elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
 351      wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
 352      exit;
 353  }
 354  
 355  $wp_list_table->prepare_items();
 356  
 357  // Used in the HTML title tag.
 358  $title       = __( 'Media Library' );
 359  $parent_file = 'upload.php';
 360  
 361  wp_enqueue_script( 'media' );
 362  
 363  add_screen_option( 'per_page' );
 364  
 365  get_current_screen()->add_help_tab(
 366      array(
 367          'id'      => 'overview',
 368          'title'   => __( 'Overview' ),
 369          'content' =>
 370                  '<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen.' ) . '</p>' .
 371                  '<p>' . __( 'You can narrow the list by file type/status or by date using the dropdown menus above the media table.' ) . '</p>' .
 372                  '<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>',
 373      )
 374  );
 375  get_current_screen()->add_help_tab(
 376      array(
 377          'id'      => 'actions-links',
 378          'title'   => __( 'Available Actions' ),
 379          'content' =>
 380                  '<p>' . __( 'Hovering over a row reveals action links that allow you to manage media items. You can perform the following actions:' ) . '</p>' .
 381                  '<ul>' .
 382                      '<li>' . __( '<strong>Edit</strong> takes you to a simple screen to edit that individual file&#8217;s metadata. You can also reach that screen by clicking on the media file name or thumbnail.' ) . '</li>' .
 383                      '<li>' . __( '<strong>Delete Permanently</strong> will delete the file from the media library (as well as from any posts to which it is currently attached).' ) . '</li>' .
 384                      '<li>' . __( '<strong>View</strong> will take you to a public display page for that file.' ) . '</li>' .
 385                      '<li>' . __( '<strong>Copy URL</strong> copies the URL for the media file to your clipboard.' ) . '</li>' .
 386                      '<li>' . __( '<strong>Download file</strong> downloads the original media file to your device.' ) . '</li>' .
 387                  '</ul>',
 388      )
 389  );
 390  get_current_screen()->add_help_tab(
 391      array(
 392          'id'      => 'attaching-files',
 393          'title'   => __( 'Attaching Files' ),
 394          'content' =>
 395                  '<p>' . __( 'If a media file has not been attached to any content, you will see that in the Uploaded To column, and can click on Attach to launch a small popup that will allow you to search for existing content and attach the file.' ) . '</p>',
 396      )
 397  );
 398  
 399  get_current_screen()->set_help_sidebar(
 400      '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
 401      '<p>' . __( '<a href="https://wordpress.org/documentation/article/media-library-screen/">Documentation on Media Library</a>' ) . '</p>' .
 402      '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>'
 403  );
 404  
 405  get_current_screen()->set_screen_reader_content(
 406      array(
 407          'heading_views'      => __( 'Filter media items list' ),
 408          'heading_pagination' => __( 'Media items list navigation' ),
 409          'heading_list'       => __( 'Media items list' ),
 410      )
 411  );
 412  
 413  require_once  ABSPATH . 'wp-admin/admin-header.php';
 414  ?>
 415  
 416  <div class="wrap">
 417  <h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
 418  
 419  <?php
 420  if ( current_user_can( 'upload_files' ) ) {
 421      ?>
 422      <a href="<?php echo esc_url( admin_url( 'media-new.php' ) ); ?>" class="page-title-action"><?php echo esc_html__( 'Add New Media File' ); ?></a>
 423                          <?php
 424  }
 425  
 426  if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
 427      echo '<span class="subtitle">';
 428      printf(
 429          /* translators: %s: Search query. */
 430          __( 'Search results for: %s' ),
 431          '<strong>' . get_search_query() . '</strong>'
 432      );
 433      echo '</span>';
 434  }
 435  ?>
 436  
 437  <hr class="wp-header-end">
 438  
 439  <?php
 440  if ( ! empty( $message ) ) {
 441      wp_admin_notice(
 442          $message,
 443          array(
 444              'id'                 => 'message',
 445              'additional_classes' => array( 'updated' ),
 446              'dismissible'        => true,
 447          )
 448      );
 449  }
 450  ?>
 451  
 452  <form id="posts-filter" method="get">
 453  
 454  <?php $wp_list_table->views(); ?>
 455  
 456  <?php $wp_list_table->display(); ?>
 457  
 458  <div id="ajax-response"></div>
 459  <?php find_posts_div(); ?>
 460  </form>
 461  </div>
 462  
 463  <?php
 464  require_once  ABSPATH . 'wp-admin/admin-footer.php';


Generated : Tue Mar 19 08:20:01 2024 Cross-referenced by PHPXref