From 7086111ad4dd997e12a3220e1ee60c9b9bcf0bb8 Mon Sep 17 00:00:00 2001
From: Charles
' . __( 'You can use the theme editor to edit the individual CSS and PHP files which make up your theme.' ) . '
' . + '' . __( 'Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme’s template files. Clicking once on any file name causes the file to appear in the large Editor box.' ) . '
' . + '' . __( 'For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function.' ) . '
' . + '' . __( 'When using a keyboard to navigate:' ) . '
' . + '' . __( 'After typing in your edits, click Update File.' ) . '
' . + '' . __( 'Advice: Think very carefully about your site crashing if you are live-editing the theme currently in use.' ) . '
' . + '' . sprintf( + /* translators: %s: Link to documentation on child themes. */ + __( 'Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a child theme instead.' ), + __( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ) + ) . '
' . + ( is_network_admin() ? '' . __( 'Any edits to files from this screen will be reflected on all sites in the network.' ) . '
' : '' ), + ) +); + +get_current_screen()->set_help_sidebar( + '' . __( 'For more information:' ) . '
' . + '' . __( 'Documentation on Theme Development' ) . '
' . + '' . __( 'Documentation on Using Themes' ) . '
' . + '' . __( 'Documentation on Editing Files' ) . '
' . + '' . __( 'Documentation on Template Tags' ) . '
' . + '' . __( 'Support' ) . '
' +); + +wp_reset_vars( array( 'action', 'error', 'file', 'theme' ) ); + +if ( $theme ) { + $stylesheet = $theme; +} else { + $stylesheet = get_stylesheet(); +} + +$theme = wp_get_theme( $stylesheet ); + +if ( ! $theme->exists() ) { + wp_die( __( 'The requested theme does not exist.' ) ); +} + +if ( $theme->errors() && 'theme_no_stylesheet' == $theme->errors()->get_error_code() ) { + wp_die( __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() ); +} + +$allowed_files = array(); +$style_files = array(); +$has_templates = false; + +$file_types = wp_get_theme_file_editable_extensions( $theme ); + +foreach ( $file_types as $type ) { + switch ( $type ) { + case 'php': + $allowed_files += $theme->get_files( 'php', -1 ); + $has_templates = ! empty( $allowed_files ); + break; + case 'css': + $style_files = $theme->get_files( 'css', -1 ); + $allowed_files['style.css'] = $style_files['style.css']; + $allowed_files += $style_files; + break; + default: + $allowed_files += $theme->get_files( $type, -1 ); + break; + } +} + +// Move functions.php and style.css to the top. +if ( isset( $allowed_files['functions.php'] ) ) { + $allowed_files = array( 'functions.php' => $allowed_files['functions.php'] ) + $allowed_files; +} +if ( isset( $allowed_files['style.css'] ) ) { + $allowed_files = array( 'style.css' => $allowed_files['style.css'] ) + $allowed_files; +} + +if ( empty( $file ) ) { + $relative_file = 'style.css'; + $file = $allowed_files['style.css']; +} else { + $relative_file = wp_unslash( $file ); + $file = $theme->get_stylesheet_directory() . '/' . $relative_file; +} + +validate_file_to_edit( $file, $allowed_files ); + +// Handle fallback editing of file when JavaScript is not available. +$edit_error = null; +$posted_content = null; +if ( 'POST' === $_SERVER['REQUEST_METHOD'] ) { + $r = wp_edit_theme_plugin_file( wp_unslash( $_POST ) ); + if ( is_wp_error( $r ) ) { + $edit_error = $r; + if ( check_ajax_referer( 'edit-theme_' . $stylesheet . '_' . $relative_file, 'nonce', false ) && isset( $_POST['newcontent'] ) ) { + $posted_content = wp_unslash( $_POST['newcontent'] ); + } + } else { + wp_redirect( + add_query_arg( + array( + 'a' => 1, // This means "success" for some reason. + 'theme' => $stylesheet, + 'file' => $relative_file, + ), + admin_url( 'theme-editor.php' ) + ) + ); + exit; + } +} + + $settings = array( + 'codeEditor' => wp_enqueue_code_editor( compact( 'file' ) ), + ); + wp_enqueue_script( 'wp-theme-plugin-editor' ); + wp_add_inline_script( 'wp-theme-plugin-editor', sprintf( 'jQuery( function( $ ) { wp.themePluginEditor.init( $( "#template" ), %s ); } )', wp_json_encode( $settings ) ) ); + wp_add_inline_script( 'wp-theme-plugin-editor', 'wp.themePluginEditor.themeOrPlugin = "theme";' ); + + require_once( ABSPATH . 'wp-admin/admin-header.php' ); + + update_recently_edited( $file ); + + if ( ! is_file( $file ) ) { + $error = true; + } + + $content = ''; + if ( ! empty( $posted_content ) ) { + $content = $posted_content; + } elseif ( ! $error && filesize( $file ) > 0 ) { + $f = fopen( $file, 'r' ); + $content = fread( $f, filesize( $file ) ); + + if ( '.php' == substr( $file, strrpos( $file, '.' ) ) ) { + $functions = wp_doc_link_parse( $content ); + + $docs_select = ''; + } + + $content = esc_textarea( $content ); + } + + $file_description = get_file_description( $relative_file ); + $file_show = array_search( $file, array_filter( $allowed_files ) ); + $description = esc_html( $file_description ); + if ( $file_description != $file_show ) { + $description .= ' (' . esc_html( $file_show ) . ')'; + } + ?> +get_error_message() ? $edit_error->get_error_message() : $edit_error->get_error_code() ); ?>+
+
+ built-in CSS editor.' ), + esc_url( add_query_arg( 'autofocus[section]', 'custom_css', admin_url( 'customize.php' ) ) ) + ); + ?> +
+' . __( 'This theme is broken.' ) . ' ' . $theme->errors()->get_error_message() . '
' . __( 'File does not exist! Please double check the name and try again.' ) . '