From fe921a53ec4420bb963ddad44e39f8967871891b Mon Sep 17 00:00:00 2001 From: azaozz Date: Tue, 16 Sep 2008 04:24:28 +0000 Subject: [PATCH] Reattaching of orphan attachments and choose post/page ajaxed search box git-svn-id: http://svn.automattic.com/wordpress/trunk@8901 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/admin-ajax.php | 64 +++++++++ wp-admin/css/colors-classic.css | 14 +- wp-admin/css/colors-fresh.css | 17 ++- wp-admin/edit-attachment-rows.php | 8 +- wp-admin/includes/template.php | 127 +++++++++++++++++ wp-admin/media.php | 2 +- wp-admin/upload.php | 226 ++++++++++++++++++++++++++---- wp-admin/wp-admin.css | 96 ++++++++++++- 8 files changed, 515 insertions(+), 39 deletions(-) diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index b3732f80e7..8b4b1628cc 100644 --- a/wp-admin/admin-ajax.php +++ b/wp-admin/admin-ajax.php @@ -749,6 +749,70 @@ case 'meta-box-order': check_ajax_referer( 'meta-box-order' ); update_user_option( $GLOBALS['current_user']->ID, "meta-box-order_$_POST[page]", $_POST['order'] ); die('1'); + break; +case 'find_posts': + check_ajax_referer( 'find-posts' ); + + if ( empty($_POST['ps']) ) + exit; + + $what = isset($_POST['pages']) ? 'page' : 'post'; + $s = stripslashes($_POST['ps']); + preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches); + $search_terms = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]); + + $searchand = $search = ''; + foreach( (array) $search_terms as $term) { + $term = addslashes_gpc($term); + $search .= "{$searchand}(($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%'))"; + $searchand = ' AND '; + } + $term = $wpdb->escape($s); + if ( count($search_terms) > 1 && $search_terms[0] != $s ) + $search .= " OR ($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%')"; + + $posts = $wpdb->get_results( "SELECT ID, post_title, post_status, post_date FROM $wpdb->posts WHERE post_type = '$what' AND $search ORDER BY post_date_gmt DESC LIMIT 50" ); + + if ( ! $posts ) + exit( __('No posts found.') ); + + $html = ''; + foreach ( $posts as $post ) { + + switch ( $post->post_status ) { + case 'publish' : + case 'private' : + $stat = __('Published'); + break; + case 'future' : + $stat = __('Scheduled'); + break; + case 'pending' : + $stat = __('Pending Review'); + break; + case 'draft' : + $stat = __('Unpublished'); + break; + } + + if ( '0000-00-00 00:00:00' == $post->post_date ) { + $time = ''; + } else { + $time = mysql2date(__('Y/m/d'), $post->post_date); + } + + $html .= ''; + $html .= ''."\n\n"; + } + $html .= '

