2004-11-16 22:15:44 -05:00
< ? php
2008-08-16 03:27:34 -04:00
/**
* Edit plugin editor administration panel .
*
* @ package WordPress
* @ subpackage Administration
*/
/** WordPress Administration Bootstrap */
2004-11-16 22:15:44 -05:00
require_once ( 'admin.php' );
2006-11-18 02:31:29 -05:00
2009-08-08 03:22:19 -04: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 02:31:29 -05:00
$title = __ ( " Edit Plugins " );
$parent_file = 'plugins.php' ;
2009-02-22 15:05:11 -05:00
wp_reset_vars ( array ( 'action' , 'redirect' , 'profile' , 'error' , 'warning' , 'a' , 'file' , 'plugin' ));
2004-11-16 22:15:44 -05:00
2008-05-21 20:06:41 -04:00
wp_admin_css ( 'theme-editor' );
2008-02-21 22:06:35 -05:00
2004-11-27 19:33:04 -05:00
$plugins = get_plugins ();
2009-02-22 15:05:11 -05:00
2009-05-31 20:01:33 -04:00
if ( isset ( $_REQUEST [ 'file' ]) )
2009-12-01 17:03:13 -05:00
$plugin = stripslashes ( $_REQUEST [ 'file' ]);
2009-04-06 13:27:36 -04:00
2009-02-22 15:05:11 -05:00
if ( empty ( $plugin ) ) {
$plugin = array_keys ( $plugins );
$plugin = $plugin [ 0 ];
}
$plugin_files = get_plugin_files ( $plugin );
2004-11-16 22:15:44 -05:00
2009-04-06 13:27:36 -04:00
if ( empty ( $file ) )
2004-11-16 22:15:44 -05:00
$file = $plugin_files [ 0 ];
2009-12-01 17:03:13 -05:00
else
$file = stripslashes ( $file );
2004-11-16 22:15:44 -05:00
$file = validate_file_to_edit ( $file , $plugin_files );
2008-05-27 13:55:24 -04:00
$real_file = WP_PLUGIN_DIR . '/' . $file ;
2009-08-08 03:22:19 -04:00
$scrollto = isset ( $_REQUEST [ 'scrollto' ]) ? ( int ) $_REQUEST [ 'scrollto' ] : 0 ;
2004-11-16 22:15:44 -05:00
2009-04-06 13:27:36 -04:00
switch ( $action ) {
2004-11-16 22:15:44 -05:00
case 'update' :
2006-05-26 19:08:05 -04:00
check_admin_referer ( 'edit-plugin_' . $file );
2006-03-30 18:12:54 -05:00
2004-11-16 22:15:44 -05:00
$newcontent = stripslashes ( $_POST [ 'newcontent' ]);
2008-03-26 12:14:29 -04:00
if ( is_writeable ( $real_file ) ) {
2004-11-16 22:15:44 -05:00
$f = fopen ( $real_file , 'w+' );
fwrite ( $f , $newcontent );
fclose ( $f );
2007-02-14 01:15:05 -05:00
// Deactivate so we can test it.
2008-03-26 12:14:29 -04:00
if ( is_plugin_active ( $file ) || isset ( $_POST [ 'phperror' ]) ) {
if ( is_plugin_active ( $file ) )
deactivate_plugins ( $file , true );
2009-08-08 03:22:19 -04: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 12:14:29 -04:00
exit ;
2007-02-14 01:15:05 -05:00
}
2009-08-08 03:22:19 -04:00
wp_redirect ( " plugin-editor.php?file= $file &a=te&scrollto= $scrollto " );
2004-11-16 22:15:44 -05:00
} else {
2009-08-08 03:22:19 -04:00
wp_redirect ( " plugin-editor.php?file= $file &scrollto= $scrollto " );
2004-11-16 22:15:44 -05:00
}
2008-03-26 12:14:29 -04:00
exit ;
2004-11-16 22:15:44 -05:00
break ;
default :
2006-02-12 02:53:23 -05:00
2008-03-26 12:14:29 -04:00
if ( isset ( $_GET [ 'liveupdate' ]) ) {
2007-02-14 01:15:05 -05:00
check_admin_referer ( 'edit-plugin-test_' . $file );
2008-03-26 12:14:29 -04:00
$error = validate_plugin ( $file );
2009-04-06 13:27:36 -04:00
if ( is_wp_error ( $error ) )
2008-03-26 12:14:29 -04:00
wp_die ( $error );
if ( ! is_plugin_active ( $file ) )
2009-04-06 13:27:36 -04: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 12:14:29 -04:00
2009-08-08 03:22:19 -04:00
wp_redirect ( " plugin-editor.php?file= $file &a=te&scrollto= $scrollto " );
2008-03-26 12:14:29 -04:00
exit ;
2007-02-14 01:15:05 -05:00
}
2009-04-06 13:27:36 -04:00
// List of allowable extensions
$editable_extensions = array ( 'php' , 'txt' , 'text' , 'js' , 'css' , 'html' , 'htm' , 'xml' , 'inc' , 'include' );
2009-05-06 00:08:13 -04:00
$editable_extensions = ( array ) apply_filters ( 'editable_extensions' , $editable_extensions );
2009-04-06 13:27:36 -04:00
if ( ! is_file ( $real_file ) ) {
2009-05-06 00:08:13 -04:00
wp_die ( sprintf ( '<p>%s</p>' , __ ( 'No such file exists! Double check the name and try again.' )));
2009-04-06 13:27:36 -04: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 00:08:13 -04:00
wp_die ( sprintf ( '<p>%s</p>' , __ ( 'Files of this type are not editable.' )));
2009-04-06 13:27:36 -04:00
}
}
2009-05-24 19:47:49 -04:00
2009-05-06 00:08:13 -04:00
require_once ( 'admin-header.php' );
2009-05-24 19:47:49 -04:00
2009-05-06 00:08:13 -04:00
update_recently_edited ( WP_PLUGIN_DIR . '/' . $file );
2006-02-12 02:53:23 -05:00
2009-05-06 00:08:13 -04:00
$content = file_get_contents ( $real_file );
2009-03-06 11:17:57 -05:00
2009-05-06 00:08:13 -04:00
if ( '.php' == substr ( $real_file , strrpos ( $real_file , '.' ) ) ) {
$functions = wp_doc_link_parse ( $content );
2009-03-06 11:17:57 -05:00
2009-06-29 16:48:12 -04: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 15:00:09 -05:00
}
}
2004-11-16 22:15:44 -05:00
2009-05-06 00:08:13 -04:00
$content = htmlspecialchars ( $content );
$codepress_lang = codepress_get_lang ( $real_file );
2004-11-16 22:15:44 -05:00
?>
< ? php if ( isset ( $_GET [ 'a' ])) : ?>
2009-12-26 04:00:58 -05:00
< div id = " message " class = " updated " >< p >< ? php _e ( 'File edited successfully.' ) ?> </p></div>
2007-02-14 01:15:05 -05:00
< ? php elseif ( isset ( $_GET [ 'phperror' ])) : ?>
2009-12-26 04:00:58 -05: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 12:14:29 -04:00
< ? php
if ( wp_verify_nonce ( $_GET [ '_error_nonce' ], 'plugin-activation-error_' . $file ) ) { ?>
2009-05-05 15:43:53 -04: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 12:14:29 -04:00
< ? php } ?>
</ div >
2004-11-16 22:15:44 -05:00
< ? php endif ; ?>
2008-09-08 02:01:33 -04:00
< div class = " wrap " >
2008-11-26 08:51:25 -05:00
< ? php screen_icon (); ?>
2009-05-18 11:11:07 -04:00
< h2 >< ? php echo esc_html ( $title ); ?> </h2>
2009-06-26 07:07:10 -04: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 00:08:13 -04:00
< strong >< label for = " plugin " >< ? php _e ( 'Select plugin to edit:' ); ?> </label></strong>
2009-02-22 15:05:11 -05:00
< select name = " plugin " id = " plugin " >
< ? php
2009-04-06 13:27:36 -04: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 15:43:53 -04:00
$plugin_name = esc_attr ( $plugin_name );
$plugin_key = esc_attr ( $plugin_key );
2009-04-06 13:27:36 -04:00
echo " \n \t <option value= \" $plugin_key\ " $selected > $plugin_name </ option > " ;
}
2009-02-22 15:05:11 -05:00
?>
</ select >
2009-05-05 15:43:53 -04:00
< input type = " submit " name = " Submit " value = " <?php esc_attr_e('Select') ?> " class = " button " />
2009-02-22 15:05:11 -05:00
</ form >
</ div >
2008-03-14 19:58:31 -04:00
< br class = " clear " />
2008-02-21 22:06:35 -05:00
</ div >
2009-06-26 07:07:10 -04:00
< div id = " templateside " >
< h3 >< ? php _e ( 'Plugin Files' ); ?> </h3>
2004-11-16 22:15:44 -05:00
2006-11-19 02:56:05 -05:00
< ul >
2009-04-06 13:27:36 -04: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 00:08:13 -04: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-21 22:06:35 -05:00
< ? php endforeach ; ?>
2006-11-19 02:56:05 -05:00
</ ul >
2009-06-26 07:07:10 -04:00
</ div >
< form name = " template " id = " template " action = " plugin-editor.php " method = " post " >
2006-11-19 02:56:05 -05:00
< ? php wp_nonce_field ( 'edit-plugin_' . $file ) ?>
2009-02-20 21:12:00 -05: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 02:56:05 -05:00
< input type = " hidden " name = " action " value = " update " />
2009-05-05 15:43:53 -04: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 03:22:19 -04:00
< input type = " hidden " name = " scrollto " id = " scrollto " value = " <?php echo $scrollto ; ?> " />
2004-11-16 22:15:44 -05:00
</ div >
2009-06-29 16:48:12 -04:00
< ? php if ( ! empty ( $docs_select ) ) : ?>
2009-05-06 00:08:13 -04: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 15:00:09 -05:00
< ? php endif ; ?>
2004-11-16 22:15:44 -05:00
< ? php if ( is_writeable ( $real_file ) ) : ?>
2010-01-26 13:39:12 -05:00
< ? php if ( in_array ( $file , ( array ) get_option ( 'active_plugins' , array () ) ) ) { ?>
2007-02-14 01:15:05 -05: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 02:56:05 -05:00
< p class = " submit " >
< ? php
2007-02-14 01:15:05 -05:00
if ( isset ( $_GET [ 'phperror' ]) )
2009-05-05 15:43:53 -04: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 01:15:05 -05:00
else
2009-05-05 15:43:53 -04:00
echo " <input type='submit' name='submit' class='button-primary' value=' " . esc_attr__ ( 'Update File' ) . " ' tabindex='2' /> " ;
2006-11-19 02:56:05 -05:00
?>
</ p >
2004-11-16 22:15:44 -05:00
< ? php else : ?>
2008-02-13 18:58:23 -05: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-16 22:15:44 -05:00
< ? php endif ; ?>
2009-06-26 07:07:10 -04:00
</ form >
< br class = " clear " />
2006-11-19 02:56:05 -05:00
</ div >
2009-08-08 03:22:19 -04:00
< script type = " text/javascript " >
/* <![CDATA[ */
jQuery ( document ) . ready ( function ( $ ){
$ ( '#template' ) . submit ( function (){ $ ( '#scrollto' ) . val ( $ ( '#newcontent' ) . scrollTop () ); });
$ ( '#newcontent' ) . scrollTop ( $ ( '#scrollto' ) . val () );
});
/* ]]> */
</ script >
2004-11-16 22:15:44 -05:00
< ? php
2008-03-26 12:14:29 -04:00
break ;
2004-11-16 22:15:44 -05:00
}
2009-06-26 07:07:10 -04:00
include ( " admin-footer.php " );