1
+ <?php
2
+ /**
3
+ * Administration Menu Class
4
+ *
5
+ * Add custom options to nav-menu.php
6
+ *
7
+ * @author James Collings <[email protected] >
8
+ * @version 0.0.1
9
+ */
10
+ class SubmenuAdmin{
11
+
12
+ /**
13
+ * Plugin config
14
+ * @var stdClass
15
+ */
16
+ private $ config = null ;
17
+
18
+ /**
19
+ * Setup class
20
+ * @param stdClass $config
21
+ * @return void
22
+ */
23
+ public function __construct (&$ config ){
24
+ $ this ->config = $ config ;
25
+
26
+ // include js/css
27
+ add_action ( 'admin_enqueue_scripts ' , array ($ this , 'load_scripts ' ));
28
+
29
+ // on menu save
30
+ add_action ( 'wp_update_nav_menu_item ' , array ($ this , 'save_nav_menu ' ), 10 , 3 );
31
+
32
+ add_action ( 'admin_notices ' , array ( $ this , 'display_admin_notification ' ) );
33
+ add_action ( 'admin_init ' , array ( $ this , 'hide_admin_notification ' ) );
34
+
35
+ // register admin settings
36
+ add_action ( 'admin_init ' , array ($ this , 'register_settings ' ));
37
+
38
+ // add settings page
39
+ add_action ( 'admin_menu ' , array ($ this , 'settings_menu ' ));
40
+
41
+ // load settings
42
+ $ options = get_option ( 'jcs-general_settings ' );
43
+ $ this ->config ->edit_walker = isset ($ options ['enable_walker ' ]) && $ options ['enable_walker ' ] == 1 ? 1 : 0 ;
44
+
45
+ if ($ this ->config ->edit_walker == 1 ){
46
+ add_filter ( 'wp_edit_nav_menu_walker ' , array ($ this , 'set_edit_walker ' ));
47
+ }else {
48
+ add_action ( 'wp_ajax_jcs_get_menu_item ' , array ( $ this , 'ajax_get_menu_item ' ) );
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Attach plugin assets
54
+ * @return void
55
+ */
56
+ public function load_scripts (){
57
+
58
+ // attach files
59
+ wp_enqueue_script ('jc-submenu-scripts ' , $ this ->config ->plugin_url .'/assets/js/main.js ' , array ('jquery ' ), $ this ->config ->version , true );
60
+ wp_enqueue_style ('jc-submenu-admin-css ' , $ this ->config ->plugin_url .'/assets/css/admin.css ' , array (), $ this ->config ->version );
61
+
62
+ // ajax files
63
+ if ($ this ->config ->edit_walker == 0 ){
64
+ wp_enqueue_script ( 'jc-submenu-ajax ' , $ this ->config ->plugin_url .'/assets/js/ajax.js ' , array ('jquery ' ), $ this ->config ->version );
65
+ wp_localize_script ( 'jc-submenu-ajax ' , 'ajax_object ' , array ( 'ajax_url ' => admin_url ( 'admin-ajax.php ' ), 'we_value ' => 1234 ) );
66
+ }
67
+ }
68
+
69
+ public function settings_menu (){
70
+ // add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );
71
+ add_submenu_page ( 'options-general.php ' , 'JC Submenu ' , 'JC Submenu ' , 'manage_options ' , 'jc-submenu ' , array ($ this , 'admin_settings_view ' ) );
72
+ }
73
+
74
+ public function admin_settings_view (){
75
+ include $ this ->config ->plugin_dir . 'views/settings.php ' ;
76
+ }
77
+
78
+ /**
79
+ * Save custom menu item options
80
+ * @param int $menu_id
81
+ * @param int $menu_item_db_id
82
+ * @param array $args
83
+ * @return void
84
+ */
85
+ public function save_nav_menu ($ menu_id , $ menu_item_db_id , $ args ){
86
+
87
+ if (!isset ($ _POST ['menu-item-title ' ]) || empty ($ _POST ['menu-item-title ' ]))
88
+ return false ;
89
+
90
+ foreach ($ _POST ['menu-item-title ' ] as $ menu_item_id => $ menu_item_title ){
91
+
92
+ if (isset ($ _POST [$ this ->config ->prefix .'-admin ' ]) && array_key_exists ($ menu_item_id , $ _POST [$ this ->config ->prefix .'-admin ' ])){
93
+ SubmenuModel::save_meta ($ menu_item_id , 'admin ' , 1 );
94
+ }elseif (isset ($ _POST [$ this ->config ->prefix .'-active ' ]) && array_key_exists ($ menu_item_id , $ _POST [$ this ->config ->prefix .'-active ' ])){
95
+ SubmenuModel::save_meta ($ menu_item_id , 'admin ' , 0 );
96
+ }
97
+
98
+ if (isset ($ _POST [$ this ->config ->prefix .'-autopop ' ]) && array_key_exists ($ menu_item_id , $ _POST [$ this ->config ->prefix .'-autopop ' ])){
99
+ // save post meta for active items
100
+ SubmenuModel::save_menu_item ($ menu_item_id );
101
+
102
+ }elseif (isset ($ _POST [$ this ->config ->prefix .'-active ' ]) && array_key_exists ($ menu_item_id , $ _POST [$ this ->config ->prefix .'-active ' ])){
103
+ // clear post meta for inactive items
104
+ SubmenuModel::clear_menu_item ($ menu_item_id );
105
+ }
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Output Usage Notification
111
+ * @return void
112
+ */
113
+ public function display_admin_notification (){
114
+
115
+ global $ current_user ;
116
+ global $ pagenow ;
117
+
118
+ $ user_id = $ current_user ->ID ;
119
+ $ response = get_user_meta ($ user_id , 'jcs-show_notification ' , true );
120
+
121
+ if ( current_user_can ( 'manage_options ' ) && (!$ response || $ response < $ this ->config ->version_check ) && $ pagenow == 'nav-menus.php ' ): ?>
122
+
123
+ <div class="updated">
124
+ <p>Need help with using JC Submenu? view the <a href="http://jamescollings.co.uk/wordpress-plugins/jc-submenu/" target="_blank">documentation here</a> | <a href="?jc_hide_notice=1">Hide this notice</a></p>
125
+ </div>
126
+
127
+ <?php
128
+ endif ;
129
+ }
130
+
131
+ /**
132
+ * Mark notification as viewed
133
+ * @return void
134
+ */
135
+ public function hide_admin_notification (){
136
+
137
+ global $ current_user ;
138
+ $ user_id = $ current_user ->ID ;
139
+
140
+ if (isset ($ _GET ['jc_hide_notice ' ]) && $ _GET ['jc_hide_notice ' ] == 1 ){
141
+
142
+ delete_user_meta ($ user_id , 'jcs-show_notification ' );
143
+ add_user_meta ( $ user_id , 'jcs-show_notification ' , $ this ->config ->version_check , true );
144
+ }
145
+
146
+ }
147
+
148
+ /**
149
+ * Change nav-menu.php walker
150
+ * @return string
151
+ */
152
+ public function set_edit_walker (){
153
+ return 'JC_Submenu_Admin_Walker ' ;
154
+ }
155
+
156
+ /**
157
+ * Load menu admin edit view
158
+ * @return void
159
+ */
160
+ public function ajax_get_menu_item (){
161
+ $ item_id = intval ($ _POST ['id ' ]);
162
+ include $ this ->config ->plugin_dir . 'views/edit.php ' ;
163
+ die ();
164
+ }
165
+
166
+ public function register_settings (){
167
+
168
+ // Settings
169
+ register_setting ('jcs_settings ' , 'jcs ' . '-general_settings ' , array ($ this , 'save_settings ' ));
170
+
171
+ add_settings_section ('settings ' , 'General Settings ' , array ($ this , 'section_settings ' ), 'tab_settings ' );
172
+
173
+ add_settings_field ('enable_walker ' , 'Enable Admin Walker ' , array ($ this , 'field_callback ' ), 'tab_settings ' , 'settings ' , array (
174
+ 'type ' => 'checkbox ' ,
175
+ 'field_id ' => 'enable_walker ' ,
176
+ 'section_id ' => 'settings ' ,
177
+ 'setting_id ' => 'jcs ' . '-general_settings '
178
+ ));
179
+
180
+ }
181
+
182
+ /**
183
+ * Settings Section Text
184
+ *
185
+ * @return void
186
+ */
187
+ public function section_settings ($ section )
188
+ {
189
+ switch ($ section ['id ' ]){
190
+ case 'settings ' :
191
+ echo 'Enable Admin Walker, only do this if you are having problems with editing your menus. ' ;
192
+ break ;
193
+ }
194
+
195
+ }
196
+
197
+ /**
198
+ * Create Settings Fields
199
+ *
200
+ * @param array $args
201
+ * @return void
202
+ */
203
+ public function field_callback ($ args ){
204
+ $ multiple = false ;
205
+ extract ($ args );
206
+ $ options = get_option ($ setting_id );
207
+ switch ($ args ['type ' ])
208
+ {
209
+ case 'checkbox ' :{
210
+ $ checked = isset ($ options [$ field_id ]) && $ options [$ field_id ] == 1 ? 'checked="checked" ' : '' ;
211
+ ?>
212
+ <input type="checkbox" class="checkbox" id="<?php echo $ setting_id ; ?> " name="<?php echo $ setting_id ; ?> [<?php echo $ field_id ; ?> ]" value="1" <?php echo $ checked ; ?> />
213
+ <?php
214
+ break ;
215
+ }
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Save Settings
221
+ *
222
+ * @param array $args
223
+ * @return array
224
+ */
225
+ public function save_settings ($ args ){
226
+
227
+ return $ args ;
228
+ }
229
+
230
+ }
0 commit comments