'.__('Title').''.__('Time').''.__('Status').'
'.wp_specialchars($time, true).''.wp_specialchars($stat, true).'
'; + + $x = new WP_Ajax_Response(); + $x->add( array( + 'what' => $what, + 'data' => $html + )); + $x->send(); + break; default : do_action( 'wp_ajax_' . $_POST['action'] ); diff --git a/wp-admin/css/colors-classic.css b/wp-admin/css/colors-classic.css index 4e5d0af183..60078dc66c 100644 --- a/wp-admin/css/colors-classic.css +++ b/wp-admin/css/colors-classic.css @@ -1,5 +1,6 @@ -#sidemenu-bg { +#sidemenu-bg, +.find-box-search { background-color: #14568A; border-color: #c6d9e9; } @@ -12,7 +13,9 @@ a.page-numbers:hover { border-color: #999; } -body, .form-table .pre { +body, +.form-table .pre, +.find-box-inside { background-color: #fff; color: #333; } @@ -301,7 +304,9 @@ ul#widget-list li.widget-list-item h4.widget-title { border-bottom-color: #ccc; } -.widefat thead, .thead { +.widefat thead, +.thead, +.find-box-head { background-color: #464646; color: #d7d7d7; } @@ -825,7 +830,8 @@ div.star.select:hover { background-color: #d00; } -#plugin-information .fyi ul { +#plugin-information .fyi ul, +.find-box { background-color: #eaf3fa; } diff --git a/wp-admin/css/colors-fresh.css b/wp-admin/css/colors-fresh.css index 59ee0cd13c..4bb75d37e1 100644 --- a/wp-admin/css/colors-fresh.css +++ b/wp-admin/css/colors-fresh.css @@ -1,5 +1,6 @@ -#sidemenu-bg { +#sidemenu-bg, +.find-box-search { background-color: #e4f2fd; border-color: #c6d9e9; } @@ -12,7 +13,9 @@ a.page-numbers:hover { border-color: #999; } -body, .form-table .pre { +body, +.form-table .pre, +.find-box-inside { background-color: #fff; color: #333; } @@ -296,7 +299,12 @@ ul.view-switch li.current a { border-bottom-color: #ccc; } -.widefat thead, .thead, h3.dashboard-widget-title, h3.dashboard-widget-title span, h3.dashboard-widget-title small { +.widefat thead, +.thead, +h3.dashboard-widget-title, +h3.dashboard-widget-title span, +h3.dashboard-widget-title small, +.find-box-head { background-color: #464646; color: #d7d7d7; } @@ -808,7 +816,8 @@ div.star.select:hover { background-color: #d00; } -#plugin-information .fyi ul { +#plugin-information .fyi ul, +.find-box { background-color: #eaf3fa; } diff --git a/wp-admin/edit-attachment-rows.php b/wp-admin/edit-attachment-rows.php index a79dfef52a..9da1910142 100644 --- a/wp-admin/edit-attachment-rows.php +++ b/wp-admin/edit-attachment-rows.php @@ -66,14 +66,14 @@ foreach ($posts_columns as $column_name => $column_display_name ) { case 'cb': ?> - > + - >ID, array(80, 60), true ) ) { ?> @@ -104,6 +104,8 @@ foreach ($posts_columns as $column_name => $column_display_name ) { ( $i == $action_count ) ? $sep = '' : $sep = ' | '; echo "$link$sep"; } + ?>

+ + + + diff --git a/wp-admin/media.php b/wp-admin/media.php index cf9dea2574..f9fb79dffe 100644 --- a/wp-admin/media.php +++ b/wp-admin/media.php @@ -67,7 +67,7 @@ case 'edit' : add_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2); wp_enqueue_script( 'wp-ajax-response' ); - wp_admin_css( 'media' ); +// wp_admin_css( 'media' ); require( 'admin-header.php' ); diff --git a/wp-admin/upload.php b/wp-admin/upload.php index cbbd949c1e..984ff24162 100644 --- a/wp-admin/upload.php +++ b/wp-admin/upload.php @@ -10,12 +10,59 @@ require_once('admin.php'); add_thickbox(); wp_enqueue_script( 'media-upload' ); +wp_enqueue_script( 'wp-ajax-response' ); +wp_enqueue_script( 'jquery-ui-draggable' ); +wp_enqueue_script( 'jquery-ui-resizable' ); if (!current_user_can('upload_files')) wp_die(__('You do not have permission to upload files.')); -// Handle bulk deletes -if ( isset($_GET['action']) && isset($_GET['media']) ) { +if ( isset($_GET['find_detached'] ) ) { + check_admin_referer('bulk-media'); + + if ( ! current_user_can('edit_posts') ) + wp_die( __('You are not allowed to scan for lost attachments.') ); + + $all_posts = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_type = 'post' OR post_type = 'page'"); + $all_att = $wpdb->get_results("SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'attachment'"); + + $lost = array(); + foreach ( (array) $all_att as $att ) { + if ( $att->post_parent > 0 && ! in_array($att->post_parent, $all_posts) ) + $lost[] = $att->ID; + } + $_GET['detached'] = 1; + +} elseif ( isset($_GET['found_post_id']) && isset($_GET['media']) ) { + check_admin_referer('bulk-media'); + + if ( ! ( $parent_id = (int) $_GET['found_post_id'] ) ) + return; + + $parent = &get_post($parent_id); + if ( !current_user_can('edit_post', $parent_id) ) + wp_die( __('You are not allowed to edit this post.') ); + + $attach = array(); + foreach( (array) $_GET['media'] as $att_id ) { + $att_id = (int) $att_id; + + if ( !current_user_can('edit_post', $att_id) ) + continue; + + $attach[] = $att_id; + } + + if ( ! empty($attach) ) { + $attach = implode(',', $attach); + $attached = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ($attach)", $parent_id) ); + + $message = sprintf( __ngettext('Added %1$s attachment to %2$s', 'Added %1$s attachments to %2$s', $attached, apply_filters( "the_title", $parent->post_title ) ) , $attached, apply_filters( "the_title", $parent->post_title ) ); + } + + $_GET['detached'] = 1; + +} elseif ( isset($_GET['action']) && isset($_GET['media']) ) { check_admin_referer('bulk-media'); if ( $_GET['action'] == 'delete' ) { foreach( (array) $_GET['media'] as $post_id_del ) { @@ -50,19 +97,45 @@ $parent_file = 'edit.php'; wp_enqueue_script( 'admin-forms' ); wp_enqueue_script('media'); -list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query(); +if ( ! isset( $_GET['paged'] ) || $_GET['paged'] < 1 ) + $_GET['paged'] = 1; + +if ( isset($_GET['detached']) ) { + + if ( isset($lost) ) { + $start = ( $_GET['paged'] - 1 ) * 50; + $page_links_total = ceil(count($lost) / 50); + $lost = implode(',', $lost); + + $orphans = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_type = 'attachment' AND ID IN ($lost) LIMIT $start, 50" ); + } else { + $start = ( $_GET['paged'] - 1 ) * 25; + $orphans = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent < 1 LIMIT $start, 25" ); + $page_links_total = ceil($wpdb->get_var( "SELECT FOUND_ROWS()" ) / 25); + } + + $post_mime_types = array( + 'image' => array(__('Images'), __('Manage Images'), __ngettext_noop('Image (%s)', 'Images (%s)')), + 'audio' => array(__('Audio'), __('Manage Audio'), __ngettext_noop('Audio (%s)', 'Audio (%s)')), + 'video' => array(__('Video'), __('Manage Video'), __ngettext_noop('Video (%s)', 'Video (%s)')), + ); + $post_mime_types = apply_filters('post_mime_types', $post_mime_types); + + $avail_post_mime_types = get_available_post_mime_types('attachment'); + + if ( isset($_GET['post_mime_type']) && !array_intersect( (array) $_GET['post_mime_type'], array_keys($post_mime_types) ) ) + unset($_GET['post_mime_type']); + +} else { + list($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query(); +} if ( is_singular() ) { wp_enqueue_script( 'admin-comments' ); wp_enqueue_script( 'jquery-table-hotkeys' ); } -require_once('admin-header.php'); - -if ( !isset( $_GET['paged'] ) ) - $_GET['paged'] = 1; - -?> +require_once('admin-header.php'); ?>

