From 4e29944b6cc46a790a0f1f417a57b2596a7f1829 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Tue, 1 Dec 2020 10:22:00 -0500 Subject: [PATCH] Allow WCA registered pages to register plugin items and categories (https://github.com/woocommerce/woocommerce-admin/pull/5717) * Allow WCA registered pages to register plugin items and categories * Don't allow top-level item registration through WCA * Remove is_top_level from menu API * Prevent directly setting woocommerce as parent ID --- .../src/Features/Analytics.php | 12 +- .../src/Features/Homescreen.php | 11 +- .../src/Features/Navigation/CoreMenu.php | 109 ++++++++++-------- .../src/Features/Navigation/Menu.php | 105 ++++------------- 4 files changed, 92 insertions(+), 145 deletions(-) diff --git a/plugins/woocommerce-admin/src/Features/Analytics.php b/plugins/woocommerce-admin/src/Features/Analytics.php index 15be6d0307f..99974f2faa3 100644 --- a/plugins/woocommerce-admin/src/Features/Analytics.php +++ b/plugins/woocommerce-admin/src/Features/Analytics.php @@ -235,14 +235,10 @@ class Analytics { ), ) : null, array( - 'id' => 'woocommerce-analytics-customers', - 'title' => __( 'Customers', 'woocommerce-admin' ), - 'parent' => 'woocommerce', - 'path' => '/customers', - 'nav_args' => array( - 'is_top_level' => true, - 'order' => 50, - ), + 'id' => 'woocommerce-analytics-customers', + 'title' => __( 'Customers', 'woocommerce-admin' ), + 'parent' => 'woocommerce', + 'path' => '/customers', ), array( 'id' => 'woocommerce-analytics-settings', diff --git a/plugins/woocommerce-admin/src/Features/Homescreen.php b/plugins/woocommerce-admin/src/Features/Homescreen.php index b4981de915b..2bf7ea8c332 100644 --- a/plugins/woocommerce-admin/src/Features/Homescreen.php +++ b/plugins/woocommerce-admin/src/Features/Homescreen.php @@ -69,12 +69,11 @@ class Homescreen { public function register_page() { wc_admin_register_page( array( - 'id' => 'woocommerce-home', - 'title' => __( 'Home', 'woocommerce-admin' ), - 'parent' => 'woocommerce', - 'path' => self::MENU_SLUG, - 'is_top_level' => true, - 'order' => 0, + 'id' => 'woocommerce-home', + 'title' => __( 'Home', 'woocommerce-admin' ), + 'parent' => 'woocommerce', + 'path' => self::MENU_SLUG, + 'order' => 0, ) ); } diff --git a/plugins/woocommerce-admin/src/Features/Navigation/CoreMenu.php b/plugins/woocommerce-admin/src/Features/Navigation/CoreMenu.php index 6f06a46c312..fc3c230a4cb 100644 --- a/plugins/woocommerce-admin/src/Features/Navigation/CoreMenu.php +++ b/plugins/woocommerce-admin/src/Features/Navigation/CoreMenu.php @@ -75,49 +75,43 @@ class CoreMenu { public static function get_categories() { return array( array( - 'title' => __( 'Orders', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-orders', - 'order' => 10, - 'is_top_level' => true, + 'title' => __( 'Orders', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-orders', + 'order' => 10, ), array( - 'title' => __( 'Products', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-products', - 'order' => 20, - 'is_top_level' => true, + 'title' => __( 'Products', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-products', + 'order' => 20, ), array( - 'title' => __( 'Analytics', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-analytics', - 'order' => 30, - 'is_top_level' => true, + 'title' => __( 'Analytics', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-analytics', + 'order' => 30, ), array( - 'title' => __( 'Marketing', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-marketing', - 'order' => 40, - 'is_top_level' => true, + 'title' => __( 'Marketing', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-marketing', + 'order' => 40, ), array( - 'title' => __( 'Settings', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-settings', - 'menuId' => 'secondary', - 'order' => 10, - 'url' => 'admin.php?page=wc-settings', - 'is_top_level' => true, + 'title' => __( 'Settings', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-settings', + 'menuId' => 'secondary', + 'order' => 10, + 'url' => 'admin.php?page=wc-settings', ), array( - 'title' => __( 'Tools', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-tools', - 'menuId' => 'secondary', - 'order' => 30, - 'is_top_level' => true, + 'title' => __( 'Tools', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-tools', + 'menuId' => 'secondary', + 'order' => 30, ), ); } @@ -140,31 +134,49 @@ class CoreMenu { continue; } - $wca_items[] = array_merge( + $path = isset( $page['path'] ) ? $page['path'] : null; + $item = array_merge( array( - 'id' => 'wc_admin-' . $page['path'], - 'url' => $page['path'], + 'id' => 'wc_admin-' . $path, + 'url' => $path, 'title' => $page['title'][0], - 'capability' => $page['capability'], + 'capability' => isset( $page['capability'] ) ? $page['capability'] : 'manage_woocommerce', ), $page['nav_args'] ); + + // Don't allow top-level items to be added to the primary menu. + if ( ! isset( $item['parent'] ) || 'woocommerce' === $item['parent'] ) { + $item['menuId'] = 'plugins'; + } + + $wca_items[] = $item; } $home_item = array(); if ( defined( '\Automattic\WooCommerce\Admin\Features\AnalyticsDashboard::MENU_SLUG' ) ) { $home_item = array( - 'id' => 'wc_admin-wc-admin&path=/', - 'title' => __( 'Home', 'woocommerce-admin' ), - 'url' => \Automattic\WooCommerce\Admin\Features\AnalyticsDashboard::MENU_SLUG, - 'is_top_level' => true, - 'order' => 0, + 'id' => 'wc_admin-wc-admin&path=/', + 'title' => __( 'Home', 'woocommerce-admin' ), + 'url' => \Automattic\WooCommerce\Admin\Features\AnalyticsDashboard::MENU_SLUG, + 'order' => 0, + ); + } + + $customers_item = array(); + if ( class_exists( '\Automattic\WooCommerce\Admin\Features\Analytics' ) ) { + $customers_item = array( + 'id' => 'woocommerce-analytics-customers', + 'title' => __( 'Customers', 'woocommerce-admin' ), + 'url' => wc_admin_url( '/customers' ), + 'order' => 50, ); } return array_merge( array( $home_item, + $customers_item, $order_items['all'], $order_items['new'], $product_items['all'], @@ -172,13 +184,12 @@ class CoreMenu { $coupon_items['default'], // Marketplace category. array( - 'title' => __( 'Marketplace', 'woocommerce-admin' ), - 'capability' => 'manage_woocommerce', - 'id' => 'woocommerce-marketplace', - 'url' => 'wc-addons', - 'menuId' => 'secondary', - 'order' => 20, - 'is_top_level' => true, + 'title' => __( 'Marketplace', 'woocommerce-admin' ), + 'capability' => 'manage_woocommerce', + 'id' => 'woocommerce-marketplace', + 'url' => 'wc-addons', + 'menuId' => 'secondary', + 'order' => 20, ), // Tools category. array( diff --git a/plugins/woocommerce-admin/src/Features/Navigation/Menu.php b/plugins/woocommerce-admin/src/Features/Navigation/Menu.php index 481a8bd9826..e6fce1c879a 100644 --- a/plugins/woocommerce-admin/src/Features/Navigation/Menu.php +++ b/plugins/woocommerce-admin/src/Features/Navigation/Menu.php @@ -49,13 +49,6 @@ class Menu { */ const CSS_CLASSES = 4; - /** - * Default parent menu - * - * @var string - */ - const DEFAULT_PARENT = 'woocommerce-settings'; - /** * Store menu items. * @@ -159,28 +152,24 @@ class Menu { } $defaults = array( - 'id' => '', - 'title' => '', - 'capability' => 'manage_woocommerce', - 'order' => 100, - 'migrate' => true, - 'menuId' => 'primary', - 'isCategory' => true, - 'parent' => self::DEFAULT_PARENT, - 'is_top_level' => false, + 'id' => '', + 'title' => '', + 'capability' => 'manage_woocommerce', + 'order' => 100, + 'migrate' => true, + 'menuId' => 'primary', + 'isCategory' => true, ); $menu_item = wp_parse_args( $args, $defaults ); $menu_item['title'] = wp_strip_all_tags( wp_specialchars_decode( $menu_item['title'] ) ); unset( $menu_item['url'] ); - if ( true === $menu_item['is_top_level'] ) { + if ( ! isset( $menu_item['parent'] ) ) { $menu_item['parent'] = 'woocommerce'; $menu_item['backButtonLabel'] = __( 'WooCommerce Home', 'woocommerce-admin' ); - } else { - $menu_item['parent'] = 'woocommerce' === $menu_item['parent'] ? self::DEFAULT_PARENT : $menu_item['parent']; } self::$menu_items[ $menu_item['id'] ] = $menu_item; @@ -222,24 +211,20 @@ class Menu { } $defaults = array( - 'id' => '', - 'title' => '', - 'parent' => self::DEFAULT_PARENT, - 'capability' => 'manage_woocommerce', - 'url' => '', - 'order' => 100, - 'migrate' => true, - 'menuId' => 'primary', - 'is_top_level' => false, + 'id' => '', + 'title' => '', + 'capability' => 'manage_woocommerce', + 'url' => '', + 'order' => 100, + 'migrate' => true, + 'menuId' => 'primary', ); $menu_item = wp_parse_args( $args, $defaults ); $menu_item['title'] = wp_strip_all_tags( wp_specialchars_decode( $menu_item['title'] ) ); $menu_item['url'] = self::get_callback_url( $menu_item['url'] ); - if ( true === $menu_item['is_top_level'] ) { + if ( ! isset( $menu_item['parent'] ) ) { $menu_item['parent'] = 'woocommerce'; - } else { - $menu_item['parent'] = 'woocommerce' === $menu_item['parent'] ? self::DEFAULT_PARENT : $menu_item['parent']; } self::$menu_items[ $menu_item['id'] ] = $menu_item; @@ -260,7 +245,6 @@ class Menu { * 'capability' => (string) Capability to view this menu item. * 'url' => (string) URL or callback to be used. Required. * 'migrate' => (bool) Whether or not to hide the item in the wp admin menu. - * 'menuId' => (string) The ID of the menu to add the item to. * 'order' => (int) Menu item order. * ). */ @@ -272,8 +256,7 @@ class Menu { $item_args = array_merge( $args, array( - 'menuId' => 'plugins', - 'is_top_level' => ! isset( $args['parent'] ), + 'menuId' => 'plugins', ) ); self::add_item( $item_args ); @@ -289,7 +272,6 @@ class Menu { * 'capability' => (string) Capability to view this menu item. * 'url' => (string) URL or callback to be used. Required. * 'migrate' => (bool) Whether or not to hide the item in the wp admin menu. - * 'menuId' => (string) The ID of the menu to add the category to. * 'order' => (int) Menu item order. * ). */ @@ -301,57 +283,12 @@ class Menu { $category_args = array_merge( $args, array( - 'menuId' => 'plugins', - 'is_top_level' => ! isset( $args['parent'] ), + 'menuId' => 'plugins', ) ); self::add_category( $category_args ); } - /** - * Adds a post type as a menu category. - * - * @param string $post_type Post type. - * @param array $args Array of menu item args. - */ - public static function add_post_type_category( $post_type, $args = array() ) { - $post_type_object = get_post_type_object( $post_type ); - - if ( ! $post_type_object ) { - return; - } - - self::add_category( - array_merge( - array( - 'title' => esc_attr( $post_type_object->labels->menu_name ), - 'capability' => $post_type_object->cap->edit_posts, - 'id' => $post_type, - 'is_top_level' => true, - ), - $args - ) - ); - self::add_item( - array( - 'parent' => $post_type, - 'title' => esc_attr( $post_type_object->labels->all_items ), - 'capability' => $post_type_object->cap->edit_posts, - 'id' => "{$post_type}-all-items", - 'url' => "edit.php?post_type={$post_type}", - ) - ); - self::add_item( - array( - 'parent' => $post_type, - 'title' => esc_attr( $post_type_object->labels->add_new ), - 'capability' => $post_type_object->cap->create_posts, - 'id' => "{$post_type}-add-new", - 'url' => "post-new.php?post_type={$post_type}", - ) - ); - } - /** * Get menu item templates for a given post type. * @@ -412,7 +349,11 @@ class Menu { $items = CoreMenu::get_items(); foreach ( $items as $item ) { - self::add_item( $item ); + if ( isset( $item['is_category'] ) && $item['is_category'] ) { + self::add_category( $item ); + } else { + self::add_item( $item ); + } } }