Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Menu_Item
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 3
506
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 add_additional_fields_schema
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 create_item
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 1
420
1<?php
2/**
3 * Menu items REST route
4 *
5 * @package automattic/jetpack-import
6 */
7
8namespace Automattic\Jetpack\Import\Endpoints;
9
10use WP_Error;
11use WP_REST_Request;
12use WP_REST_Response;
13
14if ( ! defined( 'ABSPATH' ) ) {
15    exit( 0 );
16}
17
18/**
19 * Class Menu_Item
20 */
21class Menu_Item extends \WP_REST_Menu_Items_Controller {
22
23    /**
24     * Base class
25     */
26    use Import;
27
28    /**
29     * The Import ID add a new item to the schema.
30     */
31    use Import_ID;
32
33    /**
34     * Whether the controller supports batching. Default true.
35     *
36     * @var array
37     */
38    protected $allow_batch = array( 'v1' => true );
39
40    /**
41     * Constructor.
42     */
43    public function __construct() {
44        parent::__construct( 'nav_menu_item' );
45
46        // @see add_term_meta
47        $this->import_id_meta_type = 'post';
48    }
49
50    /**
51     * Adds the schema from additional fields to a schema array.
52     *
53     * The type of object is inferred from the passed schema.
54     *
55     * @param array $schema Schema array.
56     * @return array Modified Schema array.
57     */
58    public function add_additional_fields_schema( $schema ) {
59        // WXR saves menu parent as slug, so we need to overwrite the schema.
60        $schema['properties']['menus']['description'] = __( 'The parent menu slug.', 'jetpack-import' );
61        $schema['properties']['menus']['type']        = 'string';
62
63        // Add the import unique ID to the schema.
64        return $this->add_unique_identifier_to_schema( $schema );
65    }
66
67    /**
68     * Creates a single menu item.
69     *
70     * @param WP_REST_Request $request Full details about the request.
71     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
72     */
73    public function create_item( $request ) {
74        // Set the WP_IMPORTING constant to prevent sync notifications
75        $this->set_importing();
76
77        if ( ! empty( $request['menus'] ) ) {
78            $menu_id = \term_exists( $request['menus'], 'nav_menu' );
79
80            if ( $menu_id ) {
81                // Overwrite the menu item parent menu ID.
82                $request['menus'] = is_array( $menu_id ) ? $menu_id['term_id'] : $menu_id;
83            }
84        }
85
86        if ( ! empty( $request['parent'] ) ) {
87            $query              = $this->get_import_db_query( $request['parent'] );
88            $query['post_type'] = 'nav_menu_item';
89            $parent             = \get_posts( $query );
90
91            // Overwrite the parent ID.
92            $request['parent'] = is_array( $parent ) && count( $parent ) ? $parent[0] : 0;
93        }
94
95        // A menu item can be a custom link or a post, page, category or attachment.
96        if ( ! empty( $request['object_id'] ) ) {
97            $id = null;
98
99            if ( $request['object'] === 'category' ) {
100                if ( $request['object_id'] === 1 ) {
101                    // The default category is always ID 1, no need to search.
102                    $id = 1;
103                } else {
104                    $query      = $this->get_import_db_query( $request['object_id'] );
105                    $categories = \get_categories( $this->get_import_db_query( $request['object_id'] ) );
106
107                    // Overwrite the category ID.
108                    $id = is_array( $categories ) && count( $categories ) ? $categories[0] : null;
109                }
110            } elseif ( $request['object'] === 'page' ) {
111                $pages = \get_pages( $this->get_import_db_query( $request['object_id'] ) );
112
113                // Overwrite the page ID.
114                $id = is_array( $pages ) && count( $pages ) ? $pages[0]->ID : null;
115            } elseif ( $request['object'] === 'post' || $request['object'] === 'attachment' ) {
116                $posts = \get_posts( $this->get_import_db_query( $request['object_id'] ) );
117
118                // Overwrite the post ID.
119                $id = is_array( $posts ) && count( $posts ) ? $posts[0] : null;
120            }
121
122            if ( empty( $id ) ) {
123                // Not found the object or a custom menu item, remove the fields.
124                unset( $request['object_id'] );
125                unset( $request['object'] );
126            } else {
127                $request['object_id'] = $id;
128            }
129        }
130
131        $response = parent::create_item( $request );
132
133        return $this->add_import_id_metadata( $request, $response );
134    }
135}