Is there a way to use the wordpress theme / plugin editor inside my plugin to give the user the ability to edit the css file of my plugin ?

Im building a plugin that gives the user an option to add some CSS. First i was going to use just a textarea but then i thought it would be pretty could if i can use the Wordpress editor that will open my style.css file. I could put just a link to http://www.xxxxxx.com/wp-admin/plugin-editor.php but it would be great if i can integrate it into my plugin.


2 Answers 2


To start with you could use the following code. For security you could also add some nonce check and even use the settings api. Here plugin-test is your plugin folder name.

$file = stripslashes('plugin-test/style.css');
$plugin_files = get_plugin_files($file);
$file = validate_file_to_edit($file, $plugin_files);
$real_file = WP_PLUGIN_DIR . '/' . $file;

if( isset($_POST['plugin_test_settings']['newcontent']) ) {
    $newcontent = stripslashes($_POST['plugin_test_settings']['newcontent']);
    if ( is_writeable($real_file) ) {
            $f = fopen($real_file, 'w+');
            fwrite($f, $newcontent);

$content = file_get_contents( $real_file );

$content = esc_textarea( $content ); ?>
<table class="form-table">
        <tr valign="top">
                <textarea cols="70" rows="25" name="plugin_test_settings[newcontent]" id="newcontent" tabindex="1"><?php echo $content ?></textarea>

If you are looking for some more complex solution I wrote WP Custom File Editor plugin based on code from Thesis theme http://diythemes.com/

Plugin Name: WP Custom File Editor
Plugin URI: http://www.webikon.eu/
Description: Simple file editor
Version: 0.1
Author: Ján Bočínec
Author URI: http://johnnypea.wp.sk/
License: GPLv2 or later

/* This code is based on code from Thesis theme http://diythemes.com/ */

// You can define your custom folder where are located files you would like to be editable. Default is current folder.
if (!defined('WPCFE_CUSTOM_FOLDER'))
    define('WPCFE_CUSTOM_FOLDER', __DIR__);

 * You can define your own array of file paths.
 * If this is set, only these files are loaded into the editor
// global $custom_files_array;
// $custom_files_array = array('custom.css', 'hello.php');

// register the admin menu
add_action('admin_menu', 'wpcfe_add_menu');
// save the changes
add_action('admin_post_wpcfe_file_editor', array('wpcfe_custom_editor', 'save_file'));

// Add admin menu
function wpcfe_add_menu() {
    add_options_page(__('WP Custom File Editor', 'wpcfe'), __('WP Custom File Editor', 'wpcfe'), 'edit_themes', 'wpcfe-file-editor', array('wpcfe_custom_editor', 'options_page'));

 * Outputs the Custom File Editor
class wpcfe_custom_editor {

    function wpcfe_custom_editor($custom_files_array='') {
        $this->custom_files = $custom_files_array;

    function get_custom_files() {
        $files = array();
        if ( $this->custom_files )
            return $files = $this->custom_files;
        if ( !is_dir (WPCFE_CUSTOM_FOLDER) )
            return $files;
        $directory = opendir(WPCFE_CUSTOM_FOLDER); // Open the directory
        $exts = array('.php', '.css', '.js', '.txt', '.inc', '.htaccess', '.html', '.htm'); // What type of files do we want?

        while ($file = readdir($directory)) { // Read the files
            if ($file != '.' && $file != '..' && (strpos($file, 'layout') === false)) { // Only list files within the _current_ directory
                $extension = substr($file, strrpos($file, '.')); // Get the extension of the file

                if ($extension && in_array($extension, $exts)) // Verify extension of the file; we can't edit images!
                    $files[] = $file; // Add the file to the array

        closedir($directory); // Close the directory
        return $files; // Return the array of editable files

    function is_custom_writable($file, $files) {
        if (!in_array($file, $files) && is_dir (WPCFE_CUSTOM_FOLDER))
            $error = "<p><strong>" . __('Attention!', 'wpcfe') . '</strong> ' . __('For security reasons, the file you are attempting to edit cannot be modified via this screen.', 'wpcfe') . '</p>';
        elseif (!file_exists(WPCFE_CUSTOM_FOLDER)) // The custom/ directory does not exist
            $error = "<p><strong>" . __('Attention!', 'wpcfe') . '</strong> ' . __('Your <code>'.WPCFE_CUSTOM_FOLDER.'/</code> directory does not appear to exist.', 'wpcfe') . '</p>';
        elseif (!is_file(WPCFE_CUSTOM_FOLDER . '/' . $file)) // The selected file does not exist
            $error = "<p><strong>" . __('Attention!', 'wpcfe') . '</strong> ' . __('The file you are attempting does not appear to exist.', 'wpcfe') . '</p>';
        elseif (!is_writable(WPCFE_CUSTOM_FOLDER . '/' . $file)) // The selected file is not writable
            $error = "<p><strong>" . __('Attention!', 'wpcfe') . '</strong> ' . sprintf(__('Your <code>/'.WPCFE_CUSTOM_FOLDER.'/%s</code> file is not writable by the server, and in order to modify the file via the admin panel, WP File Editor needs to be able to write to this file. All you have to do is set this file&#8217;s permissions to 666, and you&#8217;ll be good to go.', 'wpcfe'), $file) . '</p>';

        if ($error) { // Return the error + markup, if required
            $error = "<div class=\"warning\">\n\t$error\n</div>\n";
            return $error;

        return false;

    function save_file() {
        if (!current_user_can('edit_theme_options'))
            wp_die(__('Easy there, homey. You don&#8217;t have admin privileges to access theme options.', 'wpcfe'));

        $custom_editor = new wpcfe_custom_editor;

        if (isset($_POST['custom_file_submit'])) {
            check_admin_referer('wpcfe-custom-file', '_wpnonce-wpcfe-custom-file');
            $contents = stripslashes($_POST['newcontent']); // Get new custom content
            $file = $_POST['file']; // Which file?
            $allowed_files = $custom_editor->get_custom_files(); // Get list of allowed files

            if (!in_array($file, $allowed_files)) // Is the file allowed? If not, get outta here!
                wp_die(__('You have attempted to modify an ineligible file. Only files within the <code>/'.WPCFE_CUSTOM_FOLDER.'</code> folder may be modified via this interface. Thank you.', 'wpcfe'));

            $file_open = fopen(WPCFE_CUSTOM_FOLDER . '/' . $file, 'w+'); // Open the file

            if ($file_open !== false) // If possible, write new custom file
                fwrite($file_open, $contents);

            fclose($file_open); // Close the file
            $updated = '&updated=true'; // Display updated message
        elseif (isset($_POST['custom_file_jump'])) {
            check_admin_referer('wpcfe-custom-file-jump', '_wpnonce-wpcfe-custom-file-jump');
            $file = $_POST['custom_files'];
            $updated = '';


    function options_page() {
        global $wpcfe_site, $custom_files_array;

        $custom_editor = new wpcfe_custom_editor($custom_files_array);

<div id="wpcfe_options" class="wrap<?php if (get_bloginfo('text_direction') == 'rtl') { echo ' rtl'; } ?>">



    // Determine which file we're editing. Default to something harmless, like custom.css.
    $file = ($_GET['file']) ? $_GET['file'] : 'custom.css';
    $files = $custom_editor->get_custom_files();
    $extension = substr($file, strrpos($file, '.'));

    // Determine if the custom file exists and is writable. Otherwise, this page is useless.
    $error = $custom_editor->is_custom_writable($file, $files);

    if ($error)
        echo $error;
    else {
        // Get contents of custom.css
        if (filesize(WPCFE_CUSTOM_FOLDER . '/' . $file) > 0) {
            $content = fopen(WPCFE_CUSTOM_FOLDER . '/' . $file, 'r');
            $content = fread($content, filesize(WPCFE_CUSTOM_FOLDER . '/' . $file));
            $content = htmlspecialchars($content);
            $content = '';
    <div class="one_col">
        <form method="post" id="file-jump" name="file-jump" action="<?php echo admin_url('admin-post.php?action=wpcfe_file_editor'); ?>">
            <h3><?php printf(__('Currently editing: <code>%s</code>', 'wpcfe'), "$file"); ?></h3>
                <select id="custom_files" name="custom_files">
                    <option value="<?php echo $file; ?>"><?php echo $file; ?></option>
        foreach ($files as $f) // An option for each available file
            if ($f != $file) echo "\t\t\t\t\t<option value=\"$f\">$f</option>\n";
                <?php wp_nonce_field('wpcfe-custom-file-jump', '_wpnonce-wpcfe-custom-file-jump'); ?>
                <input type="submit" id="custom_file_jump" class="button" name="custom_file_jump" value="<?php _e('Edit selected file', 'wpcfe'); ?>" />
        if ($extension == '.php')
            echo "\t\t\t<p class=\"alert\">" . __('<strong>Note:</strong> If you make a mistake in your code while modifying a <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> file, saving this page <em>may</em> result your site becoming temporarily unusable. Prior to editing such files, be sure to have access to the file via <acronym title="File Transfer Protocol">FTP</acronym> or other means so that you can correct the error.', 'wpcfe') . "</p>\n";
        <form class="file_editor" method="post" id="template" name="template" action="<?php echo admin_url('admin-post.php?action=wpcfe_file_editor'); ?>">
            <input type="hidden" id="file" name="file" value="<?php echo $file; ?>" />
            <p><textarea id="newcontent" name="newcontent" rows="25" cols="50" class="large-text"><?php echo $content; ?></textarea></p>
                <?php wp_nonce_field('wpcfe-custom-file', '_wpnonce-wpcfe-custom-file'); ?>
                <input type="submit" class="button-primary" id="submit" name="custom_file_submit" value="<?php _e('Save changes', 'wpcfe'); ?>" />


// Update message after saving the changes
function wpcfe_options_status_check($depth = 1) {
    $indent = str_repeat("\t", $depth);

    if ($_GET['updated']) {
        echo "$indent<div id=\"updated\" class=\"updated fade\">\n";
        echo "$indent\t<p>" . __('Options updated!', 'wpcfe') . ' <a href="' . get_bloginfo('url') . '/">' . __('Check out your site &rarr;', 'wpcfe') . "</a></p>\n";
        echo "$indent</div>\n";


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.