web/wp-admin/revision.php
branchwordpress
changeset 109 03b0d1493584
child 132 4d4862461b8d
equal deleted inserted replaced
-1:000000000000 109:03b0d1493584
       
     1 <?php
       
     2 /**
       
     3  * Revisions administration panel.
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  */
       
     8 
       
     9 /** WordPress Administration Bootstrap */
       
    10 require_once('admin.php');
       
    11 
       
    12 wp_reset_vars(array('revision', 'left', 'right', 'diff', 'action'));
       
    13 $revision_id = absint($revision);
       
    14 $diff        = absint($diff);
       
    15 $left        = absint($left);
       
    16 $right       = absint($right);
       
    17 
       
    18 $parent_file = $redirect = 'edit.php';
       
    19 
       
    20 switch ( $action ) :
       
    21 case 'delete' : // stubs
       
    22 case 'edit' :
       
    23 	if ( constant('WP_POST_REVISIONS') ) // stub
       
    24 		$redirect = remove_query_arg( 'action' );
       
    25 	else // Revisions disabled
       
    26 		$redirect = 'edit.php';
       
    27 	break;
       
    28 case 'restore' :
       
    29 	if ( !$revision = wp_get_post_revision( $revision_id ) )
       
    30 		break;
       
    31 	if ( !current_user_can( 'edit_post', $revision->post_parent ) )
       
    32 		break;
       
    33 	if ( !$post = get_post( $revision->post_parent ) )
       
    34 		break;
       
    35 
       
    36 	if ( !constant('WP_POST_REVISIONS') && !wp_is_post_autosave( $revision ) ) // Revisions disabled and we're not looking at an autosave
       
    37 		break;
       
    38 
       
    39 	check_admin_referer( "restore-post_$post->ID|$revision->ID" );
       
    40 
       
    41 	wp_restore_post_revision( $revision->ID );
       
    42 	$redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) );
       
    43 	break;
       
    44 case 'diff' :
       
    45 	if ( !$left_revision  = get_post( $left ) )
       
    46 		break;
       
    47 	if ( !$right_revision = get_post( $right ) )
       
    48 		break;
       
    49 
       
    50 	if ( !current_user_can( 'read_post', $left_revision->ID ) || !current_user_can( 'read_post', $right_revision->ID ) )
       
    51 		break;
       
    52 
       
    53 	// If we're comparing a revision to itself, redirect to the 'view' page for that revision or the edit page for that post
       
    54 	if ( $left_revision->ID == $right_revision->ID ) {
       
    55 		$redirect = get_edit_post_link( $left_revision->ID );
       
    56 		include( 'js/revisions-js.php' );
       
    57 		break;
       
    58 	}
       
    59 
       
    60 	// Don't allow reverse diffs?
       
    61 	if ( strtotime($right_revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) {
       
    62 		$redirect = add_query_arg( array( 'left' => $right, 'right' => $left ) );
       
    63 		break;
       
    64 	}
       
    65 
       
    66 	if ( $left_revision->ID == $right_revision->post_parent ) // right is a revision of left
       
    67 		$post =& $left_revision;
       
    68 	elseif ( $left_revision->post_parent == $right_revision->ID ) // left is a revision of right
       
    69 		$post =& $right_revision;
       
    70 	elseif ( $left_revision->post_parent == $right_revision->post_parent ) // both are revisions of common parent
       
    71 		$post = get_post( $left_revision->post_parent );
       
    72 	else
       
    73 		break; // Don't diff two unrelated revisions
       
    74 
       
    75 	if ( !constant('WP_POST_REVISIONS') ) { // Revisions disabled
       
    76 		if (
       
    77 			// we're not looking at an autosave
       
    78 			( !wp_is_post_autosave( $left_revision ) && !wp_is_post_autosave( $right_revision ) )
       
    79 		||
       
    80 			// we're not comparing an autosave to the current post
       
    81 			( $post->ID !== $left_revision->ID && $post->ID !== $right_revision->ID )
       
    82 		)
       
    83 			break;
       
    84 	}
       
    85 
       
    86 	if (
       
    87 		// They're the same
       
    88 		$left_revision->ID == $right_revision->ID
       
    89 	||
       
    90 		// Neither is a revision
       
    91 		( !wp_get_post_revision( $left_revision->ID ) && !wp_get_post_revision( $right_revision->ID ) )
       
    92 	)
       
    93 		break;
       
    94 
       
    95 	$post_title = '<a href="' . get_edit_post_link() . '">' . get_the_title() . '</a>';
       
    96 	$h2 = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title );
       
    97 
       
    98 	$left  = $left_revision->ID;
       
    99 	$right = $right_revision->ID;
       
   100 
       
   101 	$redirect = false;
       
   102 	break;
       
   103 case 'view' :
       
   104 default :
       
   105 	if ( !$revision = wp_get_post_revision( $revision_id ) )
       
   106 		break;
       
   107 	if ( !$post = get_post( $revision->post_parent ) )
       
   108 		break;
       
   109 
       
   110 	if ( !current_user_can( 'read_post', $revision->ID ) || !current_user_can( 'read_post', $post->ID ) )
       
   111 		break;
       
   112 
       
   113 	if ( !constant('WP_POST_REVISIONS') && !wp_is_post_autosave( $revision ) ) // Revisions disabled and we're not looking at an autosave
       
   114 		break;
       
   115 
       
   116 	$post_title = '<a href="' . get_edit_post_link() . '">' . get_the_title() . '</a>';
       
   117 	$revision_title = wp_post_revision_title( $revision, false );
       
   118 	$h2 = sprintf( __( 'Post Revision for &#8220;%1$s&#8221; created on %2$s' ), $post_title, $revision_title );
       
   119 
       
   120 	// Sets up the diff radio buttons
       
   121 	$left  = $revision->ID;
       
   122 	$right = $post->ID;
       
   123 
       
   124 	$redirect = false;
       
   125 	break;
       
   126 endswitch;
       
   127 
       
   128 if ( !$redirect && !in_array( $post->post_type, array( 'post', 'page' ) ) )
       
   129 	$redirect = 'edit.php';
       
   130 
       
   131 if ( $redirect ) {
       
   132 	wp_redirect( $redirect );
       
   133 	exit;
       
   134 }
       
   135 
       
   136 if ( 'page' == $post->post_type ) {
       
   137 	$submenu_file = 'edit-pages.php';
       
   138 	$title = __( 'Page Revisions' );
       
   139 } else {
       
   140 	$submenu_file = 'edit.php';
       
   141 	$title = __( 'Post Revisions' );
       
   142 }
       
   143 
       
   144 require_once( 'admin-header.php' );
       
   145 
       
   146 ?>
       
   147 
       
   148 <div class="wrap">
       
   149 
       
   150 <h2 class="long-header"><?php echo $h2; ?></h2>
       
   151 
       
   152 <table class="form-table ie-fixed">
       
   153 	<col class="th" />
       
   154 <?php if ( 'diff' == $action ) : ?>
       
   155 <tr id="revision">
       
   156 	<th scope="row"></th>
       
   157 	<th scope="col" class="th-full">
       
   158 		<span class="alignleft"><?php printf( __('Older: %s'), wp_post_revision_title( $left_revision ) ); ?></span>
       
   159 		<span class="alignright"><?php printf( __('Newer: %s'), wp_post_revision_title( $right_revision ) ); ?></span>
       
   160 	</th>
       
   161 </tr>
       
   162 <?php endif;
       
   163 
       
   164 // use get_post_to_edit filters?
       
   165 $identical = true;
       
   166 foreach ( _wp_post_revision_fields() as $field => $field_title ) :
       
   167 	if ( 'diff' == $action ) {
       
   168 		$left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field );
       
   169 		$right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field );
       
   170 		if ( !$content = wp_text_diff( $left_content, $right_content ) )
       
   171 			continue; // There is no difference between left and right
       
   172 		$identical = false;
       
   173 	} else {
       
   174 		add_filter( "_wp_post_revision_field_$field", 'htmlspecialchars' );
       
   175 		$content = apply_filters( "_wp_post_revision_field_$field", $revision->$field, $field );
       
   176 	}
       
   177 	?>
       
   178 
       
   179 	<tr id="revision-field-<?php echo $field; ?>">
       
   180 		<th scope="row"><?php echo esc_html( $field_title ); ?></th>
       
   181 		<td><div class="pre"><?php echo $content; ?></div></td>
       
   182 	</tr>
       
   183 
       
   184 	<?php
       
   185 
       
   186 endforeach;
       
   187 
       
   188 if ( 'diff' == $action && $identical ) :
       
   189 
       
   190 	?>
       
   191 
       
   192 	<tr><td colspan="2"><div class="updated"><p><?php _e( 'These revisions are identical.' ); ?></p></div></td></tr>
       
   193 
       
   194 	<?php
       
   195 
       
   196 endif;
       
   197 
       
   198 ?>
       
   199 
       
   200 </table>
       
   201 
       
   202 <br class="clear" />
       
   203 
       
   204 <h2><?php echo $title; ?></h2>
       
   205 
       
   206 <?php
       
   207 
       
   208 $args = array( 'format' => 'form-table', 'parent' => true, 'right' => $right, 'left' => $left );
       
   209 if ( !constant( 'WP_POST_REVISIONS' ) )
       
   210 	$args['type'] = 'autosave';
       
   211 
       
   212 wp_list_post_revisions( $post, $args );
       
   213 
       
   214 ?>
       
   215 
       
   216 </div>
       
   217 
       
   218 <?php
       
   219 
       
   220 require_once( 'admin-footer.php' );