PluginProbe
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent / 3.5.4
SupportCandy – AI Customer Support Ticket System & Live Chatbot Agent v3.5.4
3.5.4 3.5.3 3.5.2 3.5.1 3.4.9 3.5.0 3.4.8 3.4.7 trunk 2.3.1 3.3.6 3.3.7 3.3.8 3.3.9 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6
← All changes | includes/admin/class-wpsc-admin.php +148 -107 3.4.6 → 3.5.4 View file →
@@ -126,130 +126,171 @@
126 126 'dashicons-sos',
127 127 25
128 128 );
129 129
130 - add_submenu_page(
131 - 'wpsc-tickets',
132 - esc_attr__( 'Ticket List', 'supportcandy' ),
133 - esc_attr__( 'Tickets', 'supportcandy' ),
134 - 'wpsc_agent',
135 - 'wpsc-tickets',
136 - array( 'WPSC_Tickets', 'layout' )
137 - );
130 + do_action( 'wpsc_before_setting_admin_menu' );
138 131
139 - if ( $current_user->is_agent && $current_user->agent->has_cap( 'at-access' ) ) {
140 - add_submenu_page(
141 - 'wpsc-tickets',
142 - esc_attr__( 'Archived', 'supportcandy' ),
143 - esc_attr__( 'Archived', 'supportcandy' ),
144 - 'wpsc_agent',
145 - 'wpsc-archive-tickets',
146 - array( 'WPSC_Archive_Ticket_List', 'layout' )
147 - );
148 - }
149 -
150 - add_submenu_page(
132 + $menu_slugs = array(
151 133 'wpsc-tickets',
152 - esc_attr__( 'Customers', 'supportcandy' ),
153 - esc_attr__( 'Customers', 'supportcandy' ),
154 - 'manage_options',
134 + 'wpsc-ai-chatbot',
135 + 'wpsc-archive-tickets',
136 + 'wpsc-ai-assistant',
155 137 'wpsc-customers',
156 - array( 'WPSC_Customers', 'layout' )
157 - );
158 -
159 - add_submenu_page(
160 - 'wpsc-tickets',
161 - esc_attr__( 'Support Agents', 'supportcandy' ),
162 - esc_attr__( 'Support Agents', 'supportcandy' ),
163 - 'manage_options',
164 138 'wpsc-support-agents',
165 - array( 'WPSC_Support_Agents', 'layout' )
166 - );
167 -
168 - add_submenu_page(
169 - 'wpsc-tickets',
170 - esc_attr__( 'Custom Fields', 'supportcandy' ),
171 - esc_attr__( 'Custom Fields', 'supportcandy' ),
172 - 'manage_options',
173 139 'wpsc-ticket-form',
174 - array( 'WPSC_CF_Settings', 'layout' )
175 - );
176 -
177 - add_submenu_page(
178 - 'wpsc-tickets',
179 - esc_attr__( 'Ticket List', 'supportcandy' ),
180 - esc_attr__( 'Ticket List', 'supportcandy' ),
181 - 'manage_options',
182 140 'wpsc-ticket-list',
183 - array( 'WPSC_Ticket_List_Settings', 'layout' )
141 + 'wpsc-email-notifications',
142 + 'wpsc-canned-reply',
143 + 'wpsc-reports',
144 + 'wpsc-customer-feedback',
145 + 'wpsc-settings',
146 + 'wpsc-license',
147 + 'wpsc-add-ons',
148 + 'wpsc-other-plugins',
149 + 'wpsc-task-manager',
150 + 'wpsc-recent-activities',
184 151 );
152 + $menu_slugs = apply_filters( 'wpsc_admin_menu_slugs', $menu_slugs );
185 153
186 - add_submenu_page(
187 - 'wpsc-tickets',
188 - esc_attr__( 'Email Notifications', 'supportcandy' ),
189 - esc_attr__( 'Email Notifications', 'supportcandy' ),
190 - 'manage_options',
191 - 'wpsc-email-notifications',
192 - array( 'WPSC_EN_Settings', 'layout' )
154 + $admin_submenus = array(
155 + array(
156 + 'parent_slug' => 'wpsc-tickets',
157 + 'page_title' => 'Ticket List',
158 + 'menu_title' => 'Tickets',
159 + 'capability' => 'wpsc_agent',
160 + 'menu_slug' => 'wpsc-tickets',
161 + 'callback' => array( 'WPSC_Tickets', 'layout' ),
162 + ),
163 + array(
164 + 'parent_slug' => 'wpsc-tickets',
165 + 'page_title' => 'Archived',
166 + 'menu_title' => 'Archived',
167 + 'capability' => 'wpsc_agent',
168 + 'menu_slug' => 'wpsc-archive-tickets',
169 + 'callback' => array( 'WPSC_Archive_Ticket_List', 'layout' ),
170 + ),
171 + array(
172 + 'parent_slug' => 'wpsc-tickets',
173 + 'page_title' => 'Customers',
174 + 'menu_title' => 'Customers',
175 + 'capability' => 'manage_options',
176 + 'menu_slug' => 'wpsc-customers',
177 + 'callback' => array( 'WPSC_Customers', 'layout' ),
178 + ),
179 + array(
180 + 'parent_slug' => 'wpsc-tickets',
181 + 'page_title' => 'Support Agents',
182 + 'menu_title' => 'Support Agents',
183 + 'capability' => 'manage_options',
184 + 'menu_slug' => 'wpsc-support-agents',
185 + 'callback' => array( 'WPSC_Support_Agents', 'layout' ),
186 + ),
187 + array(
188 + 'parent_slug' => 'wpsc-tickets',
189 + 'page_title' => 'Custom Fields',
190 + 'menu_title' => 'Custom Fields',
191 + 'capability' => 'manage_options',
192 + 'menu_slug' => 'wpsc-ticket-form',
193 + 'callback' => array( 'WPSC_CF_Settings', 'layout' ),
194 + ),
195 + array(
196 + 'parent_slug' => 'wpsc-tickets',
197 + 'page_title' => 'Ticket List',
198 + 'menu_title' => 'Ticket List',
199 + 'capability' => 'manage_options',
200 + 'menu_slug' => 'wpsc-ticket-list',
201 + 'callback' => array( 'WPSC_Ticket_List_Settings', 'layout' ),
202 + ),
203 + array(
204 + 'parent_slug' => 'wpsc-tickets',
205 + 'page_title' => 'Email Notifications',
206 + 'menu_title' => 'Email Notifications',
207 + 'capability' => 'manage_options',
208 + 'menu_slug' => 'wpsc-email-notifications',
209 + 'callback' => array( 'WPSC_EN_Settings', 'layout' ),
210 + ),
211 + array(
212 + 'parent_slug' => 'wpsc-tickets',
213 + 'page_title' => 'Settings',
214 + 'menu_title' => 'Settings',
215 + 'capability' => 'manage_options',
216 + 'menu_slug' => 'wpsc-settings',
217 + 'callback' => array( 'WPSC_Settings', 'layout' ),
218 + ),
219 + array(
220 + 'parent_slug' => 'wpsc-tickets',
221 + 'page_title' => 'Licenses',
222 + 'menu_title' => 'Licenses',
223 + 'capability' => 'manage_options',
224 + 'menu_slug' => 'wpsc-license',
225 + 'callback' => array( 'WPSC_License', 'layout' ),
226 + ),
227 + array(
228 + 'parent_slug' => 'wpsc-tickets',
229 + 'page_title' => 'Pro Features',
230 + 'menu_title' => '<strong style="color: #F1C40F;">Pro Features</strong>',
231 + 'capability' => 'manage_options',
232 + 'menu_slug' => 'wpsc-add-ons',
233 + 'callback' => array( 'WPSC_Addons', 'layout' ),
234 + ),
235 + array(
236 + 'parent_slug' => 'wpsc-tickets',
237 + 'page_title' => 'Other Plugins',
238 + 'menu_title' => '<strong style="color: #F1C40F;">Other Plugins</strong>',
239 + 'capability' => 'manage_options',
240 + 'menu_slug' => 'wpsc-other-plugins',
241 + 'callback' => array( 'WPSC_Other_Plugins', 'layout' ),
242 + ),
243 + array(
244 + 'parent_slug' => ' ',
245 + 'page_title' => 'Task Manager',
246 + 'menu_title' => '',
247 + 'capability' => 'manage_options',
248 + 'menu_slug' => 'wpsc-task-manager',
249 + 'callback' => array( 'WPSC_Task_Scheduler', 'perform_manual_scheduler' ),
250 + ),
251 + array(
252 + 'parent_slug' => ' ',
253 + 'page_title' => 'Recent Activites',
254 + 'menu_title' => '',
255 + 'capability' => 'manage_options',
256 + 'menu_slug' => 'wpsc-recent-activities',
257 + 'callback' => array( 'WPSC_RA_Logs', 'layout' ),
258 + ),
193 259 );
260 + $admin_submenus = apply_filters( 'wpsc_admin_submenus_data', $admin_submenus );
194 261
195 - do_action( 'wpsc_before_setting_admin_menu' );
262 + // Create a lookup array for submenus to improve performance.
263 + $submenu_lookup = array_column( $admin_submenus, null, 'menu_slug' );
264 + foreach ( $menu_slugs as $menu_slug ) {
196 265
197 - add_submenu_page(
198 - 'wpsc-tickets',
199 - esc_attr__( 'Settings', 'supportcandy' ),
200 - esc_attr__( 'Settings', 'supportcandy' ),
201 - 'manage_options',
202 - 'wpsc-settings',
203 - array( 'WPSC_Settings', 'layout' )
204 - );
266 + // Menu slug not registered.
267 + if ( ! isset( $submenu_lookup[ $menu_slug ] ) ) {
268 + continue;
269 + }
205 270
206 - add_submenu_page(
207 - 'wpsc-tickets',
208 - esc_attr__( 'Licenses', 'supportcandy' ),
209 - esc_attr__( 'Licenses', 'supportcandy' ),
210 - 'manage_options',
211 - 'wpsc-license',
212 - array( 'WPSC_License', 'layout' )
213 - );
271 + // Archive menu permission.
272 + if ( 'wpsc-archive-tickets' === $menu_slug &&
273 + ! ( $current_user->is_agent && ! empty( $current_user->agent ) && $current_user->agent->has_cap( 'at-access' ) ) ) {
274 + continue;
275 + }
214 276
215 - add_submenu_page(
216 - 'wpsc-tickets',
217 - esc_attr__( 'Pro Features', 'supportcandy' ),
218 - '<strong style="color: #F1C40F;">' . esc_attr__( 'Pro Features', 'supportcandy' ) . '</strong>',
219 - 'manage_options',
220 - 'wpsc-add-ons',
221 - array( 'WPSC_Addons', 'layout' )
222 - );
277 + $submenu = $submenu_lookup[ $menu_slug ];
223 278
224 - add_submenu_page(
225 - 'wpsc-tickets',
226 - esc_attr__( 'Other Plugins', 'supportcandy' ),
227 - '<strong style="color: #F1C40F;">' . esc_attr__( 'Other Plugins', 'supportcandy' ) . '</strong>',
228 - 'manage_options',
229 - 'wpsc-other-plugins',
230 - array( 'WPSC_Other_Plugins', 'layout' )
231 - );
279 + // Validate required keys.
280 + if ( empty( $submenu['parent_slug'] ) || empty( $submenu['page_title'] ) || empty( $submenu['menu_slug'] ) || empty( $submenu['callback'] ) ) {
281 + continue;
282 + }
232 283
233 - // hidden submenu page for manual scheduled tasks.
234 - add_submenu_page(
235 - ' ',
236 - esc_attr__( 'Task Manager', 'supportcandy' ),
237 - '',
238 - 'manage_options',
239 - 'wpsc-task-manager',
240 - array( 'WPSC_Task_Scheduler', 'perform_manual_scheduler' )
241 - );
242 -
243 - // hidden submenu page for recent activity.
244 - add_submenu_page(
245 - ' ',
246 - esc_attr__( 'Recent Activites', 'supportcandy' ),
247 - '',
248 - 'manage_options',
249 - 'wpsc-recent-activities',
250 - array( 'WPSC_RA_Logs', 'layout' )
251 - );
284 + add_submenu_page(
285 + (string) $submenu['parent_slug'],
286 + esc_attr( $submenu['page_title'] ),
287 + wp_kses_post( $submenu['menu_title'] ?? '' ),
288 + $submenu['capability'] ?? 'manage_options',
289 + (string) $submenu['menu_slug'],
290 + $submenu['callback']
291 + );
292 + }
252 293 }
253 294
254 295 /**
255 296 * Get localization data for the admin scripts