Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 23 | class WP_REST_Menus { |
||
|
|
|||
| 24 | |||
| 25 | |||
| 26 | /** |
||
| 27 | * Get WP API namespace. |
||
| 28 | * |
||
| 29 | * @since 1.2.0 |
||
| 30 | * @return string |
||
| 31 | */ |
||
| 32 | public static function get_api_namespace() { |
||
| 35 | |||
| 36 | |||
| 37 | /** |
||
| 38 | * Get WP API Menus namespace. |
||
| 39 | * |
||
| 40 | * @since 1.2.1 |
||
| 41 | * @return string |
||
| 42 | */ |
||
| 43 | public static function get_plugin_namespace() { |
||
| 46 | |||
| 47 | |||
| 48 | /** |
||
| 49 | * Register menu routes for WP API v2. |
||
| 50 | * |
||
| 51 | * @since 1.2.0 |
||
| 52 | * @return array |
||
| 53 | */ |
||
| 54 | public function register_routes() { |
||
| 96 | |||
| 97 | |||
| 98 | /** |
||
| 99 | * Get menus. |
||
| 100 | * |
||
| 101 | * @since 1.2.0 |
||
| 102 | * @param $request |
||
| 103 | * @return array All registered menus |
||
| 104 | */ |
||
| 105 | public function get_menus( $request ) { |
||
| 143 | |||
| 144 | |||
| 145 | /** |
||
| 146 | * Get a menu. |
||
| 147 | * |
||
| 148 | * @since 1.2.0 |
||
| 149 | * @param $request |
||
| 150 | * @return array Menu data |
||
| 151 | */ |
||
| 152 | public function get_menu( $request ) { |
||
| 153 | |||
| 154 | $menu = (string) $request['menu']; |
||
| 155 | $rest_url = get_rest_url() . self::get_api_namespace() . '/menus/'; |
||
| 156 | $wp_menu_object = $menu ? wp_get_nav_menu_object( $menu ) : array(); |
||
| 157 | $wp_menu_items = $menu ? wp_get_nav_menu_items( $menu ) : array(); |
||
| 158 | |||
| 159 | $rest_menu = array(); |
||
| 160 | |||
| 161 | View Code Duplication | if ( $wp_menu_object ) : |
|
| 162 | |||
| 163 | $menu = (array) $wp_menu_object; |
||
| 164 | $rest_menu['ID'] = abs( $menu['term_id'] ); |
||
| 165 | $rest_menu['name'] = $menu['name']; |
||
| 166 | $rest_menu['slug'] = $menu['slug']; |
||
| 167 | $rest_menu['description'] = $menu['description']; |
||
| 168 | $rest_menu['count'] = abs( $menu['count'] ); |
||
| 169 | |||
| 170 | $rest_menu_items = array(); |
||
| 171 | foreach ( $wp_menu_items as $item_object ) { |
||
| 172 | $rest_menu_items[] = $this->format_menu_item( $item_object ); |
||
| 173 | } |
||
| 174 | |||
| 175 | $rest_menu_items = $this->nested_menu_items($rest_menu_items, 0); |
||
| 176 | |||
| 177 | $rest_menu['items'] = $rest_menu_items; |
||
| 178 | $rest_menu['meta']['links']['collection'] = $rest_url; |
||
| 179 | $rest_menu['meta']['links']['self'] = $rest_url . $menu; |
||
| 180 | |||
| 181 | endif; |
||
| 182 | |||
| 183 | return apply_filters( 'rest_menus_format_menu', $rest_menu ); |
||
| 184 | } |
||
| 185 | |||
| 186 | |||
| 187 | /** |
||
| 188 | * Handle nested menu items. |
||
| 189 | * |
||
| 190 | * Given a flat array of menu items, split them into parent/child items |
||
| 191 | * and recurse over them to return children nested in their parent. |
||
| 192 | * |
||
| 193 | * @since 1.2.0 |
||
| 194 | * @param $menu_items |
||
| 195 | * @param $parent |
||
| 196 | * @return array |
||
| 197 | */ |
||
| 198 | private function nested_menu_items( &$menu_items, $parent = null ) { |
||
| 221 | |||
| 222 | |||
| 223 | /** |
||
| 224 | * Check if a collection of menu items contains an item that is the parent id of 'id'. |
||
| 225 | * |
||
| 226 | * @since 1.2.0 |
||
| 227 | * @param array $items |
||
| 228 | * @param int $id |
||
| 229 | * @return array |
||
| 230 | */ |
||
| 231 | private function has_children( $items, $id ) { |
||
| 236 | |||
| 237 | |||
| 238 | /** |
||
| 239 | * Get menu locations. |
||
| 240 | * |
||
| 241 | * @since 1.2.0 |
||
| 242 | * @param $request |
||
| 243 | * @return array All registered menus locations |
||
| 244 | */ |
||
| 245 | View Code Duplication | public static function get_menu_locations( $request ) { |
|
| 272 | |||
| 273 | |||
| 274 | /** |
||
| 275 | * Get menu for location. |
||
| 276 | * |
||
| 277 | * @since 1.2.0 |
||
| 278 | * @param $request |
||
| 279 | * @return array The menu for the corresponding location |
||
| 280 | */ |
||
| 281 | public function get_menu_location( $request ) { |
||
| 340 | |||
| 341 | |||
| 342 | /** |
||
| 343 | * Returns all child nav_menu_items under a specific parent. |
||
| 344 | * |
||
| 345 | * @since 1.2.0 |
||
| 346 | * @param int $parent_id The parent nav_menu_item ID |
||
| 347 | * @param array $nav_menu_items Navigation menu items |
||
| 348 | * @param bool $depth Gives all children or direct children only |
||
| 349 | * @return array returns filtered array of nav_menu_items |
||
| 350 | */ |
||
| 351 | View Code Duplication | public function get_nav_menu_item_children( $parent_id, $nav_menu_items, $depth = true ) { |
|
| 373 | |||
| 374 | |||
| 375 | /** |
||
| 376 | * Format a menu item for REST API consumption. |
||
| 377 | * |
||
| 378 | * @since 1.2.0 |
||
| 379 | * @param object|array $menu_item The menu item |
||
| 380 | * @param bool $children Get menu item children (default false) |
||
| 381 | * @param array $menu The menu the item belongs to (used when $children is set to true) |
||
| 382 | * @return array a formatted menu item for REST |
||
| 383 | */ |
||
| 384 | View Code Duplication | public function format_menu_item( $menu_item, $children = false, $menu = array() ) { |
|
| 412 | |||
| 413 | |||
| 414 | } |
||
| 415 | |||
| 418 |
You can fix this by adding a namespace to your class:
When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.