Version Description
- Tested on WP 3.4
- Fixed a rare "failed to decode input" error.
- Fixed menus not being expanded/collapsed properly when the current menu item has been moved to a different sub-menu.
- Added a shortlist of Pro version benefits to the editor page (can be hidden).
Download this release
Release Info
Developer | whiteshadow |
Plugin | Admin Menu Editor |
Version | 1.1.7 |
Comparing to | |
See all releases |
Code changes from version 1.1.6.1 to 1.1.7
- css/menu-editor.css +66 -0
- includes/menu-editor-core.php +129 -26
- js/menu-editor.js +18 -3
- js/menu-highlight-fix.js +133 -0
- menu-editor.php +2 -3
- readme.txt +8 -2
- uninstall.php +6 -4
css/menu-editor.css
CHANGED
@@ -548,6 +548,72 @@ a.ws_button:hover {
|
|
548 |
padding-top: 25px;
|
549 |
}
|
550 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
551 |
/************************************
|
552 |
Screen meta buttons
|
553 |
*************************************/
|
548 |
padding-top: 25px;
|
549 |
}
|
550 |
|
551 |
+
/************************************
|
552 |
+
Tooltips and hints
|
553 |
+
*************************************/
|
554 |
+
|
555 |
+
.ws_tooltip_trigger {
|
556 |
+
cursor: pointer;
|
557 |
+
}
|
558 |
+
|
559 |
+
.ws_tooltip_content_list {
|
560 |
+
list-style: disc;
|
561 |
+
margin-left: 1em;
|
562 |
+
}
|
563 |
+
|
564 |
+
.ws_hint {
|
565 |
+
background: #FFFFE0;
|
566 |
+
border: 1px solid #E6DB55;
|
567 |
+
|
568 |
+
margin-bottom: 0.5em;
|
569 |
+
border-radius: 3px;
|
570 |
+
position: relative;
|
571 |
+
padding-right: 20px;
|
572 |
+
}
|
573 |
+
|
574 |
+
.ws_hint_close {
|
575 |
+
border: 1px solid #E6DB55;
|
576 |
+
border-right: none;
|
577 |
+
border-top: none;
|
578 |
+
color: #dcc500;
|
579 |
+
font-weight: bold;
|
580 |
+
cursor: pointer;
|
581 |
+
|
582 |
+
width: 18px;
|
583 |
+
text-align: center;
|
584 |
+
border-radius: 3px;
|
585 |
+
|
586 |
+
position: absolute;
|
587 |
+
right: 0px;
|
588 |
+
top: 0px;
|
589 |
+
}
|
590 |
+
|
591 |
+
.ws_hint_close:hover {
|
592 |
+
background-color: #ffef4c;
|
593 |
+
border-color: #e0b900;
|
594 |
+
color: black;
|
595 |
+
}
|
596 |
+
|
597 |
+
.ws_hint_content {
|
598 |
+
padding: 0.4em 0 0.4em 0.4em;
|
599 |
+
}
|
600 |
+
|
601 |
+
.ws_hint_content ul {
|
602 |
+
list-style: disc;
|
603 |
+
list-style-position: inside;
|
604 |
+
margin-left: 0.5em;
|
605 |
+
}
|
606 |
+
|
607 |
+
#ws_sidebar_pro_ad {
|
608 |
+
margin-top: 5px;
|
609 |
+
margin-left: 3px;
|
610 |
+
|
611 |
+
position: fixed;
|
612 |
+
right: 20px;
|
613 |
+
bottom: 40px;
|
614 |
+
z-index: 100;
|
615 |
+
}
|
616 |
+
|
617 |
/************************************
|
618 |
Screen meta buttons
|
619 |
*************************************/
|
includes/menu-editor-core.php
CHANGED
@@ -27,6 +27,10 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
27 |
|
28 |
private $templates = null; //Template arrays for various menu structures. See the constructor for details.
|
29 |
|
|
|
|
|
|
|
|
|
30 |
function init(){
|
31 |
//Determine if the plugin is active network-wide (i.e. either installed in
|
32 |
//the /mu-plugins/ directory or activated "network wide" by the super admin.
|
@@ -41,7 +45,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
41 |
$this->defaults = array(
|
42 |
'hide_advanced_settings' => true,
|
43 |
'menu_format_version' => 0,
|
44 |
-
'display_survey_notice' =>
|
45 |
);
|
46 |
$this->serialize_with_json = false; //(Don't) store the options in JSON format
|
47 |
|
@@ -94,7 +98,17 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
94 |
);
|
95 |
|
96 |
//AJAXify screen options
|
97 |
-
add_action( 'wp_ajax_ws_ame_save_screen_options', array(&$this,'ajax_save_screen_options') );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
}
|
99 |
|
100 |
/**
|
@@ -148,6 +162,16 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
148 |
array('jquery', 'jquery-ui-sortable', 'jquery-ui-dialog', 'jquery-form'),
|
149 |
'1.1'
|
150 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
}
|
152 |
|
153 |
/**
|
@@ -156,7 +180,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
156 |
* @return void
|
157 |
*/
|
158 |
function enqueue_styles(){
|
159 |
-
wp_enqueue_style('menu-editor-style', $this->plugin_dir_url . '/css/menu-editor.css', array(), '
|
160 |
}
|
161 |
|
162 |
/**
|
@@ -168,7 +192,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
168 |
global $menu, $submenu;
|
169 |
|
170 |
//Menu reset (for emergencies). Executed by accessing http://example.com/wp-admin/?reset_admin_menu=1
|
171 |
-
$reset_requested = isset($
|
172 |
if ( $reset_requested && $this->current_user_can_edit_menu() ){
|
173 |
$this->options['custom_menu'] = null;
|
174 |
$this->save_options();
|
@@ -446,7 +470,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
446 |
*/
|
447 |
function menu_merge($tree, $menu, $submenu){
|
448 |
list($menu_defaults, $submenu_defaults) = $this->build_lookups($menu, $submenu);
|
449 |
-
|
450 |
//Iterate over all menus and submenus and look up default values
|
451 |
foreach ($tree as &$topmenu){
|
452 |
$topfile = $this->get_menu_field($topmenu, 'file');
|
@@ -470,7 +494,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
470 |
}
|
471 |
}
|
472 |
|
473 |
-
if (is_array($topmenu['items'])) {
|
474 |
//Iterate over submenu items
|
475 |
foreach ($topmenu['items'] as $file => &$item){
|
476 |
$uid = $this->unique_submenu_id($item, $topfile);
|
@@ -588,10 +612,10 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
588 |
//Attach submenu items
|
589 |
$parent = $tree_item['defaults']['file'];
|
590 |
if ( isset($submenu[$parent]) ){
|
591 |
-
foreach($submenu[$parent] as $
|
592 |
$tree_item['items'][$subitem[2]] = array_merge(
|
593 |
$this->templates['blank_item'],
|
594 |
-
array('defaults' => $this->submenu2assoc($subitem, $
|
595 |
);
|
596 |
}
|
597 |
}
|
@@ -865,25 +889,17 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
865 |
die("Access denied");
|
866 |
}
|
867 |
|
868 |
-
$
|
869 |
-
$get = $_GET;
|
870 |
-
if ( function_exists('wp_magic_quotes') ){
|
871 |
-
//Ceterum censeo, WP shouldn't mangle superglobals.
|
872 |
-
$post = stripslashes_deep($post);
|
873 |
-
$get = stripslashes_deep($get);
|
874 |
-
}
|
875 |
-
|
876 |
-
$action = isset($post['action'])?$post['action']:(isset($get['action'])?$get['action']:'');
|
877 |
do_action('admin_menu_editor_header', $action);
|
878 |
|
879 |
//Handle form submissions
|
880 |
-
if (isset($post['data'])){
|
881 |
check_admin_referer('menu-editor-form');
|
882 |
|
883 |
//Try to decode a menu tree encoded as JSON
|
884 |
-
$data = $this->json_decode($post['data'], true);
|
885 |
if (!$data || (count($data) < 2) ){
|
886 |
-
$fixed = stripslashes($post['data']);
|
887 |
$data = $this->json_decode( $fixed, true );
|
888 |
}
|
889 |
|
@@ -916,7 +932,7 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
916 |
}
|
917 |
|
918 |
//Handle the survey notice
|
919 |
-
if ( isset($
|
920 |
$this->options['display_survey_notice'] = false;
|
921 |
$this->save_options();
|
922 |
}
|
@@ -942,10 +958,10 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
942 |
|
943 |
<?php
|
944 |
|
945 |
-
if ( !empty($
|
946 |
-
if ( intval($
|
947 |
echo '<div id="message" class="updated fade"><p><strong>Settings saved.</strong></p></div>';
|
948 |
-
} elseif ( intval($
|
949 |
echo '<div id="message" class="error"><p><strong>Failed to decode input! The menu wasn\'t modified.</strong></p></div>';
|
950 |
}
|
951 |
}
|
@@ -1055,6 +1071,30 @@ class WPMenuEditor extends MenuEd_ShadowPluginFramework {
|
|
1055 |
?>
|
1056 |
</div>
|
1057 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1058 |
</div>
|
1059 |
|
1060 |
<?php
|
@@ -1262,10 +1302,57 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
1262 |
)));
|
1263 |
}
|
1264 |
|
1265 |
-
$this->options['hide_advanced_settings'] = !empty($
|
1266 |
$this->save_options();
|
1267 |
die('1');
|
1268 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1269 |
|
1270 |
/**
|
1271 |
* A callback for the stub meta box added to the plugin's page. Does nothing.
|
@@ -1275,7 +1362,23 @@ window.wsMenuEditorPro = false; //Will be overwritten if extras are loaded
|
|
1275 |
function noop(){
|
1276 |
//nihil
|
1277 |
}
|
1278 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1279 |
} //class
|
1280 |
|
1281 |
endif;
|
27 |
|
28 |
private $templates = null; //Template arrays for various menu structures. See the constructor for details.
|
29 |
|
30 |
+
//Our personal copy of the request vars, without any "magic quotes".
|
31 |
+
private $post = array();
|
32 |
+
private $get = array();
|
33 |
+
|
34 |
function init(){
|
35 |
//Determine if the plugin is active network-wide (i.e. either installed in
|
36 |
//the /mu-plugins/ directory or activated "network wide" by the super admin.
|
45 |
$this->defaults = array(
|
46 |
'hide_advanced_settings' => true,
|
47 |
'menu_format_version' => 0,
|
48 |
+
'display_survey_notice' => false,
|
49 |
);
|
50 |
$this->serialize_with_json = false; //(Don't) store the options in JSON format
|
51 |
|
98 |
);
|
99 |
|
100 |
//AJAXify screen options
|
101 |
+
add_action( 'wp_ajax_ws_ame_save_screen_options', array(&$this,'ajax_save_screen_options') );
|
102 |
+
|
103 |
+
//AJAXify hints
|
104 |
+
add_action('wp_ajax_ws_ame_hide_hint', array($this, 'ajax_hide_hint'));
|
105 |
+
|
106 |
+
//Make sure we have access to the original, un-mangled request data.
|
107 |
+
//This is necessary because WordPress will stupidly apply "magic quotes"
|
108 |
+
//to the request vars even if this PHP misfeature is disabled.
|
109 |
+
add_action('plugins_loaded', array($this, 'capture_request_vars'));
|
110 |
+
|
111 |
+
add_action('admin_enqueue_scripts', array($this, 'enqueue_menu_fix_script'));
|
112 |
}
|
113 |
|
114 |
/**
|
162 |
array('jquery', 'jquery-ui-sortable', 'jquery-ui-dialog', 'jquery-form'),
|
163 |
'1.1'
|
164 |
);
|
165 |
+
|
166 |
+
//The editor will need access to some of the plugin data and WP data.
|
167 |
+
wp_localize_script(
|
168 |
+
'menu-editor',
|
169 |
+
'wsEditorData',
|
170 |
+
array(
|
171 |
+
'adminAjaxUrl' => admin_url('admin-ajax.php'),
|
172 |
+
'showHints' => $this->get_hint_visibility(),
|
173 |
+
)
|
174 |
+
);
|
175 |
}
|
176 |
|
177 |
/**
|
180 |
* @return void
|
181 |
*/
|
182 |
function enqueue_styles(){
|
183 |
+
wp_enqueue_style('menu-editor-style', $this->plugin_dir_url . '/css/menu-editor.css', array(), '20120626');
|
184 |
}
|
185 |
|
186 |
/**
|
192 |
global $menu, $submenu;
|
193 |
|
194 |
//Menu reset (for emergencies). Executed by accessing http://example.com/wp-admin/?reset_admin_menu=1
|
195 |
+
$reset_requested = isset($this->get['reset_admin_menu']) && $this->get['reset_admin_menu'];
|
196 |
if ( $reset_requested && $this->current_user_can_edit_menu() ){
|
197 |
$this->options['custom_menu'] = null;
|
198 |
$this->save_options();
|
470 |
*/
|
471 |
function menu_merge($tree, $menu, $submenu){
|
472 |
list($menu_defaults, $submenu_defaults) = $this->build_lookups($menu, $submenu);
|
473 |
+
|
474 |
//Iterate over all menus and submenus and look up default values
|
475 |
foreach ($tree as &$topmenu){
|
476 |
$topfile = $this->get_menu_field($topmenu, 'file');
|
494 |
}
|
495 |
}
|
496 |
|
497 |
+
if (isset($topmenu['items']) && is_array($topmenu['items'])) {
|
498 |
//Iterate over submenu items
|
499 |
foreach ($topmenu['items'] as $file => &$item){
|
500 |
$uid = $this->unique_submenu_id($item, $topfile);
|
612 |
//Attach submenu items
|
613 |
$parent = $tree_item['defaults']['file'];
|
614 |
if ( isset($submenu[$parent]) ){
|
615 |
+
foreach($submenu[$parent] as $subitem_pos => $subitem){
|
616 |
$tree_item['items'][$subitem[2]] = array_merge(
|
617 |
$this->templates['blank_item'],
|
618 |
+
array('defaults' => $this->submenu2assoc($subitem, $subitem_pos, $parent))
|
619 |
);
|
620 |
}
|
621 |
}
|
889 |
die("Access denied");
|
890 |
}
|
891 |
|
892 |
+
$action = isset($this->post['action']) ? $this->post['action'] : (isset($this->get['action']) ? $this->get['action'] : '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
893 |
do_action('admin_menu_editor_header', $action);
|
894 |
|
895 |
//Handle form submissions
|
896 |
+
if (isset($this->post['data'])){
|
897 |
check_admin_referer('menu-editor-form');
|
898 |
|
899 |
//Try to decode a menu tree encoded as JSON
|
900 |
+
$data = $this->json_decode($this->post['data'], true);
|
901 |
if (!$data || (count($data) < 2) ){
|
902 |
+
$fixed = stripslashes($this->post['data']);
|
903 |
$data = $this->json_decode( $fixed, true );
|
904 |
}
|
905 |
|
932 |
}
|
933 |
|
934 |
//Handle the survey notice
|
935 |
+
if ( isset($this->get['hide_survey_notice']) && !empty($this->get['hide_survey_notice']) ) {
|
936 |
$this->options['display_survey_notice'] = false;
|
937 |
$this->save_options();
|
938 |
}
|
958 |
|
959 |
<?php
|
960 |
|
961 |
+
if ( !empty($this->get['message']) ){
|
962 |
+
if ( intval($this->get['message']) == 1 ){
|
963 |
echo '<div id="message" class="updated fade"><p><strong>Settings saved.</strong></p></div>';
|
964 |
+
} elseif ( intval($this->get['message']) == 2 ) {
|
965 |
echo '<div id="message" class="error"><p><strong>Failed to decode input! The menu wasn\'t modified.</strong></p></div>';
|
966 |
}
|
967 |
}
|
1071 |
?>
|
1072 |
</div>
|
1073 |
|
1074 |
+
<?php
|
1075 |
+
$show_hints = $this->get_hint_visibility();
|
1076 |
+
$hint_id = 'ws_sidebar_pro_ad';
|
1077 |
+
$show_pro_benefits = !apply_filters('admin_menu_editor_is_pro', false) && (!isset($show_hints[$hint_id]) || $show_hints[$hint_id]);
|
1078 |
+
if ( $show_pro_benefits ):
|
1079 |
+
?>
|
1080 |
+
<div class="clear"></div>
|
1081 |
+
|
1082 |
+
<div class="ws_hint" id="<?php echo esc_attr($hint_id); ?>">
|
1083 |
+
<div class="ws_hint_close" title="Close">x</div>
|
1084 |
+
<div class="ws_hint_content">
|
1085 |
+
<strong>Upgrade to Pro:</strong>
|
1086 |
+
<ul>
|
1087 |
+
<li>Menu export & import.</li>
|
1088 |
+
<li>Per-role menu permissions.</li>
|
1089 |
+
<li>Drag items between menu levels.</li>
|
1090 |
+
</ul>
|
1091 |
+
<a href="http://w-shadow.com/admin-menu-editor-pro/upgrade-to-pro/?utm_source=Admin%2BMenu%2BEditor%2Bfree&utm_medium=text_link&utm_content=sidebar_link&utm_campaign=Plugins" target="_blank">Learn more</a>
|
1092 |
+
</div>
|
1093 |
+
</div>
|
1094 |
+
<?php
|
1095 |
+
endif;
|
1096 |
+
?>
|
1097 |
+
|
1098 |
</div>
|
1099 |
|
1100 |
<?php
|
1302 |
)));
|
1303 |
}
|
1304 |
|
1305 |
+
$this->options['hide_advanced_settings'] = !empty($this->post['hide_advanced_settings']);
|
1306 |
$this->save_options();
|
1307 |
die('1');
|
1308 |
}
|
1309 |
+
|
1310 |
+
public function ajax_hide_hint() {
|
1311 |
+
if ( !isset($this->post['hint']) || !$this->current_user_can_edit_menu() ){
|
1312 |
+
die("You're not allowed to do that!");
|
1313 |
+
}
|
1314 |
+
|
1315 |
+
$show_hints = $this->get_hint_visibility();
|
1316 |
+
$show_hints[strval($this->post['hint'])] = false;
|
1317 |
+
$this->set_hint_visibility($show_hints);
|
1318 |
+
|
1319 |
+
die("OK");
|
1320 |
+
}
|
1321 |
+
|
1322 |
+
private function get_hint_visibility() {
|
1323 |
+
$user = wp_get_current_user();
|
1324 |
+
$show_hints = get_user_meta($user->ID, 'ame_show_hints', true);
|
1325 |
+
if ( !is_array($show_hints) ) {
|
1326 |
+
$show_hints = array();
|
1327 |
+
}
|
1328 |
+
|
1329 |
+
$defaults = array(
|
1330 |
+
'ws_sidebar_pro_ad' => true,
|
1331 |
+
//'ws_whats_new_120' => true, //Set upon activation, default not needed.
|
1332 |
+
'ws_hint_menu_permissions' => true,
|
1333 |
+
);
|
1334 |
+
|
1335 |
+
return array_merge($defaults, $show_hints);
|
1336 |
+
}
|
1337 |
+
|
1338 |
+
private function set_hint_visibility($show_hints) {
|
1339 |
+
$user = wp_get_current_user();
|
1340 |
+
update_user_meta($user->ID, 'ame_show_hints', $show_hints);
|
1341 |
+
}
|
1342 |
+
|
1343 |
+
/**
|
1344 |
+
* Enqueue a script that fixes a bug where pages moved to a different menu
|
1345 |
+
* would not be highlighted properly when the user visits them.
|
1346 |
+
*/
|
1347 |
+
public function enqueue_menu_fix_script() {
|
1348 |
+
wp_enqueue_script(
|
1349 |
+
'ame-menu-fix',
|
1350 |
+
$this->plugin_dir_url . '/js/menu-highlight-fix.js',
|
1351 |
+
array('jquery'),
|
1352 |
+
'20120519',
|
1353 |
+
true
|
1354 |
+
);
|
1355 |
+
}
|
1356 |
|
1357 |
/**
|
1358 |
* A callback for the stub meta box added to the plugin's page. Does nothing.
|
1362 |
function noop(){
|
1363 |
//nihil
|
1364 |
}
|
1365 |
+
|
1366 |
+
/**
|
1367 |
+
* Capture $_GET and $_POST in $this->get and $this->post.
|
1368 |
+
* Slashes added by "magic quotes" will be stripped.
|
1369 |
+
*
|
1370 |
+
* @return void
|
1371 |
+
*/
|
1372 |
+
function capture_request_vars(){
|
1373 |
+
$this->post = $_POST;
|
1374 |
+
$this->get = $_GET;
|
1375 |
+
|
1376 |
+
if ( function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() ) {
|
1377 |
+
$this->post = stripslashes_deep($this->post);
|
1378 |
+
$this->get = stripslashes_deep($this->get);
|
1379 |
+
}
|
1380 |
+
}
|
1381 |
+
|
1382 |
} //class
|
1383 |
|
1384 |
endif;
|
js/menu-editor.js
CHANGED
@@ -1,5 +1,7 @@
|
|
1 |
//(c) W-Shadow
|
2 |
|
|
|
|
|
3 |
var wsIdCounter = 0;
|
4 |
|
5 |
(function ($){
|
@@ -150,7 +152,7 @@ function buildSubmenu(items){
|
|
150 |
|
151 |
//Only show menus that have items.
|
152 |
//Skip arrays (with a length) because filled menus are encoded as custom objects.
|
153 |
-
var entry = null
|
154 |
if (items && (typeof items != 'Array')){
|
155 |
for (var item_file in items){
|
156 |
entry = buildMenuItem(items[item_file]);
|
@@ -1415,8 +1417,21 @@ $(document).ready(function(){
|
|
1415 |
}
|
1416 |
|
1417 |
}
|
1418 |
-
});
|
1419 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1420 |
|
1421 |
//Finally, show the menu
|
1422 |
outputWpMenu(customMenu);
|
1 |
//(c) W-Shadow
|
2 |
|
3 |
+
/** @namespace wsEditorData */
|
4 |
+
|
5 |
var wsIdCounter = 0;
|
6 |
|
7 |
(function ($){
|
152 |
|
153 |
//Only show menus that have items.
|
154 |
//Skip arrays (with a length) because filled menus are encoded as custom objects.
|
155 |
+
var entry = null;
|
156 |
if (items && (typeof items != 'Array')){
|
157 |
for (var item_file in items){
|
158 |
entry = buildMenuItem(items[item_file]);
|
1417 |
}
|
1418 |
|
1419 |
}
|
1420 |
+
});
|
1421 |
+
|
1422 |
+
//Flag closed hints as hidden by sending the appropriate AJAX request to the backend.
|
1423 |
+
$('.ws_hint_close').click(function() {
|
1424 |
+
var hint = $(this).parents('.ws_hint').first();
|
1425 |
+
hint.hide();
|
1426 |
+
wsEditorData.showHints[hint.attr('id')] = false;
|
1427 |
+
$.post(
|
1428 |
+
wsEditorData.adminAjaxUrl,
|
1429 |
+
{
|
1430 |
+
'action' : 'ws_ame_hide_hint',
|
1431 |
+
'hint' : hint.attr('id')
|
1432 |
+
}
|
1433 |
+
);
|
1434 |
+
});
|
1435 |
|
1436 |
//Finally, show the menu
|
1437 |
outputWpMenu(customMenu);
|
js/menu-highlight-fix.js
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery(function($) {
|
2 |
+
// parseUri 1.2.2
|
3 |
+
// (c) Steven Levithan <stevenlevithan.com>
|
4 |
+
// MIT License
|
5 |
+
|
6 |
+
function parseUri (str) {
|
7 |
+
var o = parseUri.options,
|
8 |
+
m = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
|
9 |
+
uri = {},
|
10 |
+
i = 14;
|
11 |
+
|
12 |
+
while (i--) uri[o.key[i]] = m[i] || "";
|
13 |
+
|
14 |
+
uri[o.q.name] = {};
|
15 |
+
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
|
16 |
+
if ($1) uri[o.q.name][$1] = $2;
|
17 |
+
});
|
18 |
+
|
19 |
+
return uri;
|
20 |
+
}
|
21 |
+
|
22 |
+
parseUri.options = {
|
23 |
+
strictMode: false,
|
24 |
+
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
|
25 |
+
q: {
|
26 |
+
name: "queryKey",
|
27 |
+
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
|
28 |
+
},
|
29 |
+
parser: {
|
30 |
+
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
|
31 |
+
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
|
32 |
+
}
|
33 |
+
};
|
34 |
+
|
35 |
+
// --- parseUri ends ---
|
36 |
+
|
37 |
+
//Find the menu item whose URL best matches the currently open page.
|
38 |
+
var currentUri = parseUri(location.href);
|
39 |
+
var bestMatch = {
|
40 |
+
uri : null,
|
41 |
+
link : null,
|
42 |
+
matchingParams : -1,
|
43 |
+
differentParams : 10000
|
44 |
+
};
|
45 |
+
$('#adminmenu li > a').each(function(index, link) {
|
46 |
+
var uri = parseUri(link.href);
|
47 |
+
|
48 |
+
//Check for a close match - everything but query and #anchor.
|
49 |
+
var components = ['protocol', 'host', 'port', 'user', 'password', 'path'];
|
50 |
+
var isCloseMatch = true;
|
51 |
+
for (var i = 0; (i < components.length) && isCloseMatch; i++) {
|
52 |
+
isCloseMatch = isCloseMatch && (uri[components[i]] == currentUri[components[i]]);
|
53 |
+
}
|
54 |
+
|
55 |
+
if (!isCloseMatch) {
|
56 |
+
return true; //Skip to the next link.
|
57 |
+
}
|
58 |
+
|
59 |
+
//Calculate the number of matching and different query parameters.
|
60 |
+
var matchingParams = 0, differentParams = 0, param;
|
61 |
+
for(param in uri.queryKey) {
|
62 |
+
if (uri.queryKey.hasOwnProperty(param)) {
|
63 |
+
if (currentUri.queryKey.hasOwnProperty(param) && (uri.queryKey[param] == currentUri.queryKey[param])) {
|
64 |
+
matchingParams++;
|
65 |
+
} else {
|
66 |
+
differentParams++;
|
67 |
+
}
|
68 |
+
}
|
69 |
+
}
|
70 |
+
for(param in currentUri.queryKey) {
|
71 |
+
if (currentUri.queryKey.hasOwnProperty(param) && !uri.queryKey.hasOwnProperty(param)) {
|
72 |
+
differentParams++;
|
73 |
+
}
|
74 |
+
}
|
75 |
+
|
76 |
+
//Note: We're not checking for #anchor matches since it's extremely unlikely we'll ever encounter
|
77 |
+
//a case where two menu pages are identical except for the anchor.
|
78 |
+
|
79 |
+
if (
|
80 |
+
(matchingParams > bestMatch.matchingParams)
|
81 |
+
||
|
82 |
+
(
|
83 |
+
(matchingParams == bestMatch.matchingParams) &&
|
84 |
+
(differentParams < bestMatch.differentParams)
|
85 |
+
)
|
86 |
+
||
|
87 |
+
(
|
88 |
+
//Prefer sub-menu links.
|
89 |
+
(matchingParams == bestMatch.matchingParams) &&
|
90 |
+
(differentParams == bestMatch.differentParams) &&
|
91 |
+
!$(link).hasClass('menu-top')
|
92 |
+
)
|
93 |
+
) {
|
94 |
+
bestMatch.uri = uri;
|
95 |
+
bestMatch.link = link;
|
96 |
+
bestMatch.matchingParams = matchingParams;
|
97 |
+
bestMatch.differentParams = differentParams;
|
98 |
+
}
|
99 |
+
});
|
100 |
+
|
101 |
+
//Highlight and/or expand the best matching menu.
|
102 |
+
if (bestMatch.link !== null) {
|
103 |
+
var bestMatchLink = $(bestMatch.link);
|
104 |
+
var parentMenu = bestMatchLink.closest('li.menu-top');
|
105 |
+
//console.log('Best match is: ', bestMatchLink);
|
106 |
+
|
107 |
+
var otherHighlightedMenus = $('li.wp-has-current-submenu, li.menu-top.current', '#adminmenu').not(parentMenu);
|
108 |
+
|
109 |
+
var isWrongItemHighlighted = !bestMatchLink.hasClass('current');
|
110 |
+
var isWrongMenuHighlighted = !parentMenu.is('.wp-has-current-submenu, .current') ||
|
111 |
+
(otherHighlightedMenus.length > 0);
|
112 |
+
|
113 |
+
if (isWrongMenuHighlighted) {
|
114 |
+
//Account for users who use a plugin to keep all menus expanded.
|
115 |
+
var shouldCloseOtherMenus = $('li.wp-has-current-submenu', '#adminmenu').length <= 1;
|
116 |
+
if (shouldCloseOtherMenus) {
|
117 |
+
otherHighlightedMenus.removeClass('wp-menu-open');
|
118 |
+
otherHighlightedMenus.removeClass('wp-has-current-submenu current').addClass('wp-not-current-submenu');
|
119 |
+
}
|
120 |
+
|
121 |
+
var parentMenuAndLink = parentMenu.add('> a.menu-top', parentMenu);
|
122 |
+
parentMenuAndLink.removeClass('wp-not-current-submenu');
|
123 |
+
if (parentMenu.hasClass('wp-has-submenu')) {
|
124 |
+
parentMenuAndLink.addClass('wp-has-current-submenu wp-menu-open');
|
125 |
+
}
|
126 |
+
}
|
127 |
+
|
128 |
+
if (isWrongItemHighlighted) {
|
129 |
+
$('#adminmenu .current').removeClass('current');
|
130 |
+
bestMatchLink.addClass('current').closest('li').addClass('current');
|
131 |
+
}
|
132 |
+
}
|
133 |
+
});
|
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 |
*/
|
@@ -12,8 +12,7 @@ Author URI: http://w-shadow.com/blog/
|
|
12 |
if ( is_admin() ) {
|
13 |
|
14 |
//Load the plugin
|
15 |
-
require 'includes/menu-editor-core.php';
|
16 |
$wp_menu_editor = new WPMenuEditor(__FILE__, 'ws_menu_editor');
|
17 |
|
18 |
}//is_admin()
|
19 |
-
?>
|
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
|
7 |
Author: Janis Elsts
|
8 |
Author URI: http://w-shadow.com/blog/
|
9 |
*/
|
12 |
if ( is_admin() ) {
|
13 |
|
14 |
//Load the plugin
|
15 |
+
require dirname(__FILE__) . '/includes/menu-editor-core.php';
|
16 |
$wp_menu_editor = new WPMenuEditor(__FILE__, 'ws_menu_editor');
|
17 |
|
18 |
}//is_admin()
|
|
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.
|
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,12 @@ Plugins installed in the `mu-plugins` directory are treated as "always on", so y
|
|
61 |
|
62 |
== Changelog ==
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
= 1.1.6.1 =
|
65 |
* Tested on WP 3.3.2
|
66 |
* Added a user survey.
|
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.4
|
7 |
+
Stable tag: 1.1.7
|
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.7 =
|
65 |
+
* Tested on WP 3.4
|
66 |
+
* Fixed a rare "failed to decode input" error.
|
67 |
+
* Fixed menus not being expanded/collapsed properly when the current menu item has been moved to a different sub-menu.
|
68 |
+
* Added a shortlist of Pro version benefits to the editor page (can be hidden).
|
69 |
+
|
70 |
= 1.1.6.1 =
|
71 |
* Tested on WP 3.3.2
|
72 |
* Added a user survey.
|
uninstall.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
|
3 |
/**
|
4 |
* @author W-Shadow
|
5 |
-
* @copyright
|
6 |
*
|
7 |
* The uninstallation script.
|
8 |
*/
|
@@ -14,7 +14,9 @@ if( defined( 'ABSPATH') && defined('WP_UNINSTALL_PLUGIN') ) {
|
|
14 |
if ( function_exists('delete_site_option') ){
|
15 |
delete_site_option('ws_menu_editor');
|
16 |
}
|
17 |
-
|
18 |
-
}
|
19 |
|
20 |
-
|
|
|
|
|
|
|
|
2 |
|
3 |
/**
|
4 |
* @author W-Shadow
|
5 |
+
* @copyright 2012
|
6 |
*
|
7 |
* The uninstallation script.
|
8 |
*/
|
14 |
if ( function_exists('delete_site_option') ){
|
15 |
delete_site_option('ws_menu_editor');
|
16 |
}
|
|
|
|
|
17 |
|
18 |
+
//Remove hint visibility flags
|
19 |
+
if ( function_exists('delete_metadata') ) {
|
20 |
+
delete_metadata('user', 0, 'ame_show_hints', '', true);
|
21 |
+
}
|
22 |
+
}
|