summaryrefslogtreecommitdiff
blob: 69faa9b57f8c2c59e096e159feac61c68817ace9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
/**
 * Menus sync module.
 *
 * @package automattic/jetpack-sync
 */

namespace Automattic\Jetpack\Sync\Modules;

/**
 * Class to handle sync for menus.
 */
class Menus extends Module {
	/**
	 * Navigation menu items that were added but not synced yet.
	 *
	 * @access private
	 *
	 * @var array
	 */
	private $nav_items_just_added = array();

	/**
	 * Sync module name.
	 *
	 * @access public
	 *
	 * @return string
	 */
	public function name() {
		return 'menus';
	}

	/**
	 * Initialize menus action listeners.
	 *
	 * @access public
	 *
	 * @param callable $callable Action handler callable.
	 */
	public function init_listeners( $callable ) {
		add_action( 'wp_create_nav_menu', $callable, 10, 2 );
		add_action( 'wp_update_nav_menu', array( $this, 'update_nav_menu' ), 10, 2 );
		add_action( 'wp_add_nav_menu_item', array( $this, 'update_nav_menu_add_item' ), 10, 3 );
		add_action( 'wp_update_nav_menu_item', array( $this, 'update_nav_menu_update_item' ), 10, 3 );
		add_action( 'post_updated', array( $this, 'remove_just_added_menu_item' ), 10, 2 );

		add_action( 'jetpack_sync_updated_nav_menu', $callable, 10, 2 );
		add_action( 'jetpack_sync_updated_nav_menu_add_item', $callable, 10, 4 );
		add_action( 'jetpack_sync_updated_nav_menu_update_item', $callable, 10, 4 );
		add_action( 'delete_nav_menu', $callable, 10, 3 );
	}

	/**
	 * Nav menu update handler.
	 *
	 * @access public
	 *
	 * @param int   $menu_id ID of the menu.
	 * @param array $menu_data An array of menu data.
	 */
	public function update_nav_menu( $menu_id, $menu_data = array() ) {
		if ( empty( $menu_data ) ) {
			return;
		}
		/**
		 * Helps sync log that a nav menu was updated.
		 *
		 * @since 5.0.0
		 *
		 * @param int   $menu_id ID of the menu.
		 * @param array $menu_data An array of menu data.
		 */
		do_action( 'jetpack_sync_updated_nav_menu', $menu_id, $menu_data );
	}

	/**
	 * Nav menu item addition handler.
	 *
	 * @access public
	 *
	 * @param int   $menu_id       ID of the menu.
	 * @param int   $nav_item_id   ID of the new menu item.
	 * @param array $nav_item_args Arguments used to add the menu item.
	 */
	public function update_nav_menu_add_item( $menu_id, $nav_item_id, $nav_item_args ) {
		$menu_data                    = wp_get_nav_menu_object( $menu_id );
		$this->nav_items_just_added[] = $nav_item_id;
		/**
		 * Helps sync log that a new menu item was added.
		 *
		 * @since 5.0.0
		 *
		 * @param int   $menu_id       ID of the menu.
		 * @param array $menu_data     An array of menu data.
		 * @param int   $nav_item_id   ID of the new menu item.
		 * @param array $nav_item_args Arguments used to add the menu item.
		 */
		do_action( 'jetpack_sync_updated_nav_menu_add_item', $menu_id, $menu_data, $nav_item_id, $nav_item_args );
	}

	/**
	 * Nav menu item update handler.
	 *
	 * @access public
	 *
	 * @param int   $menu_id       ID of the menu.
	 * @param int   $nav_item_id   ID of the new menu item.
	 * @param array $nav_item_args Arguments used to update the menu item.
	 */
	public function update_nav_menu_update_item( $menu_id, $nav_item_id, $nav_item_args ) {
		if ( in_array( $nav_item_id, $this->nav_items_just_added, true ) ) {
			return;
		}
		$menu_data = wp_get_nav_menu_object( $menu_id );
		/**
		 * Helps sync log that an update to the menu item happened.
		 *
		 * @since 5.0.0
		 *
		 * @param int   $menu_id       ID of the menu.
		 * @param array $menu_data     An array of menu data.
		 * @param int   $nav_item_id   ID of the new menu item.
		 * @param array $nav_item_args Arguments used to update the menu item.
		 */
		do_action( 'jetpack_sync_updated_nav_menu_update_item', $menu_id, $menu_data, $nav_item_id, $nav_item_args );
	}

	/**
	 * Remove menu items that have already been saved from the "just added" list.
	 *
	 * @access public
	 *
	 * @param int      $nav_item_id ID of the new menu item.
	 * @param \WP_Post $post_after  Nav menu item post object after the update.
	 */
	public function remove_just_added_menu_item( $nav_item_id, $post_after ) {
		if ( 'nav_menu_item' !== $post_after->post_type ) {
			return;
		}
		$this->nav_items_just_added = array_diff( $this->nav_items_just_added, array( $nav_item_id ) );
	}
}