Version Description
- Fixed the updater's cron hook not being removed when the plugin is deactivated.
- Fixed updates not showing up in some situations.
- Fixed the "Feedback" button not responding to mouse clicks in some browsers.
- Fixed "Feedback" button style to be consistent with other WP screen meta buttons.
- Enforce the custom menu order by using the 'menu_order' filter. Fixes Jetpack menu not staying put.
- You can now copy/paste as many menu separators as you like without worrying about some of them mysteriously disappearing on save.
- Fixed a long-standing copying related bug where copied menus would all still refer to the same JS object instance.
- Added ALT attributes to the toolbar icon images.
- Removed the "Custom" checkbox. In retrospect, all it did was confuse people.
- Made it impossible to edit separator properties.
- Removed the deprecated "level_X" capabilities from the "Required capability" dropdown. You can still type them in manually if you want.
Download this release
Release Info
| Developer | whiteshadow |
| Plugin | |
| Version | 1.1.4 |
| Comparing to | |
| See all releases | |
Code changes from version 1.1.3 to 1.1.4
- css/menu-editor.css +19 -7
- includes/menu-editor-core.php +93 -57
- js/menu-editor.js +37 -27
- menu-editor.php +1 -1
- readme.txt +15 -2
css/menu-editor.css
CHANGED
|
@@ -558,16 +558,27 @@ a.ws_button:hover {
|
|
| 558 |
float: right;
|
| 559 |
height: 22px;
|
| 560 |
padding: 0;
|
| 561 |
-
margin: 0
|
| 562 |
-
font-family:
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
border-bottom-left-radius: 3px;
|
| 566 |
-
border-bottom-right-radius: 3px;
|
| 567 |
-moz-border-radius-bottomleft: 3px;
|
| 568 |
-moz-border-radius-bottomright: 3px;
|
| 569 |
-webkit-border-bottom-left-radius: 3px;
|
| 570 |
-webkit-border-bottom-right-radius: 3px;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 571 |
}
|
| 572 |
|
| 573 |
#ws-ame-feedback-widget-wrap a.show-settings,
|
|
@@ -578,7 +589,8 @@ a.ws_button:hover {
|
|
| 578 |
|
| 579 |
/* "Upgrade to Pro" */
|
| 580 |
#ws-pro-version-notice {
|
| 581 |
-
background-color: #00C31F;
|
|
|
|
| 582 |
}
|
| 583 |
|
| 584 |
|
| 558 |
float: right;
|
| 559 |
height: 22px;
|
| 560 |
padding: 0;
|
| 561 |
+
margin: 0 0 0 6px;
|
| 562 |
+
font-family: sans-serif;
|
| 563 |
+
|
|
|
|
|
|
|
|
|
|
| 564 |
-moz-border-radius-bottomleft: 3px;
|
| 565 |
-moz-border-radius-bottomright: 3px;
|
| 566 |
-webkit-border-bottom-left-radius: 3px;
|
| 567 |
-webkit-border-bottom-right-radius: 3px;
|
| 568 |
+
border-bottom-left-radius: 3px;
|
| 569 |
+
border-bottom-right-radius: 3px;
|
| 570 |
+
|
| 571 |
+
background: #e3e3e3;
|
| 572 |
+
|
| 573 |
+
border-right: 1px solid transparent;
|
| 574 |
+
border-left: 1px solid transparent;
|
| 575 |
+
border-bottom: 1px solid transparent;
|
| 576 |
+
background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */
|
| 577 |
+
background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */
|
| 578 |
+
background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */
|
| 579 |
+
background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */
|
| 580 |
+
background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */
|
| 581 |
+
background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */
|
| 582 |
}
|
| 583 |
|
| 584 |
#ws-ame-feedback-widget-wrap a.show-settings,
|
| 589 |
|
| 590 |
/* "Upgrade to Pro" */
|
| 591 |
#ws-pro-version-notice {
|
| 592 |
+
background-color: #00C31F;
|
| 593 |
+
background-image: none;
|
| 594 |
}
|
| 595 |
|
| 596 |
|
includes/menu-editor-core.php
CHANGED
|
@@ -226,6 +226,32 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 226 |
$this->filter_menu();
|
| 227 |
}
|
| 228 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
|
| 230 |
/**
|
| 231 |
* Determine if the current user may use the menu editor.
|
|
@@ -842,46 +868,46 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 842 |
$action = isset($post['action'])?$post['action']:(isset($get['action'])?$get['action']:'');
|
| 843 |
do_action('admin_menu_editor_header', $action);
|
| 844 |
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 854 |
}
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
if ( !empty($item['access_level']) && !current_user_can($item['access_level']) ){
|
| 862 |
-
$item['access_level'] = null;
|
| 863 |
-
$data['options-general.php']['items']['menu_editor'] = $item;
|
| 864 |
-
}
|
| 865 |
-
}
|
| 866 |
-
|
| 867 |
-
//Save the custom menu
|
| 868 |
-
$this->options['custom_menu'] = $data;
|
| 869 |
-
$this->save_options();
|
| 870 |
-
//Redirect back to the editor and display the success message
|
| 871 |
-
wp_redirect( add_query_arg('message', 1, $url) );
|
| 872 |
-
} else {
|
| 873 |
-
//Or redirect & display the error message
|
| 874 |
-
wp_redirect( add_query_arg('message', 2, $url) );
|
| 875 |
}
|
| 876 |
-
die();
|
| 877 |
-
}
|
| 878 |
-
|
| 879 |
-
//Attach a "Feedback" link to the screen meta panel.
|
| 880 |
-
$this->print_uservoice_widget();
|
| 881 |
-
//Kindly remind the user to give me money
|
| 882 |
-
if ( !apply_filters('admin_menu_editor_is_pro', false) ){
|
| 883 |
-
$this->print_upgrade_notice();
|
| 884 |
-
}
|
| 885 |
?>
|
| 886 |
<div class="wrap">
|
| 887 |
<h2>
|
|
@@ -918,6 +944,14 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 918 |
|
| 919 |
//Create a list of all known capabilities and roles. Used for the dropdown list on the access field.
|
| 920 |
$all_capabilities = $this->get_all_capabilities();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 921 |
$all_capabilities = array_keys($all_capabilities);
|
| 922 |
natcasesort($all_capabilities);
|
| 923 |
|
|
@@ -932,19 +966,19 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 932 |
<div class='ws_main_container'>
|
| 933 |
<div class='ws_toolbar'>
|
| 934 |
<div class="ws_button_container">
|
| 935 |
-
<a id='ws_cut_menu' class='ws_button' href='javascript:void(0)' title='Cut'><img src='<?php echo $images_url; ?>/cut.png' /></a>
|
| 936 |
-
<a id='ws_copy_menu' class='ws_button' href='javascript:void(0)' title='Copy'><img src='<?php echo $images_url; ?>/page_white_copy.png' /></a>
|
| 937 |
-
<a id='ws_paste_menu' class='ws_button' href='javascript:void(0)' title='Paste'><img src='<?php echo $images_url; ?>/page_white_paste.png' /></a>
|
| 938 |
|
| 939 |
<div class="ws_separator"> </div>
|
| 940 |
|
| 941 |
-
<a id='ws_new_menu' class='ws_button' href='javascript:void(0)' title='New menu'><img src='<?php echo $images_url; ?>/page_white_add.png' /></a>
|
| 942 |
-
<a id='ws_hide_menu' class='ws_button' href='javascript:void(0)' title='Show/Hide'><img src='<?php echo $images_url; ?>/plugin_disabled.png' /></a>
|
| 943 |
-
<a id='ws_delete_menu' class='ws_button' href='javascript:void(0)' title='Delete menu'><img src='<?php echo $images_url; ?>/page_white_delete.png' /></a>
|
| 944 |
|
| 945 |
<div class="ws_separator"> </div>
|
| 946 |
|
| 947 |
-
<a id='ws_new_separator' class='ws_button' href='javascript:void(0)' title='New separator'><img src='<?php echo $images_url; ?>/separator_add.png' /></a>
|
| 948 |
</div>
|
| 949 |
</div>
|
| 950 |
|
|
@@ -954,23 +988,23 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 954 |
<div class='ws_main_container'>
|
| 955 |
<div class='ws_toolbar'>
|
| 956 |
<div class="ws_button_container">
|
| 957 |
-
<a id='ws_cut_item' class='ws_button' href='javascript:void(0)' title='Cut'><img src='<?php echo $images_url; ?>/cut.png' /></a>
|
| 958 |
-
<a id='ws_copy_item' class='ws_button' href='javascript:void(0)' title='Copy'><img src='<?php echo $images_url; ?>/page_white_copy.png' /></a>
|
| 959 |
-
<a id='ws_paste_item' class='ws_button' href='javascript:void(0)' title='Paste'><img src='<?php echo $images_url; ?>/page_white_paste.png' /></a>
|
| 960 |
|
| 961 |
<div class="ws_separator"> </div>
|
| 962 |
|
| 963 |
-
<a id='ws_new_item' class='ws_button' href='javascript:void(0)' title='New menu item'><img src='<?php echo $images_url; ?>/page_white_add.png' /></a>
|
| 964 |
-
<a id='ws_hide_item' class='ws_button' href='javascript:void(0)' title='Show/Hide'><img src='<?php echo $images_url; ?>/plugin_disabled.png' /></a>
|
| 965 |
-
<a id='ws_delete_item' class='ws_button' href='javascript:void(0)' title='Delete menu item'><img src='<?php echo $images_url; ?>/page_white_delete.png' /></a>
|
| 966 |
|
| 967 |
<div class="ws_separator"> </div>
|
| 968 |
|
| 969 |
<a id='ws_sort_ascending' class='ws_button' href='javascript:void(0)' title='Sort ascending'>
|
| 970 |
-
<img src='<?php echo $images_url; ?>/sort_ascending.png' />
|
| 971 |
</a>
|
| 972 |
<a id='ws_sort_descending' class='ws_button' href='javascript:void(0)' title='Sort descending'>
|
| 973 |
-
<img src='<?php echo $images_url; ?>/sort_descending.png' />
|
| 974 |
</a>
|
| 975 |
</div>
|
| 976 |
</div>
|
|
@@ -998,7 +1032,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
| 998 |
</div>
|
| 999 |
|
| 1000 |
<?php
|
| 1001 |
-
//
|
| 1002 |
$capSelector = array('<select id="ws_cap_selector" class="ws_dropdown" size="10">');
|
| 1003 |
|
| 1004 |
$capSelector[] = '<optgroup label="Roles">';
|
|
@@ -1099,6 +1133,7 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
| 1099 |
* @return array Associative array with capability names as keys
|
| 1100 |
*/
|
| 1101 |
function get_all_capabilities(){
|
|
|
|
| 1102 |
global $wp_roles;
|
| 1103 |
|
| 1104 |
$capabilities = array();
|
|
@@ -1108,7 +1143,7 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
| 1108 |
}
|
| 1109 |
|
| 1110 |
//Iterate over all known roles and collect their capabilities
|
| 1111 |
-
foreach($wp_roles->roles as $
|
| 1112 |
if ( !empty($role['capabilities']) && is_array($role['capabilities']) ){ //Being defensive here
|
| 1113 |
$capabilities = array_merge($capabilities, $role['capabilities']);
|
| 1114 |
}
|
|
@@ -1134,6 +1169,7 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
| 1134 |
* @return array Associative array with role IDs as keys and role display names as values
|
| 1135 |
*/
|
| 1136 |
function get_all_roles(){
|
|
|
|
| 1137 |
global $wp_roles;
|
| 1138 |
$roles = array();
|
| 1139 |
|
|
@@ -1174,7 +1210,7 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
| 1174 |
<script type="text/javascript">
|
| 1175 |
(function($){
|
| 1176 |
$('#screen-meta-links').append(
|
| 1177 |
-
'<div id="ws-ame-feedback-widget-wrap"
|
| 1178 |
'<a href="http://feedback.w-shadow.com/forums/58572-admin-menu-editor" id="ws-ame-feedback-widget" class="show-settings" target="_blank" title="Open the user feedback forum">Feedback</a>' +
|
| 1179 |
'</div>'
|
| 1180 |
);
|
|
@@ -1193,7 +1229,7 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
| 1193 |
<script type="text/javascript">
|
| 1194 |
(function($){
|
| 1195 |
$('#screen-meta-links').append(
|
| 1196 |
-
'<div id="ws-pro-version-notice"
|
| 1197 |
'<a href="http://wpplugins.com/plugin/146/admin-menu-editor-pro" id="ws-pro-version-notice-link" class="show-settings" target="_blank" title="View Pro version details">Upgrade to Pro</a>' +
|
| 1198 |
'</div>'
|
| 1199 |
);
|
| 226 |
$this->filter_menu();
|
| 227 |
}
|
| 228 |
}
|
| 229 |
+
|
| 230 |
+
/**
|
| 231 |
+
* Activate the 'menu_order' filter.
|
| 232 |
+
*
|
| 233 |
+
* @return bool
|
| 234 |
+
*/
|
| 235 |
+
function hook_custom_menu_order(){
|
| 236 |
+
return true;
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
+
/**
|
| 240 |
+
* Override the order of the top-level menu entries.
|
| 241 |
+
*
|
| 242 |
+
* @param array $menu_order
|
| 243 |
+
* @return array
|
| 244 |
+
*/
|
| 245 |
+
function hook_menu_order($menu_order){
|
| 246 |
+
$custom_menu_order = array();
|
| 247 |
+
foreach($this->custom_menu as $topmenu){
|
| 248 |
+
$filename = $this->get_menu_field($topmenu, 'file');
|
| 249 |
+
if ( in_array($filename, $menu_order) ){
|
| 250 |
+
$custom_menu_order[] = $filename;
|
| 251 |
+
}
|
| 252 |
+
}
|
| 253 |
+
return $custom_menu_order;
|
| 254 |
+
}
|
| 255 |
|
| 256 |
/**
|
| 257 |
* Determine if the current user may use the menu editor.
|
| 868 |
$action = isset($post['action'])?$post['action']:(isset($get['action'])?$get['action']:'');
|
| 869 |
do_action('admin_menu_editor_header', $action);
|
| 870 |
|
| 871 |
+
//Handle form submissions
|
| 872 |
+
if (isset($post['data'])){
|
| 873 |
+
check_admin_referer('menu-editor-form');
|
| 874 |
+
|
| 875 |
+
//Try to decode a menu tree encoded as JSON
|
| 876 |
+
$data = $this->json_decode($post['data'], true);
|
| 877 |
+
if (!$data || (count($data) < 2) ){
|
| 878 |
+
$fixed = stripslashes($post['data']);
|
| 879 |
+
$data = $this->json_decode( $fixed, true );
|
| 880 |
+
}
|
| 881 |
+
|
| 882 |
+
$url = remove_query_arg('noheader');
|
| 883 |
+
if ($data){
|
| 884 |
+
//Ensure the user doesn't change the required capability to something they themselves don't have.
|
| 885 |
+
if ( isset($data['options-general.php']['items']['menu_editor']) ){
|
| 886 |
+
$item = $data['options-general.php']['items']['menu_editor'];
|
| 887 |
+
if ( !empty($item['access_level']) && !current_user_can($item['access_level']) ){
|
| 888 |
+
$item['access_level'] = null;
|
| 889 |
+
$data['options-general.php']['items']['menu_editor'] = $item;
|
| 890 |
+
}
|
| 891 |
+
}
|
| 892 |
+
|
| 893 |
+
//Save the custom menu
|
| 894 |
+
$this->options['custom_menu'] = $data;
|
| 895 |
+
$this->save_options();
|
| 896 |
+
//Redirect back to the editor and display the success message
|
| 897 |
+
wp_redirect( add_query_arg('message', 1, $url) );
|
| 898 |
+
} else {
|
| 899 |
+
//Or redirect & display the error message
|
| 900 |
+
wp_redirect( add_query_arg('message', 2, $url) );
|
| 901 |
+
}
|
| 902 |
+
die();
|
| 903 |
}
|
| 904 |
+
|
| 905 |
+
//Attach a "Feedback" link to the screen meta panel.
|
| 906 |
+
$this->print_uservoice_widget();
|
| 907 |
+
//Kindly remind the user to give me money
|
| 908 |
+
if ( !apply_filters('admin_menu_editor_is_pro', false) ){
|
| 909 |
+
$this->print_upgrade_notice();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 910 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 911 |
?>
|
| 912 |
<div class="wrap">
|
| 913 |
<h2>
|
| 944 |
|
| 945 |
//Create a list of all known capabilities and roles. Used for the dropdown list on the access field.
|
| 946 |
$all_capabilities = $this->get_all_capabilities();
|
| 947 |
+
//"level_X" capabilities are deprecated so we don't want people using them.
|
| 948 |
+
//This would look better with array_filter() and an anonymous function as a callback.
|
| 949 |
+
for($level = 0; $level <= 10; $level++){
|
| 950 |
+
$cap = 'level_' . $level;
|
| 951 |
+
if ( isset($all_capabilities[$cap]) ){
|
| 952 |
+
unset($all_capabilities[$cap]);
|
| 953 |
+
}
|
| 954 |
+
}
|
| 955 |
$all_capabilities = array_keys($all_capabilities);
|
| 956 |
natcasesort($all_capabilities);
|
| 957 |
|
| 966 |
<div class='ws_main_container'>
|
| 967 |
<div class='ws_toolbar'>
|
| 968 |
<div class="ws_button_container">
|
| 969 |
+
<a id='ws_cut_menu' class='ws_button' href='javascript:void(0)' title='Cut'><img src='<?php echo $images_url; ?>/cut.png' alt="Cut" /></a>
|
| 970 |
+
<a id='ws_copy_menu' class='ws_button' href='javascript:void(0)' title='Copy'><img src='<?php echo $images_url; ?>/page_white_copy.png' alt="Copy" /></a>
|
| 971 |
+
<a id='ws_paste_menu' class='ws_button' href='javascript:void(0)' title='Paste'><img src='<?php echo $images_url; ?>/page_white_paste.png' alt="Paste" /></a>
|
| 972 |
|
| 973 |
<div class="ws_separator"> </div>
|
| 974 |
|
| 975 |
+
<a id='ws_new_menu' class='ws_button' href='javascript:void(0)' title='New menu'><img src='<?php echo $images_url; ?>/page_white_add.png' alt="New menu" /></a>
|
| 976 |
+
<a id='ws_hide_menu' class='ws_button' href='javascript:void(0)' title='Show/Hide'><img src='<?php echo $images_url; ?>/plugin_disabled.png' alt="Show/Hide" /></a>
|
| 977 |
+
<a id='ws_delete_menu' class='ws_button' href='javascript:void(0)' title='Delete menu'><img src='<?php echo $images_url; ?>/page_white_delete.png' alt="Delete menu" /></a>
|
| 978 |
|
| 979 |
<div class="ws_separator"> </div>
|
| 980 |
|
| 981 |
+
<a id='ws_new_separator' class='ws_button' href='javascript:void(0)' title='New separator'><img src='<?php echo $images_url; ?>/separator_add.png' alt="New separator" /></a>
|
| 982 |
</div>
|
| 983 |
</div>
|
| 984 |
|
| 988 |
<div class='ws_main_container'>
|
| 989 |
<div class='ws_toolbar'>
|
| 990 |
<div class="ws_button_container">
|
| 991 |
+
<a id='ws_cut_item' class='ws_button' href='javascript:void(0)' title='Cut'><img src='<?php echo $images_url; ?>/cut.png' alt="Cut" /></a>
|
| 992 |
+
<a id='ws_copy_item' class='ws_button' href='javascript:void(0)' title='Copy'><img src='<?php echo $images_url; ?>/page_white_copy.png' alt="Copy" /></a>
|
| 993 |
+
<a id='ws_paste_item' class='ws_button' href='javascript:void(0)' title='Paste'><img src='<?php echo $images_url; ?>/page_white_paste.png' alt="Paste" /></a>
|
| 994 |
|
| 995 |
<div class="ws_separator"> </div>
|
| 996 |
|
| 997 |
+
<a id='ws_new_item' class='ws_button' href='javascript:void(0)' title='New menu item'><img src='<?php echo $images_url; ?>/page_white_add.png' alt="New menu item" /></a>
|
| 998 |
+
<a id='ws_hide_item' class='ws_button' href='javascript:void(0)' title='Show/Hide'><img src='<?php echo $images_url; ?>/plugin_disabled.png' alt="Show/Hide" /></a>
|
| 999 |
+
<a id='ws_delete_item' class='ws_button' href='javascript:void(0)' title='Delete menu item'><img src='<?php echo $images_url; ?>/page_white_delete.png' alt="Delete menu item" /></a>
|
| 1000 |
|
| 1001 |
<div class="ws_separator"> </div>
|
| 1002 |
|
| 1003 |
<a id='ws_sort_ascending' class='ws_button' href='javascript:void(0)' title='Sort ascending'>
|
| 1004 |
+
<img src='<?php echo $images_url; ?>/sort_ascending.png' alt="Sort ascending" />
|
| 1005 |
</a>
|
| 1006 |
<a id='ws_sort_descending' class='ws_button' href='javascript:void(0)' title='Sort descending'>
|
| 1007 |
+
<img src='<?php echo $images_url; ?>/sort_descending.png' alt="Sort descending" />
|
| 1008 |
</a>
|
| 1009 |
</div>
|
| 1010 |
</div>
|
| 1032 |
</div>
|
| 1033 |
|
| 1034 |
<?php
|
| 1035 |
+
//Create a pop-up capability selector
|
| 1036 |
$capSelector = array('<select id="ws_cap_selector" class="ws_dropdown" size="10">');
|
| 1037 |
|
| 1038 |
$capSelector[] = '<optgroup label="Roles">';
|
| 1133 |
* @return array Associative array with capability names as keys
|
| 1134 |
*/
|
| 1135 |
function get_all_capabilities(){
|
| 1136 |
+
/** @var WP_Roles $wp_roles */
|
| 1137 |
global $wp_roles;
|
| 1138 |
|
| 1139 |
$capabilities = array();
|
| 1143 |
}
|
| 1144 |
|
| 1145 |
//Iterate over all known roles and collect their capabilities
|
| 1146 |
+
foreach($wp_roles->roles as $role){
|
| 1147 |
if ( !empty($role['capabilities']) && is_array($role['capabilities']) ){ //Being defensive here
|
| 1148 |
$capabilities = array_merge($capabilities, $role['capabilities']);
|
| 1149 |
}
|
| 1169 |
* @return array Associative array with role IDs as keys and role display names as values
|
| 1170 |
*/
|
| 1171 |
function get_all_roles(){
|
| 1172 |
+
/** @var WP_Roles $wp_roles */
|
| 1173 |
global $wp_roles;
|
| 1174 |
$roles = array();
|
| 1175 |
|
| 1210 |
<script type="text/javascript">
|
| 1211 |
(function($){
|
| 1212 |
$('#screen-meta-links').append(
|
| 1213 |
+
'<div id="ws-ame-feedback-widget-wrap">' +
|
| 1214 |
'<a href="http://feedback.w-shadow.com/forums/58572-admin-menu-editor" id="ws-ame-feedback-widget" class="show-settings" target="_blank" title="Open the user feedback forum">Feedback</a>' +
|
| 1215 |
'</div>'
|
| 1216 |
);
|
| 1229 |
<script type="text/javascript">
|
| 1230 |
(function($){
|
| 1231 |
$('#screen-meta-links').append(
|
| 1232 |
+
'<div id="ws-pro-version-notice">' +
|
| 1233 |
'<a href="http://wpplugins.com/plugin/146/admin-menu-editor-pro" id="ws-pro-version-notice-link" class="show-settings" target="_blank" title="View Pro version details">Upgrade to Pro</a>' +
|
| 1234 |
'</div>'
|
| 1235 |
);
|
js/menu-editor.js
CHANGED
|
@@ -95,9 +95,9 @@ function buildTopMenu(menu){
|
|
| 95 |
var contents = [];
|
| 96 |
contents.push(
|
| 97 |
'<div class="ws_item_head">',
|
| 98 |
-
'<a class="ws_edit_link"> </a><div class="ws_flag_container"> </div>',
|
| 99 |
'<span class="ws_item_title">',
|
| 100 |
-
((menu.menu_title!=null)?menu.menu_title:menu.defaults.menu_title),
|
| 101 |
' </span>',
|
| 102 |
'</div>',
|
| 103 |
'<div class="ws_editbox" style="display: none;"></div>'
|
|
@@ -292,7 +292,7 @@ var knownMenuFields = {
|
|
| 292 |
advanced: true,
|
| 293 |
type: 'checkbox',
|
| 294 |
defaultValue: false,
|
| 295 |
-
visible:
|
| 296 |
}
|
| 297 |
};
|
| 298 |
|
|
@@ -604,7 +604,7 @@ function readAllFields(container){
|
|
| 604 |
var item_flags = {
|
| 605 |
'custom_item' : 'This is a custom menu item',
|
| 606 |
'unused' : 'This item was automatically (re)inserted into your custom menu because it is present in the default WordPress menu',
|
| 607 |
-
'missing' : 'This item is not present in the default WordPress menu.
|
| 608 |
'hidden' : 'This item is hidden'
|
| 609 |
}
|
| 610 |
|
|
@@ -660,9 +660,9 @@ var ws_paste_count = 0;
|
|
| 660 |
$(document).ready(function(){
|
| 661 |
if (window.wsMenuEditorPro) {
|
| 662 |
knownMenuFields['open_in'].visible = true;
|
| 663 |
-
}
|
| 664 |
-
|
| 665 |
-
|
| 666 |
var mainMenuBox = $('#ws_menu_box');
|
| 667 |
makeBoxSortable(mainMenuBox);
|
| 668 |
|
|
@@ -800,21 +800,21 @@ $(document).ready(function(){
|
|
| 800 |
|
| 801 |
|
| 802 |
/***************************************************************************
|
| 803 |
-
|
| 804 |
***************************************************************************/
|
| 805 |
-
|
| 806 |
-
|
| 807 |
-
|
| 808 |
-
|
| 809 |
-
|
| 810 |
-
|
| 811 |
-
|
| 812 |
-
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
-
|
| 817 |
-
|
| 818 |
|
| 819 |
//Show/hide the capability dropdown list when the button is clicked
|
| 820 |
$('#ws_menu_editor input.ws_dropdown_button').live('click',function(event){
|
|
@@ -1005,23 +1005,31 @@ $(document).ready(function(){
|
|
| 1005 |
|
| 1006 |
//Remove the original menu and submenu
|
| 1007 |
selection.remove();
|
| 1008 |
-
$('#'+selection.data('submenu_id')).remove;
|
| 1009 |
});
|
| 1010 |
|
| 1011 |
//Paste menu
|
| 1012 |
$('#ws_paste_menu').click(function () {
|
| 1013 |
//Check if anything has been copied/cut
|
| 1014 |
if (!menu_in_clipboard) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1015 |
//Get the selected menu
|
| 1016 |
var selection = $('#ws_menu_box .ws_active');
|
| 1017 |
|
| 1018 |
if (selection.length > 0) {
|
| 1019 |
//If a menu is selected add the pasted item after it
|
| 1020 |
-
outputTopMenu(
|
| 1021 |
} else {
|
| 1022 |
//Otherwise add the pasted item at the end
|
| 1023 |
-
outputTopMenu(
|
| 1024 |
-
}
|
| 1025 |
});
|
| 1026 |
|
| 1027 |
//New menu
|
|
@@ -1154,8 +1162,10 @@ $(document).ready(function(){
|
|
| 1154 |
$('#ws_paste_item').click(function () {
|
| 1155 |
//Check if anything has been copied/cut
|
| 1156 |
if (!item_in_clipboard) return;
|
|
|
|
| 1157 |
//Create a new editor widget for the copied item
|
| 1158 |
-
var
|
|
|
|
| 1159 |
|
| 1160 |
//Get the selected menu
|
| 1161 |
var selection = $('#ws_submenu_box .ws_submenu:visible .ws_active');
|
|
@@ -1165,7 +1175,7 @@ $(document).ready(function(){
|
|
| 1165 |
} else {
|
| 1166 |
//Otherwise add the pasted item at the end
|
| 1167 |
$('#ws_submenu_box .ws_submenu:visible').append(new_item);
|
| 1168 |
-
}
|
| 1169 |
|
| 1170 |
new_item.show();
|
| 1171 |
});
|
| 95 |
var contents = [];
|
| 96 |
contents.push(
|
| 97 |
'<div class="ws_item_head">',
|
| 98 |
+
menu.separator ? '' : '<a class="ws_edit_link"> </a><div class="ws_flag_container"> </div>',
|
| 99 |
'<span class="ws_item_title">',
|
| 100 |
+
((menu.menu_title!=null) ? menu.menu_title : menu.defaults.menu_title),
|
| 101 |
' </span>',
|
| 102 |
'</div>',
|
| 103 |
'<div class="ws_editbox" style="display: none;"></div>'
|
| 292 |
advanced: true,
|
| 293 |
type: 'checkbox',
|
| 294 |
defaultValue: false,
|
| 295 |
+
visible: false
|
| 296 |
}
|
| 297 |
};
|
| 298 |
|
| 604 |
var item_flags = {
|
| 605 |
'custom_item' : 'This is a custom menu item',
|
| 606 |
'unused' : 'This item was automatically (re)inserted into your custom menu because it is present in the default WordPress menu',
|
| 607 |
+
'missing' : 'This item is not present in the default WordPress menu.',
|
| 608 |
'hidden' : 'This item is hidden'
|
| 609 |
}
|
| 610 |
|
| 660 |
$(document).ready(function(){
|
| 661 |
if (window.wsMenuEditorPro) {
|
| 662 |
knownMenuFields['open_in'].visible = true;
|
| 663 |
+
}
|
| 664 |
+
|
| 665 |
+
//Make the top menu box sortable (we only need to do this once)
|
| 666 |
var mainMenuBox = $('#ws_menu_box');
|
| 667 |
makeBoxSortable(mainMenuBox);
|
| 668 |
|
| 800 |
|
| 801 |
|
| 802 |
/***************************************************************************
|
| 803 |
+
Dropdown list for combobox fields
|
| 804 |
***************************************************************************/
|
| 805 |
+
|
| 806 |
+
var availableDropdowns = {
|
| 807 |
+
'ws_cap_selector' : {
|
| 808 |
+
list : $('#ws_cap_selector'),
|
| 809 |
+
currentOwner : null,
|
| 810 |
+
timeoutForgetOwner : 0
|
| 811 |
+
},
|
| 812 |
+
'ws_page_selector' : {
|
| 813 |
+
list : $('#ws_page_selector'),
|
| 814 |
+
currentOwner : null,
|
| 815 |
+
timeoutForgetOwner : 0
|
| 816 |
+
}
|
| 817 |
+
};
|
| 818 |
|
| 819 |
//Show/hide the capability dropdown list when the button is clicked
|
| 820 |
$('#ws_menu_editor input.ws_dropdown_button').live('click',function(event){
|
| 1005 |
|
| 1006 |
//Remove the original menu and submenu
|
| 1007 |
selection.remove();
|
| 1008 |
+
$('#'+selection.data('submenu_id')).remove();
|
| 1009 |
});
|
| 1010 |
|
| 1011 |
//Paste menu
|
| 1012 |
$('#ws_paste_menu').click(function () {
|
| 1013 |
//Check if anything has been copied/cut
|
| 1014 |
if (!menu_in_clipboard) return;
|
| 1015 |
+
|
| 1016 |
+
var menu = $.extend(true, {}, menu_in_clipboard);
|
| 1017 |
+
|
| 1018 |
+
//The user shouldn't need to worry about giving separators a unique filename.
|
| 1019 |
+
if (menu.separator) {
|
| 1020 |
+
menu.defaults.file = 'separator_'+randomMenuId();
|
| 1021 |
+
}
|
| 1022 |
+
|
| 1023 |
//Get the selected menu
|
| 1024 |
var selection = $('#ws_menu_box .ws_active');
|
| 1025 |
|
| 1026 |
if (selection.length > 0) {
|
| 1027 |
//If a menu is selected add the pasted item after it
|
| 1028 |
+
outputTopMenu(menu, selection);
|
| 1029 |
} else {
|
| 1030 |
//Otherwise add the pasted item at the end
|
| 1031 |
+
outputTopMenu(menu);
|
| 1032 |
+
}
|
| 1033 |
});
|
| 1034 |
|
| 1035 |
//New menu
|
| 1162 |
$('#ws_paste_item').click(function () {
|
| 1163 |
//Check if anything has been copied/cut
|
| 1164 |
if (!item_in_clipboard) return;
|
| 1165 |
+
|
| 1166 |
//Create a new editor widget for the copied item
|
| 1167 |
+
var item = $.extend(true, {}, item_in_clipboard);
|
| 1168 |
+
var new_item = buildMenuItem(item);
|
| 1169 |
|
| 1170 |
//Get the selected menu
|
| 1171 |
var selection = $('#ws_submenu_box .ws_submenu:visible .ws_active');
|
| 1175 |
} else {
|
| 1176 |
//Otherwise add the pasted item at the end
|
| 1177 |
$('#ws_submenu_box .ws_submenu:visible').append(new_item);
|
| 1178 |
+
}
|
| 1179 |
|
| 1180 |
new_item.show();
|
| 1181 |
});
|
menu-editor.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
Plugin Name: Admin Menu Editor
|
| 4 |
Plugin URI: http://w-shadow.com/blog/2008/12/20/admin-menu-editor-for-wordpress/
|
| 5 |
Description: Lets you directly edit the WordPress admin menu. You can re-order, hide or rename existing menus, add custom menus and more.
|
| 6 |
-
Version: 1.1.
|
| 7 |
Author: Janis Elsts
|
| 8 |
Author URI: http://w-shadow.com/blog/
|
| 9 |
*/
|
| 3 |
Plugin Name: Admin Menu Editor
|
| 4 |
Plugin URI: http://w-shadow.com/blog/2008/12/20/admin-menu-editor-for-wordpress/
|
| 5 |
Description: Lets you directly edit the WordPress admin menu. You can re-order, hide or rename existing menus, add custom menus and more.
|
| 6 |
+
Version: 1.1.4
|
| 7 |
Author: Janis Elsts
|
| 8 |
Author URI: http://w-shadow.com/blog/
|
| 9 |
*/
|
readme.txt
CHANGED
|
@@ -3,8 +3,8 @@ Contributors: whiteshadow
|
|
| 3 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A6P9S6CE3SRSW
|
| 4 |
Tags: admin, dashboard, menu, security, wpmu
|
| 5 |
Requires at least: 3.0
|
| 6 |
-
Tested up to: 3.2
|
| 7 |
-
Stable tag: 1.1.
|
| 8 |
|
| 9 |
Lets you directly edit the WordPress admin menu. You can re-order, hide or rename existing menus, add custom menus and more.
|
| 10 |
|
|
@@ -61,6 +61,19 @@ Plugins installed in the `mu-plugins` directory are treated as "always on", so y
|
|
| 61 |
|
| 62 |
== Changelog ==
|
| 63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
= 1.1.3 =
|
| 65 |
* Tests for WordPress 3.2 compatibility.
|
| 66 |
|
| 3 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A6P9S6CE3SRSW
|
| 4 |
Tags: admin, dashboard, menu, security, wpmu
|
| 5 |
Requires at least: 3.0
|
| 6 |
+
Tested up to: 3.2.1
|
| 7 |
+
Stable tag: 1.1.4
|
| 8 |
|
| 9 |
Lets you directly edit the WordPress admin menu. You can re-order, hide or rename existing menus, add custom menus and more.
|
| 10 |
|
| 61 |
|
| 62 |
== Changelog ==
|
| 63 |
|
| 64 |
+
= 1.1.4 =
|
| 65 |
+
* Fixed the updater's cron hook not being removed when the plugin is deactivated.
|
| 66 |
+
* Fixed updates not showing up in some situations.
|
| 67 |
+
* Fixed the "Feedback" button not responding to mouse clicks in some browsers.
|
| 68 |
+
* Fixed "Feedback" button style to be consistent with other WP screen meta buttons.
|
| 69 |
+
* Enforce the custom menu order by using the 'menu_order' filter. Fixes Jetpack menu not staying put.
|
| 70 |
+
* You can now copy/paste as many menu separators as you like without worrying about some of them mysteriously disappearing on save.
|
| 71 |
+
* Fixed a long-standing copying related bug where copied menus would all still refer to the same JS object instance.
|
| 72 |
+
* Added ALT attributes to the toolbar icon images.
|
| 73 |
+
* Removed the "Custom" checkbox. In retrospect, all it did was confuse people.
|
| 74 |
+
* Made it impossible to edit separator properties.
|
| 75 |
+
* Removed the deprecated "level_X" capabilities from the "Required capability" dropdown. You can still type them in manually if you want.
|
| 76 |
+
|
| 77 |
= 1.1.3 =
|
| 78 |
* Tests for WordPress 3.2 compatibility.
|
| 79 |
|
