WordPress.org

Make WordPress Core

Ticket #31779: 31779.diff

File 31779.diff, 12.2 KB (added by ZaneMatthew, 9 months ago)
  • src/wp-admin/theme-editor.php

    diff --git src/wp-admin/theme-editor.php src/wp-admin/theme-editor.php
    index 03b9194..15e4b38 100644
    if ( !current_user_can('edit_themes') ) 
    2020$title = __("Edit Themes"); 
    2121$parent_file = 'themes.php'; 
    2222 
     23/** 
     24 * Given that the parameter; "shown_file_editor_warning" is present in the URL and set to true, we'll 
     25 * update the currently logged in users meta to include a flag that they have seen the "Edit Themes" 
     26 * message. 
     27 * 
     28 * This support to show a message to first time visitors of the treacherous "Editor" screen is 
     29 * introduced in ticket: 31779. 
     30 * 
     31 * See additional scattered comments. 
     32 */ 
     33$meta_key       = 'shown_file_editor_warning'; 
     34$meta           = get_user_meta( get_current_user_id(), $meta_key, true ); 
     35 
     36if ( isset( $_GET['shown_file_editor_warning'] )  && true === (bool) $_GET['shown_file_editor_warning'] ) { 
     37        add_user_meta( get_current_user_id(), $meta_key, true, true ); 
     38        wp_redirect( admin_url( get_current_screen()->id . '.php') ); 
     39        exit; 
     40} 
     41 
    2342get_current_screen()->add_help_tab( array( 
    2443'id'            => 'overview', 
    2544'title'         => __('Overview'), 
    if ( $description != $file_show ) 
    164183<div class="wrap"> 
    165184<h1><?php echo esc_html( $title ); ?></h1> 
    166185 
    167 <div class="fileedit-sub"> 
    168 <div class="alignleft"> 
    169 <h2><?php echo $theme->display( 'Name' ); if ( $description ) echo ': ' . $description; ?></h2> 
    170 </div> 
    171 <div class="alignright"> 
    172         <form action="theme-editor.php" method="post"> 
    173                 <strong><label for="theme"><?php _e('Select theme to edit:'); ?> </label></strong> 
    174                 <select name="theme" id="theme"> 
    175 <?php 
    176 foreach ( wp_get_themes( array( 'errors' => null ) ) as $a_stylesheet => $a_theme ) { 
    177         if ( $a_theme->errors() && 'theme_no_stylesheet' == $a_theme->errors()->get_error_code() ) 
    178                 continue; 
    179  
    180         $selected = $a_stylesheet == $stylesheet ? ' selected="selected"' : ''; 
    181         echo "\n\t" . '<option value="' . esc_attr( $a_stylesheet ) . '"' . $selected . '>' . $a_theme->display('Name') . '</option>'; 
    182 } 
    183 ?> 
    184                 </select> 
    185                 <?php submit_button( __( 'Select' ), '', 'Submit', false ); ?> 
    186         </form> 
    187 </div> 
    188 <br class="clear" /> 
    189 </div> 
    190 <?php 
    191 if ( $theme->errors() ) 
    192         echo '<div class="error"><p><strong>' . __( 'This theme is broken.' ) . '</strong> ' . $theme->errors()->get_error_message() . '</p></div>'; 
    193 ?> 
    194         <div id="templateside"> 
    195186<?php 
    196 if ( $allowed_files ) : 
    197         $previous_file_type = ''; 
    198187 
    199         foreach ( $allowed_files as $filename => $absolute_filename ) : 
    200                 $file_type = substr( $filename, strrpos( $filename, '.' ) ); 
     188/** 
     189 * If this is the first time the user has visited the "Editor" page of the WordPress admin 
     190 * we'll show them a message. Additional detail can be found in ticket: 31779. 
     191 */ 
     192if ( empty( $meta ) ) : 
     193        $learn_more_url    = ''; 
     194        $shown_message_url = admin_url( add_query_arg( 
     195                array( 'shown_file_editor_warning' => true ), 
     196                get_current_screen()->id . '.php' 
     197        ) ); 
     198        ?> 
     199        <p><?php esc_attr_e( 'Warning: Editing files directly in the WordPress dashboard is risky and your changes may be lost when themes are updated.' ); ?></p> 
     200        <p><a href="<?php echo esc_url( $learn_more_url ); ?>"><?php esc_attr_e( 'Learn more about safely editing your theme.' ); ?></a></p> 
     201        <p><a href="<?php echo esc_url( $shown_message_url ); ?>" class="button-primary"><?php esc_attr_e( 'I got this.' ); ?></a></p> 
     202        <p><?php esc_attr_e( 'This message will not appear again.' ); ?></p> 
    201203 
    202                 if ( $file_type !== $previous_file_type ) { 
    203                         if ( '' !== $previous_file_type ) { 
    204                                 echo "\t</ul>\n"; 
     204<?php 
     205/** 
     206 * Any subsequent request to the "Editor" page will show the below code. Additional 
     207 * detail can be found in ticket: 31779. 
     208 */ 
     209else : ?> 
     210        <div class="fileedit-sub"> 
     211        <div class="alignleft"> 
     212        <h2><?php echo $theme->display( 'Name' ); if ( $description ) echo ': ' . $description; ?></h2> 
     213        </div> 
     214        <div class="alignright"> 
     215                <form action="theme-editor.php" method="post"> 
     216                        <strong><label for="theme"><?php _e('Select theme to edit:'); ?> </label></strong> 
     217                        <select name="theme" id="theme"> 
     218        <?php 
     219        foreach ( wp_get_themes( array( 'errors' => null ) ) as $a_stylesheet => $a_theme ) { 
     220                if ( $a_theme->errors() && 'theme_no_stylesheet' == $a_theme->errors()->get_error_code() ) 
     221                        continue; 
     222 
     223                $selected = $a_stylesheet == $stylesheet ? ' selected="selected"' : ''; 
     224                echo "\n\t" . '<option value="' . esc_attr( $a_stylesheet ) . '"' . $selected . '>' . $a_theme->display('Name') . '</option>'; 
     225        } 
     226        ?> 
     227                        </select> 
     228                        <?php submit_button( __( 'Select' ), '', 'Submit', false ); ?> 
     229                </form> 
     230        </div> 
     231        <br class="clear" /> 
     232        </div> 
     233        <?php 
     234        if ( $theme->errors() ) 
     235                echo '<div class="error"><p><strong>' . __( 'This theme is broken.' ) . '</strong> ' . $theme->errors()->get_error_message() . '</p></div>'; 
     236        ?> 
     237                <div id="templateside"> 
     238        <?php 
     239        if ( $allowed_files ) : 
     240                $previous_file_type = ''; 
     241 
     242                foreach ( $allowed_files as $filename => $absolute_filename ) : 
     243                        $file_type = substr( $filename, strrpos( $filename, '.' ) ); 
     244 
     245                        if ( $file_type !== $previous_file_type ) { 
     246                                if ( '' !== $previous_file_type ) { 
     247                                        echo "\t</ul>\n"; 
     248                                } 
     249 
     250                                switch ( $file_type ) { 
     251                                        case '.php': 
     252                                                if ( $has_templates || $theme->parent() ) : 
     253                                                        echo "\t<h2>" . __( 'Templates' ) . "</h2>\n"; 
     254                                                        if ( $theme->parent() ) { 
     255                                                                echo '<p class="howto">' . sprintf( __( 'This child theme inherits templates from a parent theme, %s.' ), 
     256                                                                        sprintf( '<a href="%s">%s</a>', 
     257                                                                                self_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ), 
     258                                                                                $theme->parent()->display( 'Name' ) 
     259                                                                        ) 
     260                                                                ) . "</p>\n"; 
     261                                                        } 
     262                                                endif; 
     263                                                break; 
     264                                        case '.css': 
     265                                                echo "\t<h2>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h2>\n"; 
     266                                                break; 
     267                                        default: 
     268                                                /* translators: %s: file extension */ 
     269                                                echo "\t<h2>" . sprintf( __( '%s files' ), $file_type ) . "</h2>\n"; 
     270                                                break; 
     271                                } 
     272 
     273                                echo "\t<ul>\n"; 
    205274                        } 
    206275 
    207                         switch ( $file_type ) { 
    208                                 case '.php': 
    209                                         if ( $has_templates || $theme->parent() ) : 
    210                                                 echo "\t<h2>" . __( 'Templates' ) . "</h2>\n"; 
    211                                                 if ( $theme->parent() ) { 
    212                                                         echo '<p class="howto">' . sprintf( __( 'This child theme inherits templates from a parent theme, %s.' ), 
    213                                                                 sprintf( '<a href="%s">%s</a>', 
    214                                                                         self_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ), 
    215                                                                         $theme->parent()->display( 'Name' ) 
    216                                                                 ) 
    217                                                         ) . "</p>\n"; 
    218                                                 } 
    219                                         endif; 
    220                                         break; 
    221                                 case '.css': 
    222                                         echo "\t<h2>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h2>\n"; 
    223                                         break; 
    224                                 default: 
    225                                         /* translators: %s: file extension */ 
    226                                         echo "\t<h2>" . sprintf( __( '%s files' ), $file_type ) . "</h2>\n"; 
    227                                         break; 
     276                        $file_description = get_file_description( $filename ); 
     277                        if ( $filename !== basename( $absolute_filename ) || $file_description !== $filename ) { 
     278                                $file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>'; 
    228279                        } 
    229280 
    230                         echo "\t<ul>\n"; 
    231                 } 
    232  
    233                 $file_description = get_file_description( $filename ); 
    234                 if ( $filename !== basename( $absolute_filename ) || $file_description !== $filename ) { 
    235                         $file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>'; 
    236                 } 
    237  
    238                 if ( $absolute_filename === $file ) { 
    239                         $file_description = '<span class="highlight">' . $file_description . '</span>'; 
    240                 } 
     281                        if ( $absolute_filename === $file ) { 
     282                                $file_description = '<span class="highlight">' . $file_description . '</span>'; 
     283                        } 
    241284 
    242                 $previous_file_type = $file_type; 
    243 ?> 
    244                 <li><a href="theme-editor.php?file=<?php echo urlencode( $filename ) ?>&amp;theme=<?php echo urlencode( $stylesheet ) ?>"><?php echo $file_description; ?></a></li> 
    245 <?php 
    246         endforeach; 
    247 ?> 
    248 </ul> 
    249 <?php endif; ?> 
    250 </div> 
    251 <?php if ( $error ) : 
    252         echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>'; 
    253 else : ?> 
    254         <form name="template" id="template" action="theme-editor.php" method="post"> 
    255         <?php wp_nonce_field( 'edit-theme_' . $file . $stylesheet ); ?> 
    256                 <div><textarea cols="70" rows="30" name="newcontent" id="newcontent" aria-describedby="newcontent-description"><?php echo $content; ?></textarea> 
    257                 <input type="hidden" name="action" value="update" /> 
    258                 <input type="hidden" name="file" value="<?php echo esc_attr( $relative_file ); ?>" /> 
    259                 <input type="hidden" name="theme" value="<?php echo esc_attr( $theme->get_stylesheet() ); ?>" /> 
    260                 <input type="hidden" name="scrollto" id="scrollto" value="<?php echo $scrollto; ?>" /> 
    261                 </div> 
    262         <?php if ( ! empty( $functions ) ) : ?> 
    263                 <div id="documentation" class="hide-if-no-js"> 
    264                 <label for="docs-list"><?php _e('Documentation:') ?></label> 
    265                 <?php echo $docs_select; ?> 
    266                 <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" /> 
    267                 </div> 
     285                        $previous_file_type = $file_type; 
     286        ?> 
     287                        <li><a href="theme-editor.php?file=<?php echo urlencode( $filename ) ?>&amp;theme=<?php echo urlencode( $stylesheet ) ?>"><?php echo $file_description; ?></a></li> 
     288        <?php 
     289                endforeach; 
     290        ?> 
     291        </ul> 
    268292        <?php endif; ?> 
    269  
    270                 <div> 
    271                 <?php if ( is_child_theme() && $theme->get_stylesheet() == get_template() ) : ?> 
    272                         <p><?php if ( is_writeable( $file ) ) { ?><strong><?php _e( 'Caution:' ); ?></strong><?php } ?> 
    273                         <?php _e( 'This is a file in your current parent theme.' ); ?></p> 
    274                 <?php endif; ?> 
    275 <?php 
    276         if ( is_writeable( $file ) ) : 
    277                 submit_button( __( 'Update File' ), 'primary', 'submit', true ); 
     293        </div> 
     294        <?php if ( $error ) : 
     295                echo '<div class="error"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>'; 
    278296        else : ?> 
    279 <p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="https://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p> 
    280 <?php endif; ?> 
    281                 </div> 
    282         </form> 
    283 <?php 
    284 endif; // $error 
    285 ?> 
    286 <br class="clear" /> 
     297                <form name="template" id="template" action="theme-editor.php" method="post"> 
     298                <?php wp_nonce_field( 'edit-theme_' . $file . $stylesheet ); ?> 
     299                        <div><textarea cols="70" rows="30" name="newcontent" id="newcontent" aria-describedby="newcontent-description"><?php echo $content; ?></textarea> 
     300                        <input type="hidden" name="action" value="update" /> 
     301                        <input type="hidden" name="file" value="<?php echo esc_attr( $relative_file ); ?>" /> 
     302                        <input type="hidden" name="theme" value="<?php echo esc_attr( $theme->get_stylesheet() ); ?>" /> 
     303                        <input type="hidden" name="scrollto" id="scrollto" value="<?php echo $scrollto; ?>" /> 
     304                        </div> 
     305                <?php if ( ! empty( $functions ) ) : ?> 
     306                        <div id="documentation" class="hide-if-no-js"> 
     307                        <label for="docs-list"><?php _e('Documentation:') ?></label> 
     308                        <?php echo $docs_select; ?> 
     309                        <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" /> 
     310                        </div> 
     311                <?php endif; ?> 
     312 
     313                        <div> 
     314                        <?php if ( is_child_theme() && $theme->get_stylesheet() == get_template() ) : ?> 
     315                                <p><?php if ( is_writeable( $file ) ) { ?><strong><?php _e( 'Caution:' ); ?></strong><?php } ?> 
     316                                <?php _e( 'This is a file in your current parent theme.' ); ?></p> 
     317                        <?php endif; ?> 
     318        <?php 
     319                if ( is_writeable( $file ) ) : 
     320                        submit_button( __( 'Update File' ), 'primary', 'submit', true ); 
     321                else : ?> 
     322        <p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="https://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p> 
     323        <?php endif; ?> 
     324                        </div> 
     325                </form> 
     326        <?php 
     327        endif; // $error 
     328        ?> 
     329        <?php endif; // End Warning Users check. ?> 
     330        <br class="clear" /> 
    287331</div> 
    288332<script type="text/javascript"> 
    289333jQuery(document).ready(function($){