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 | 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 . abs( $menu['term_id'] ); |
||
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.