2004-11-17 03:15:44 +00:00
<? php
2008-08-16 07:27:34 +00:00
/**
* Edit plugin editor administration panel.
*
* @package WordPress
* @subpackage Administration
*/
/** WordPress Administration Bootstrap */
2010-04-18 06:14:45 +00:00
require_once ( './admin.php' );
2006-11-18 07:31:29 +00:00
2009-08-08 07:22:19 +00:00
if ( ! current_user_can ( 'edit_plugins' ) )
wp_die ( '<p>' . __ ( 'You do not have sufficient permissions to edit plugins for this blog.' ) . '</p>' );
2006-11-18 07:31:29 +00:00
$title = __ ( "Edit Plugins" );
$parent_file = 'plugins.php' ;
2009-02-22 20:05:11 +00:00
wp_reset_vars ( array ( 'action' , 'redirect' , 'profile' , 'error' , 'warning' , 'a' , 'file' , 'plugin' ));
2004-11-17 03:15:44 +00:00
2008-05-22 00:06:41 +00:00
wp_admin_css ( 'theme-editor' );
2008-02-22 03:06:35 +00:00
2004-11-28 00:33:04 +00:00
$plugins = get_plugins ();
2009-02-22 20:05:11 +00:00
2009-06-01 00:01:33 +00:00
if ( isset ( $_REQUEST [ 'file' ]) )
2009-12-01 22:03:13 +00:00
$plugin = stripslashes ( $_REQUEST [ 'file' ]);
2009-04-06 17:27:36 +00:00
2009-02-22 20:05:11 +00:00
if ( empty ( $plugin ) ) {
$plugin = array_keys ( $plugins );
$plugin = $plugin [ 0 ];
}
$plugin_files = get_plugin_files ( $plugin );
2004-11-17 03:15:44 +00:00
2009-04-06 17:27:36 +00:00
if ( empty ( $file ) )
2004-11-17 03:15:44 +00:00
$file = $plugin_files [ 0 ];
2009-12-01 22:03:13 +00:00
else
$file = stripslashes ( $file );
2004-11-17 03:15:44 +00:00
$file = validate_file_to_edit ( $file , $plugin_files );
2008-05-27 17:55:24 +00:00
$real_file = WP_PLUGIN_DIR . '/' . $file ;
2009-08-08 07:22:19 +00:00
$scrollto = isset ( $_REQUEST [ 'scrollto' ]) ? ( int ) $_REQUEST [ 'scrollto' ] : 0 ;
2004-11-17 03:15:44 +00:00
2009-04-06 17:27:36 +00:00
switch ( $action ) {
2004-11-17 03:15:44 +00:00
case 'update' :
2006-05-26 23:08:05 +00:00
check_admin_referer ( 'edit-plugin_' . $file );
2006-03-30 23:12:54 +00:00
2004-11-17 03:15:44 +00:00
$newcontent = stripslashes ( $_POST [ 'newcontent' ]);
2008-03-26 16:14:29 +00:00
if ( is_writeable ( $real_file ) ) {
2004-11-17 03:15:44 +00:00
$f = fopen ( $real_file , 'w+' );
fwrite ( $f , $newcontent );
fclose ( $f );
2007-02-14 06:15:05 +00:00
// Deactivate so we can test it.
2008-03-26 16:14:29 +00:00
if ( is_plugin_active ( $file ) || isset ( $_POST [ 'phperror' ]) ) {
if ( is_plugin_active ( $file ) )
deactivate_plugins ( $file , true );
2010-03-28 03:28:52 +00:00
update_option ( 'recently_activated' , array ( $file => time ()) + ( array ) get_option ( 'recently_activated' ));
2009-08-08 07:22:19 +00:00
wp_redirect ( add_query_arg ( '_wpnonce' , wp_create_nonce ( 'edit-plugin-test_' . $file ), "plugin-editor.php?file= $file &liveupdate=1&scrollto= $scrollto " ));
2008-03-26 16:14:29 +00:00
exit ;
2007-02-14 06:15:05 +00:00
}
2009-08-08 07:22:19 +00:00
wp_redirect ( "plugin-editor.php?file= $file &a=te&scrollto= $scrollto " );
2004-11-17 03:15:44 +00:00
} else {
2009-08-08 07:22:19 +00:00
wp_redirect ( "plugin-editor.php?file= $file &scrollto= $scrollto " );
2004-11-17 03:15:44 +00:00
}
2008-03-26 16:14:29 +00:00
exit ;
2004-11-17 03:15:44 +00:00
break ;
default :
2006-02-12 07:53:23 +00:00
2008-03-26 16:14:29 +00:00
if ( isset ( $_GET [ 'liveupdate' ]) ) {
2007-02-14 06:15:05 +00:00
check_admin_referer ( 'edit-plugin-test_' . $file );
2008-03-26 16:14:29 +00:00
$error = validate_plugin ( $file );
2009-04-06 17:27:36 +00:00
if ( is_wp_error ( $error ) )
2008-03-26 16:14:29 +00:00
wp_die ( $error );
if ( ! is_plugin_active ( $file ) )
2009-04-06 17:27:36 +00:00
activate_plugin ( $file , "plugin-editor.php?file= $file &phperror=1" ); // we'll override this later if the plugin can be included without fatal error
2008-03-26 16:14:29 +00:00
2009-08-08 07:22:19 +00:00
wp_redirect ( "plugin-editor.php?file= $file &a=te&scrollto= $scrollto " );
2008-03-26 16:14:29 +00:00
exit ;
2007-02-14 06:15:05 +00:00
}
2009-04-06 17:27:36 +00:00
// List of allowable extensions
$editable_extensions = array ( 'php' , 'txt' , 'text' , 'js' , 'css' , 'html' , 'htm' , 'xml' , 'inc' , 'include' );
2009-05-06 04:08:13 +00:00
$editable_extensions = ( array ) apply_filters ( 'editable_extensions' , $editable_extensions );
2009-04-06 17:27:36 +00:00
if ( ! is_file ( $real_file ) ) {
2009-05-06 04:08:13 +00:00
wp_die ( sprintf ( '<p>%s</p>' , __ ( 'No such file exists! Double check the name and try again.' )));
2009-04-06 17:27:36 +00:00
} else {
// Get the extension of the file
if ( preg_match ( '/\.([^.]+)$/' , $real_file , $matches ) ) {
$ext = strtolower ( $matches [ 1 ]);
// If extension is not in the acceptable list, skip it
if ( ! in_array ( $ext , $editable_extensions ) )
2009-05-06 04:08:13 +00:00
wp_die ( sprintf ( '<p>%s</p>' , __ ( 'Files of this type are not editable.' )));
2009-04-06 17:27:36 +00:00
}
}
2009-05-24 23:47:49 +00:00
2010-04-18 06:14:45 +00:00
require_once ( './admin-header.php' );
2009-05-24 23:47:49 +00:00
2009-05-06 04:08:13 +00:00
update_recently_edited ( WP_PLUGIN_DIR . '/' . $file );
2006-02-12 07:53:23 +00:00
2009-05-06 04:08:13 +00:00
$content = file_get_contents ( $real_file );
2009-03-06 16:17:57 +00:00
2009-05-06 04:08:13 +00:00
if ( '.php' == substr ( $real_file , strrpos ( $real_file , '.' ) ) ) {
$functions = wp_doc_link_parse ( $content );
2009-03-06 16:17:57 +00:00
2009-06-29 20:48:12 +00:00
if ( ! empty ( $functions ) ) {
$docs_select = '<select name="docs-list" id="docs-list">' ;
$docs_select .= '<option value="">' . __ ( 'Function Name...' ) . '</option>' ;
foreach ( $functions as $function ) {
$docs_select .= '<option value="' . esc_attr ( $function ) . '">' . htmlspecialchars ( $function ) . '()</option>' ;
}
$docs_select .= '</select>' ;
2009-02-20 20:00:09 +00:00
}
}
2004-11-17 03:15:44 +00:00
2009-05-06 04:08:13 +00:00
$content = htmlspecialchars ( $content );
$codepress_lang = codepress_get_lang ( $real_file );
2004-11-17 03:15:44 +00:00
?>
<?php if (isset($_GET['a'])) : ?>
2009-12-26 09:00:58 +00:00
<div id="message" class="updated"><p><?php _e('File edited successfully.') ?></p></div>
2007-02-14 06:15:05 +00:00
<?php elseif (isset($_GET['phperror'])) : ?>
2009-12-26 09:00:58 +00:00
<div id="message" class="updated"><p><?php _e('This plugin has been deactivated because your changes resulted in a <strong>fatal error</strong>.') ?></p>
2008-03-26 16:14:29 +00:00
<?php
if ( wp_verify_nonce($_GET['_error_nonce'], 'plugin-activation-error_' . $file) ) { ?>
2009-05-05 19:43:53 +00:00
<iframe style="border:0" width="100%" height="70px" src="<?php bloginfo('wpurl'); ?>/wp-admin/plugins.php?action=error_scrape&plugin=<?php echo esc_attr($file); ?>&_wpnonce=<?php echo esc_attr($_GET['_error_nonce']); ?>"></iframe>
2008-03-26 16:14:29 +00:00
<?php } ?>
</div>
2004-11-17 03:15:44 +00:00
<?php endif; ?>
2008-09-08 06:01:33 +00:00
<div class="wrap">
2008-11-26 13:51:25 +00:00
<?php screen_icon(); ?>
2009-05-18 15:11:07 +00:00
<h2><?php echo esc_html( $title ); ?></h2>
2009-06-26 11:07:10 +00:00
<div class="fileedit-sub">
<div class="alignleft">
<big><?php
if ( is_plugin_active($plugin) ) {
if ( is_writeable($real_file) )
echo sprintf(__('Editing <strong>%s</strong> (active)'), $file);
else
echo sprintf(__('Browsing <strong>%s</strong> (active)'), $file);
} else {
if ( is_writeable($real_file) )
echo sprintf(__('Editing <strong>%s</strong> (inactive)'), $file);
else
echo sprintf(__('Browsing <strong>%s</strong> (inactive)'), $file);
}
?></big>
</div>
<div class="alignright">
<form action="plugin-editor.php" method="post">
2009-05-06 04:08:13 +00:00
<strong><label for="plugin"><?php _e('Select plugin to edit:'); ?> </label></strong>
2009-02-22 20:05:11 +00:00
<select name="plugin" id="plugin">
<?php
2009-04-06 17:27:36 +00:00
foreach ( $plugins as $plugin_key => $a_plugin ) {
$plugin_name = $a_plugin['Name'];
if ( $plugin_key == $plugin )
$selected = " selected='selected'";
else
$selected = '';
2009-05-05 19:43:53 +00:00
$plugin_name = esc_attr($plugin_name);
$plugin_key = esc_attr($plugin_key);
2009-04-06 17:27:36 +00:00
echo "\n\t<option value=\"$plugin_key\" $selected>$plugin_name</option>";
}
2009-02-22 20:05:11 +00:00
?>
</select>
2009-05-05 19:43:53 +00:00
<input type="submit" name="Submit" value="<?php esc_attr_e('Select') ?>" class="button" />
2009-02-22 20:05:11 +00:00
</form>
</div>
2008-03-14 23:58:31 +00:00
<br class="clear" />
2008-02-22 03:06:35 +00:00
</div>
2009-06-26 11:07:10 +00:00
<div id="templateside">
<h3><?php _e('Plugin Files'); ?></h3>
2004-11-17 03:15:44 +00:00
2006-11-19 07:56:05 +00:00
<ul>
2009-04-06 17:27:36 +00:00
<?php
foreach ( $plugin_files as $plugin_file ) :
// Get the extension of the file
if ( preg_match('/\.([^.]+)$/', $plugin_file, $matches) ) {
$ext = strtolower($matches[1]);
// If extension is not in the acceptable list, skip it
if ( !in_array( $ext, $editable_extensions ) )
continue;
} else {
// No extension found
continue;
}
?>
2009-05-06 04:08:13 +00:00
<li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo $plugin_file; ?>&plugin=<?php echo $plugin; ?>"><?php echo $plugin_file ?></a></li>
2008-02-22 03:06:35 +00:00
<?php endforeach; ?>
2006-11-19 07:56:05 +00:00
</ul>
2009-06-26 11:07:10 +00:00
</div>
<form name="template" id="template" action="plugin-editor.php" method="post">
2006-11-19 07:56:05 +00:00
<?php wp_nonce_field('edit-plugin_' . $file) ?>
2009-02-21 02:12:00 +00:00
<div><textarea cols="70" rows="25" name="newcontent" id="newcontent" tabindex="1" class="codepress <?php echo $codepress_lang ?>"><?php echo $content ?></textarea>
2006-11-19 07:56:05 +00:00
<input type="hidden" name="action" value="update" />
2009-05-05 19:43:53 +00:00
<input type="hidden" name="file" value="<?php echo esc_attr($file) ?>" />
<input type="hidden" name="plugin" value="<?php echo esc_attr($plugin) ?>" />
2009-08-08 07:22:19 +00:00
<input type="hidden" name="scrollto" id="scrollto" value="<?php echo $scrollto; ?>" />
2004-11-17 03:15:44 +00:00
</div>
2009-06-29 20:48:12 +00:00
<?php if ( !empty( $docs_select ) ) : ?>
2009-05-06 04:08:13 +00:00
<div id="documentation"><label for="docs-list"><?php _e('Documentation:') ?></label> <?php echo $docs_select ?> <input type="button" class="button" value="<?php esc_attr_e( 'Lookup' ) ?> " onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'http://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&locale=<?php echo urlencode( get_locale() ) ?>&version=<?php echo urlencode( $wp_version ) ?>&redirect=true'); }" /></div>
2009-02-20 20:00:09 +00:00
<?php endif; ?>
2004-11-17 03:15:44 +00:00
<?php if ( is_writeable($real_file) ) : ?>
2010-01-26 18:39:12 +00:00
<?php if ( in_array( $file, (array) get_option( 'active_plugins', array() ) ) ) { ?>
2007-02-14 06:15:05 +00:00
<p><?php _e('<strong>Warning:</strong> Making changes to active plugins is not recommended. If your changes cause a fatal error, the plugin will be automatically deactivated.'); ?></p>
<?php } ?>
2006-11-19 07:56:05 +00:00
<p class="submit">
<?php
2007-02-14 06:15:05 +00:00
if ( isset($_GET['phperror']) )
2009-05-05 19:43:53 +00:00
echo "<input type='hidden' name='phperror' value='1' /><input type='submit' name='submit' class='button-primary' value='" . esc_attr__('Update File and Attempt to Reactivate') . "' tabindex='2' />";
2007-02-14 06:15:05 +00:00
else
2009-05-05 19:43:53 +00:00
echo "<input type='submit' name='submit' class='button-primary' value='" . esc_attr__('Update File') . "' tabindex='2' />";
2006-11-19 07:56:05 +00:00
?>
</p>
2004-11-17 03:15:44 +00:00
<?php else : ?>
2008-02-13 23:58:23 +00:00
<p><em><?php _e('You need to make this file writable before you can save your changes. See <a href="http://codex.wordpress.org/Changing_File_Permissions">the Codex</a> for more information.'); ?></em></p>
2004-11-17 03:15:44 +00:00
<?php endif; ?>
2009-06-26 11:07:10 +00:00
</form>
<br class="clear" />
2006-11-19 07:56:05 +00:00
</div>
2009-08-08 07:22:19 +00:00
<script type="text/javascript">
/* <![CDATA[ */
jQuery(document).ready(function($){
$('#template').submit(function(){ $('#scrollto').val( $('#newcontent').scrollTop() ); });
2010-02-18 05:14:48 +00:00
$('#newcontent').scrollTop( $('#scrollto').val() );
2009-08-08 07:22:19 +00:00
});
/* ]]> */
</script>
2004-11-17 03:15:44 +00:00
<?php
2008-03-26 16:14:29 +00:00
break;
2004-11-17 03:15:44 +00:00
}
2010-04-18 06:14:45 +00:00
include("./admin-footer.php");