post_title)); +if ( isset($_GET['detached']) ) { + _e('Unattached Media'); +} elseif ( is_singular() ) { + printf( __('Comments on %s'), apply_filters("the_title", $post->post_title) ); } else { $post_mime_type_label = _c('Media|manage media header'); if ( isset($_GET['post_mime_type']) && in_array( $_GET['post_mime_type'], array_keys($post_mime_types) ) ) $post_mime_type_label = $post_mime_types[$_GET['post_mime_type']][1]; //TODO: Unreachable code: $post_listing_pageable is undefined, Similar code in edit.php - //if ( $post_listing_pageable && !is_archive() && !is_search() ) + //if ( $post_listing_pageable && !is_archive() && !is_search() ) // $h2_noun = is_paged() ? sprintf(__( 'Previous %s' ), $post_mime_type_label) : sprintf(__('Latest %s'), $post_mime_type_label); //else $h2_noun = $post_mime_type_label; @@ -127,7 +202,8 @@ $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_po foreach ( $matches as $type => $reals ) foreach ( $reals as $real ) $num_posts[$type] += $_num_posts[$real]; -$class = empty($_GET['post_mime_type']) ? ' class="current"' : ''; + +$class = empty($_GET['post_mime_type']) && ! isset($_GET['detached']) ? ' class="current"' : ''; $type_links[] = "
  • ".__('All Types').""; foreach ( $post_mime_types as $mime_type => $label ) { $class = ''; @@ -141,6 +217,9 @@ foreach ( $post_mime_types as $mime_type => $label ) { $type_links[] = "
  • " . sprintf(__ngettext($label[2][0], $label[2][1], $num_posts[$mime_type]), number_format_i18n( $num_posts[$mime_type] )) . ''; } +$class = isset($_GET['detached']) ? ' class="current"' : ''; +$type_links[] = '
  • ' . __('Unattached') . ''; + echo implode(' |
  • ', $type_links) . ''; unset($type_links); ?> @@ -155,10 +234,13 @@ endif; $messages[1] = __('Media updated.'); $messages[2] = __('Media deleted.'); -if (isset($_GET['message'])) : ?> -

    +if ( isset($_GET['message']) && (int) $_GET['message'] ) + $message = $messages[$_GET['message']]; + +if ( $message ) { ?> +

    @@ -166,10 +248,13 @@ endif;
    max_num_pages; + $page_links = paginate_links( array( 'base' => add_query_arg( 'paged', '%#%' ), 'format' => '', - 'total' => $wp_query->max_num_pages, + 'total' => $page_links_total, 'current' => $_GET['paged'] )); @@ -178,15 +263,18 @@ if ( $page_links ) ?>
    - + + + - + posts WHERE post_type = 'attachment' ORDER BY post_date DESC"; $arc_result = $wpdb->get_results( $arc_query ); @@ -217,7 +305,11 @@ foreach ($arc_result as $arc_row) { - + + + + +
    @@ -225,11 +317,93 @@ foreach ($arc_result as $arc_row) {

    - - - + + + + + + + + + + + + +post_title) ? __('(no title)') : wp_specialchars( apply_filters('the_title', $post->post_title) ); +?> + + + + + + + +post_date && 'date' == $column_name ) { + $t_time = $h_time = __('Unpublished'); + } else { + $t_time = get_the_time(__('Y/m/d g:i:s A')); + $m_time = $post->post_date; + $time = get_post_time( 'G', true ); + if ( ( abs($t_diff = time() - $time) ) < 86400 ) { + if ( $t_diff < 0 ) + $h_time = sprintf( __('%s from now'), human_time_diff( $time ) ); + else + $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); + } else { + $h_time = mysql2date(__('Y/m/d'), $m_time); + } + } ?> + + + + + + +
    ID, array(80, 60), true ) ) { ?> + "> +">
    + ID))); ?> + +

    + ID, true) . '">' . __('Edit') . ''; + $actions['delete'] = "ID) . "' onclick=\"if ( confirm('" . js_escape(sprintf( ('draft' == $post->post_status) ? __("You are about to delete this attachment '%s'\n 'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this attachment '%s'\n 'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete') . ""; + $actions['view'] = '' . __('View') . ''; + $actions['attach'] = ''.__('Attach').''; + $action_count = count($actions); + $i = 0; + foreach ( $actions as $action => $link ) { + ++$i; + ( $i == $action_count ) ? $sep = '' : $sep = ' | '; + echo "$link$sep"; + } ?> +

    + + +
    @@ -284,7 +458,7 @@ endif; // posts; - \ No newline at end of file +?> diff --git a/wp-admin/wp-admin.css b/wp-admin/wp-admin.css index 58f6043306..66a1b6e0c1 100644 --- a/wp-admin/wp-admin.css +++ b/wp-admin/wp-admin.css @@ -568,6 +568,7 @@ p.pagenav { td.media-icon { vertical-align: middle; text-align: center; + width: 80px; } td.media-icon img { @@ -2255,4 +2256,97 @@ a.togbox { .inline td.status input { vertical-align: middle; -} \ No newline at end of file +} + +/* Media library */ +#wpbody-content .media-item-info tr { + background-color: transparent; +} + +#wpbody-content .filename { + margin-left: 10px; +} + +#wpbody-content .media-item .thumbnail { + max-height:128px; + max-width:128px; +} + +#wpbody-content .media-upload-form label { + display: block; + font-size: 13px; + font-weight: bold; + margin: 0.5em; +} + +abbr.required { + border: medium none; + text-decoration: none; +} + +#wpbody-content .media-single input[type="text"], +#wpbody-content .media-single textarea { + width: 460px; +} + +#wpbody-content .media-upload-form p.help { + margin: 0; + padding: 0; +} + +/* find posts */ +.find-box { + width: 400px; + height: 250px; + overflow: hidden; + padding: 33px 5px 50px; + position: absolute; + z-index: 1000; +} + +.find-box-head { + cursor: move; + font-weight: bold; + height: 2em; + line-height: 2em; + padding: 1px 12px; + position: absolute; + top: 5px; + width: 100%; +} + +.find-box-inside { + overflow: auto; + width: 100%; + height: 100%; +} + +.find-box-search { + padding: 12px; + border-width: 1px; + border-style: none none solid; +} + +#find-posts-response { + margin: 8px 0; + padding: 0 1px; +} + +#find-posts-response table { + width: 100%; +} + +#find-posts-response .found-radio { + padding: 8px 0 0 8px; + width: 15px; +} + +.find-box-buttons { + bottom: 12px; + left: 12px; + position: absolute; +} + +.find-box-search label { + padding-right: 6px; +}