PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
← All changes | inc/admin/class-lp-admin-menu.php +126 -30 4.3.74.4.8 View file →
@@ -6,8 +6,10 @@
6 6 * @package LearnPress
7 7 * @version 1.0
8 8 */
9 9
10 +use LearnPress\Helpers\Config;
11 +
10 12 defined( 'ABSPATH' ) || exit;
11 13
12 14 /**
13 15 * Class LP_Admin_Menu
@@ -21,8 +23,15 @@
21 23 */
22 24 protected $menu_items = array();
23 25
24 26 /**
27 + * Array of menu groups.
28 + *
29 + * @var array
30 + */
31 + protected $group_menus = array();
32 +
33 + /**
25 34 * Main menu capability.
26 35 *
27 36 * @var string
28 37 */
@@ -32,8 +41,9 @@
32 41 * LP_Admin_Menu Construct
33 42 */
34 43 public function __construct() {
35 44 add_action( 'admin_menu', array( $this, 'admin_menu' ) );
45 + add_action( 'admin_menu', array( $this, 'lp_group_menus' ), 9999 );
36 46
37 47 if ( apply_filters( 'learn_press_show_admin_bar_courses_page', true ) ) {
38 48 add_action( 'admin_bar_menu', array( $this, 'admin_bar_menus' ), 50 );
39 49 }
@@ -56,25 +66,25 @@
56 66 if ( ! current_user_can( 'administrator' ) ) {
57 67 return;
58 68 }
59 69
60 - $url_pages = [
61 - 'lp-courses' => [
70 + $url_pages = array(
71 + 'lp-courses' => array(
62 72 'title' => esc_html__( 'View Page Courses', 'learnpress' ),
63 73 'href' => learn_press_get_page_link( 'courses' ),
64 74 'parent' => 'site-name',
65 - ],
66 - 'lp-profile' => [
75 + ),
76 + 'lp-profile' => array(
67 77 'title' => esc_html__( 'View Page Profile', 'learnpress' ),
68 78 'href' => learn_press_get_page_link( 'profile' ),
69 79 'parent' => 'site-name',
70 - ],
71 - 'lp-instructors' => [
80 + ),
81 + 'lp-instructors' => array(
72 82 'title' => esc_html__( 'View Page Instructors', 'learnpress' ),
73 83 'href' => learn_press_get_page_link( 'instructors' ),
74 84 'parent' => 'site-name',
75 - ],
76 - ];
85 + ),
86 + );
77 87
78 88 foreach ( $url_pages as $id => $url_page ) {
79 89 $wp_admin_bar->add_node(
80 90 array(
@@ -110,24 +120,16 @@
110 120 LP_PLUGIN_URL . '/assets/images/logo-menu.png',
111 121 '3.14'
112 122 );
113 123
114 - // Default submenu items
115 - $menu_items = array();
116 - $menu_items['statistic'] = include_once 'sub-menus/class-lp-submenu-statistics.php';
117 - $menu_items['student-enrolled'] = include_once 'sub-menus/class-lp-submenu-students-enrolled.php';
118 - $menu_items['addons'] = include_once 'sub-menus/class-lp-submenu-addons.php';
119 - $menu_items['themes'] = include_once 'sub-menus/class-lp-submenu-themes.php';
120 - $menu_items['settings'] = include_once 'sub-menus/class-lp-submenu-settings.php';
121 - $menu_items['tools'] = include_once 'sub-menus/class-lp-submenu-tools.php';
122 - $menu_items['categories'] = include_once 'sub-menus/class-lp-submenu-categories.php';
123 - $menu_items['tags'] = include_once 'sub-menus/class-lp-submenu-tags.php';
124 + // Default submenu items and groups from config.
125 + $wp_menus_config = Config::instance()->get( 'wp-menus' );
126 + $menu_items = $wp_menus_config['menus'] ?? array();
127 + $this->group_menus = $wp_menus_config['group_menus'] ?? array();
124 128
129 + // Old hook declare type Class Submenu.
125 130 $menu_items = apply_filters( 'learn-press/admin/menu-items', $menu_items );
126 131
127 - // Sort menu items by its priority
128 - uasort( $menu_items, 'learn_press_sort_list_by_priority_callback' );
129 -
130 132 add_action(
131 133 'parent_file',
132 134 function ( $parent_file ) {
133 135 global $current_screen;
@@ -144,22 +146,30 @@
144 146 );
145 147
146 148 if ( $menu_items ) {
147 149 foreach ( $menu_items as $k => $item ) {
150 + // Third-party classes passed as string.
148 151 if ( is_string( $item ) && class_exists( $item ) ) {
149 152 $item = new $item();
150 153 }
151 154
152 - if ( ! $item instanceof LP_Abstract_Submenu ) {
155 + // For declare type new menu item from config array.
156 + if ( is_array( $item ) ) {
157 + add_submenu_page(
158 + 'learn_press',
159 + $item['page_title'] ?? '',
160 + $item['menu_title'] ?? '',
161 + $item['capability'] ?? '',
162 + $item['id'] ?? '',
163 + $item['callback'] ?? false,
164 + $item['priority'] ?? 10
165 + //$item->get_priority()
166 + );
167 +
153 168 continue;
154 169 }
155 170
156 - if ( in_array( $k, [ 'tags', 'categories' ] ) ) {
157 - $callback = false;
158 - } else {
159 - $callback = $item->get_callback();
160 - }
161 -
171 + // For declare type old menu item from class.
162 172 add_submenu_page(
163 173 'learn_press',
164 174 $item->get_page_title(),
165 175 $item->get_menu_title(),
@@ -164,15 +174,101 @@
164 174 $item->get_page_title(),
165 175 $item->get_menu_title(),
166 176 $item->get_capability(),
167 177 $item->get_id(),
168 - $callback
178 + $item->get_callback(),
179 + //$item->get_priority()
169 180 );
170 181 }
171 182 $this->menu_items = $menu_items;
172 183 }
173 184
174 - //$addons = LP_Admin::instance()->get_addons();
185 + // $addons = LP_Admin::instance()->get_addons();
186 + }
187 +
188 + /**
189 + * Group and reorder the LearnPress admin submenu items.
190 + *
191 + * Items are grouped by the 'learn-press/wp-admin/menu-group' filter
192 + * and ordered by the default group and slug order. Unmatched items
193 + * are added to the 'operations' group. A divider is inserted between
194 + * each group.
195 + *
196 + * @return void
197 + */
198 + public function lp_group_menus() {
199 + global $submenu;
200 +
201 + $lp_menus = $submenu['learn_press'] ?? [];
202 + if ( empty( $lp_menus ) ) {
203 + return;
204 + }
205 +
206 + $group_menus_default = $this->group_menus;
207 + $group_menus = array();
208 +
209 + // Group menus by default
210 + foreach ( $lp_menus as $item ) {
211 + $slug = $item[2] ?? '';
212 + $in_group = false;
213 +
214 + foreach ( $group_menus_default as $group => $menus ) {
215 + if ( in_array( $slug, $menus ) ) {
216 + $group_menus[ $group ][] = $item;
217 + $in_group = true;
218 + }
219 + }
220 +
221 + // If not in any group, add to operations
222 + if ( ! $in_group ) {
223 + $group_menus['operations'][] = $item;
224 + }
225 + }
226 +
227 + // Reorder menus
228 + $menus_new = [];
229 + $i = 0;
230 + $count = count( $group_menus_default );
231 + foreach ( $group_menus_default as $group => $menus ) {
232 + if ( ! isset( $group_menus[ $group ] ) ) {
233 + continue;
234 + }
235 +
236 + // Order items by the default slug order, then append leftovers.
237 + $items_by_slug = [];
238 + foreach ( $group_menus[ $group ] as $item ) {
239 + $items_by_slug[ $item[2] ?? '' ] = $item;
240 + }
241 +
242 + foreach ( $menus as $menu_slug ) {
243 + if ( ! is_string( $menu_slug ) ) {
244 + continue;
245 + }
246 +
247 + if ( isset( $items_by_slug[ $menu_slug ] ) ) {
248 + $menus_new[] = $items_by_slug[ $menu_slug ];
249 + unset( $items_by_slug[ $menu_slug ] );
250 + }
251 + }
252 +
253 + foreach ( $items_by_slug as $item ) {
254 + $menus_new[] = $item;
255 + }
256 +
257 + ++$i;
258 + if ( $i < $count ) {
259 + // Add divider between groups
260 + $menus_new[] = array(
261 + '',
262 + $this->get_capability(),
263 + '#',
264 + '',
265 + 'lp-menu-divider lp-menu-divider-' . $group,
266 + );
267 + }
268 + }
269 +
270 + $submenu['learn_press'] = $menus_new;
175 271 }
176 272
177 273 /**
178 274 * Callback function using for "usort".