Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
44.00% covered (danger)
44.00%
11 / 25
33.33% covered (danger)
33.33%
2 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Menus
43.48% covered (danger)
43.48%
10 / 23
33.33% covered (danger)
33.33%
2 / 6
23.63
0.00% covered (danger)
0.00%
0 / 1
 name
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 init_listeners
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 update_nav_menu
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 update_nav_menu_add_item
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 update_nav_menu_update_item
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 remove_just_added_menu_item
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2/**
3 * Menus sync module.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8namespace Automattic\Jetpack\Sync\Modules;
9
10if ( ! defined( 'ABSPATH' ) ) {
11    exit( 0 );
12}
13
14/**
15 * Class to handle sync for menus.
16 */
17class Menus extends Module {
18    /**
19     * Navigation menu items that were added but not synced yet.
20     *
21     * @access private
22     *
23     * @var array
24     */
25    private $nav_items_just_added = array();
26
27    /**
28     * Sync module name.
29     *
30     * @access public
31     *
32     * @return string
33     */
34    public function name() {
35        return 'menus';
36    }
37
38    /**
39     * Initialize menus action listeners.
40     *
41     * @access public
42     *
43     * @param callable $callable Action handler callable.
44     */
45    public function init_listeners( $callable ) {
46        add_action( 'wp_create_nav_menu', $callable, 10, 2 );
47        add_action( 'wp_update_nav_menu', array( $this, 'update_nav_menu' ), 10, 2 );
48        add_action( 'wp_add_nav_menu_item', array( $this, 'update_nav_menu_add_item' ), 10, 3 );
49        add_action( 'wp_update_nav_menu_item', array( $this, 'update_nav_menu_update_item' ), 10, 3 );
50        add_action( 'post_updated', array( $this, 'remove_just_added_menu_item' ), 10, 2 );
51
52        add_action( 'jetpack_sync_updated_nav_menu', $callable, 10, 2 );
53        add_action( 'jetpack_sync_updated_nav_menu_add_item', $callable, 10, 4 );
54        add_action( 'jetpack_sync_updated_nav_menu_update_item', $callable, 10, 4 );
55        add_action( 'delete_nav_menu', $callable, 10, 3 );
56    }
57
58    /**
59     * Nav menu update handler.
60     *
61     * @access public
62     *
63     * @param int   $menu_id ID of the menu.
64     * @param array $menu_data An array of menu data.
65     */
66    public function update_nav_menu( $menu_id, $menu_data = array() ) {
67        if ( empty( $menu_data ) ) {
68            return;
69        }
70        /**
71         * Helps sync log that a nav menu was updated.
72         *
73         * @since 1.6.3
74         * @since-jetpack 5.0.0
75         *
76         * @param int   $menu_id ID of the menu.
77         * @param array $menu_data An array of menu data.
78         */
79        do_action( 'jetpack_sync_updated_nav_menu', $menu_id, $menu_data );
80    }
81
82    /**
83     * Nav menu item addition handler.
84     *
85     * @access public
86     *
87     * @param int   $menu_id       ID of the menu.
88     * @param int   $nav_item_id   ID of the new menu item.
89     * @param array $nav_item_args Arguments used to add the menu item.
90     */
91    public function update_nav_menu_add_item( $menu_id, $nav_item_id, $nav_item_args ) {
92        $menu_data                    = wp_get_nav_menu_object( $menu_id );
93        $this->nav_items_just_added[] = $nav_item_id;
94        /**
95         * Helps sync log that a new menu item was added.
96         *
97         * @since 1.6.3
98         * @since-jetpack 5.0.0
99         *
100         * @param int   $menu_id       ID of the menu.
101         * @param array $menu_data     An array of menu data.
102         * @param int   $nav_item_id   ID of the new menu item.
103         * @param array $nav_item_args Arguments used to add the menu item.
104         */
105        do_action( 'jetpack_sync_updated_nav_menu_add_item', $menu_id, $menu_data, $nav_item_id, $nav_item_args );
106    }
107
108    /**
109     * Nav menu item update handler.
110     *
111     * @access public
112     *
113     * @param int   $menu_id       ID of the menu.
114     * @param int   $nav_item_id   ID of the new menu item.
115     * @param array $nav_item_args Arguments used to update the menu item.
116     */
117    public function update_nav_menu_update_item( $menu_id, $nav_item_id, $nav_item_args ) {
118        if ( in_array( $nav_item_id, $this->nav_items_just_added, true ) ) {
119            return;
120        }
121        $menu_data = wp_get_nav_menu_object( $menu_id );
122        /**
123         * Helps sync log that an update to the menu item happened.
124         *
125         * @since 1.6.3
126         * @since-jetpack 5.0.0
127         *
128         * @param int   $menu_id       ID of the menu.
129         * @param array $menu_data     An array of menu data.
130         * @param int   $nav_item_id   ID of the new menu item.
131         * @param array $nav_item_args Arguments used to update the menu item.
132         */
133        do_action( 'jetpack_sync_updated_nav_menu_update_item', $menu_id, $menu_data, $nav_item_id, $nav_item_args );
134    }
135
136    /**
137     * Remove menu items that have already been saved from the "just added" list.
138     *
139     * @access public
140     *
141     * @param int      $nav_item_id ID of the new menu item.
142     * @param \WP_Post $post_after  Nav menu item post object after the update.
143     */
144    public function remove_just_added_menu_item( $nav_item_id, $post_after ) {
145        if ( 'nav_menu_item' !== $post_after->post_type ) {
146            return;
147        }
148        $this->nav_items_just_added = array_diff( $this->nav_items_just_added, array( $nav_item_id ) );
149    }
150}