PageRenderTime 22ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/simple-history/loggers/SimpleMenuLogger.php

https://bitbucket.org/GraphicFusion/crafti-landing
PHP | 385 lines | 144 code | 63 blank | 178 comment | 13 complexity | 8322cc402978201bf53891ff743cb908 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-2.0, Apache-2.0, GPL-3.0
  1. <?php
  2. defined( 'ABSPATH' ) or die();
  3. /**
  4. * Logs WordPress menu edits
  5. */
  6. class SimpleMenuLogger extends SimpleLogger
  7. {
  8. public $slug = __CLASS__;
  9. /**
  10. * Get array with information about this logger
  11. *
  12. * @return array
  13. */
  14. function getInfo() {
  15. $arr_info = array(
  16. "name" => "Menu Logger",
  17. "description" => "Logs menu edits",
  18. "capability" => "edit_theme_options",
  19. "messages" => array(
  20. 'created_menu' => __('Created menu "{menu_name}"', "simple-history"),
  21. 'edited_menu' => __('Edited menu "{menu_name}"', "simple-history"),
  22. 'deleted_menu' => __('Deleted menu "{menu_name}"', "simple-history"),
  23. 'edited_menu_item' => __('Edited a menu item', "simple-history"),
  24. 'edited_menu_locations' => __('Updated menu locations', "simple-history"),
  25. ),
  26. "labels" => array(
  27. "search" => array(
  28. "label" => _x("Menus", "Menu logger: search", "simple-history"),
  29. "label_all" => _x("All menu activity", "Menu updates logger: search", "simple-history"),
  30. "options" => array(
  31. _x("Created menus", "Menu updates logger: search", "simple-history") => array(
  32. "created_menu"
  33. ),
  34. _x("Edited menus", "Menu updates logger: search", "simple-history") => array(
  35. "edited_menu",
  36. "edited_menu_item",
  37. "edited_menu_locations"
  38. ),
  39. _x("Deleted menus", "Menu updates logger: search", "simple-history") => array(
  40. "deleted_menu"
  41. )
  42. )
  43. ) // end search array
  44. ) // end labels
  45. );
  46. return $arr_info;
  47. }
  48. function loaded() {
  49. /*
  50. * Fires after a navigation menu has been successfully deleted.
  51. *
  52. * @since 3.0.0
  53. *
  54. * @param int $term_id ID of the deleted menu.
  55. do_action( 'wp_delete_nav_menu', $menu->term_id );
  56. */
  57. //add_action("wp_delete_nav_menu", array($this, "on_wp_delete_nav_menu"), 10, 1 );
  58. add_action("load-nav-menus.php", array($this, "on_load_nav_menus_page_detect_delete"));
  59. /*
  60. * Fires after a navigation menu is successfully created.
  61. *
  62. * @since 3.0.0
  63. *
  64. * @param int $term_id ID of the new menu.
  65. * @param array $menu_data An array of menu data.
  66. do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data );
  67. */
  68. add_action("wp_create_nav_menu", array($this, "on_wp_create_nav_menu"), 10, 2 );
  69. /*
  70. * Fires after a navigation menu item has been updated.
  71. *
  72. * @since 3.0.0
  73. *
  74. * @see wp_update_nav_menu_items()
  75. *
  76. * @param int $menu_id ID of the updated menu.
  77. * @param int $menu_item_db_id ID of the updated menu item.
  78. * @param array $args An array of arguments used to update a menu item.
  79. do_action( 'wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );
  80. */
  81. // This is fired when adding nav items in the editor, not at save, so not
  82. // good to log because user might not end up saving the changes
  83. // add_action("wp_update_nav_menu_item", array($this, "on_wp_update_nav_menu_item"), 10, 3 );
  84. // Fired before "wp_update_nav_menu" below, to remember menu layput before it's updated
  85. // so we can't detect changes
  86. add_action("load-nav-menus.php", array($this, "on_load_nav_menus_page_detect_update"));
  87. /*
  88. * Fires after a navigation menu has been successfully updated.
  89. *
  90. * @since 3.0.0
  91. *
  92. * @param int $menu_id ID of the updated menu.
  93. * @param array $menu_data An array of menu data.
  94. do_action( 'wp_update_nav_menu', $menu_id, $menu_data );
  95. */
  96. //add_action("wp_update_nav_menu", array($this, "on_wp_update_nav_menu"), 10, 2 );
  97. // Detect meny location change in "manage locations"
  98. add_action("load-nav-menus.php", array($this, "on_load_nav_menus_page_detect_locations_update"));
  99. }
  100. /**
  101. * Can't use action "wp_delete_nav_menu" beacuse
  102. * it's fired after menu is deleted, so we don't have the name in this action
  103. */
  104. function on_load_nav_menus_page_detect_delete() {
  105. /*
  106. http://playground-root.ep/wp-admin/nav-menus.php?menu=22&action=delete&0=http%3A%2F%2Fplayground-root.ep%2Fwp-admin%2F&_wpnonce=f52e8a31ba
  107. $_REQUEST:
  108. Array
  109. (
  110. [menu] => 22
  111. [action] => delete
  112. [0] => http://playground-root.ep/wp-admin/
  113. [_wpnonce] => f52e8a31ba
  114. )
  115. */
  116. // Check that needed vars are set
  117. if ( ! isset( $_REQUEST["menu"], $_REQUEST["action"] ) ) {
  118. return;
  119. }
  120. if ( "delete" !== $_REQUEST["action"]) {
  121. return;
  122. }
  123. $menu_id = $_REQUEST["menu"];
  124. if ( ! is_nav_menu( $menu_id) ) {
  125. return;
  126. }
  127. $menu = wp_get_nav_menu_object( $menu_id );
  128. $this->infoMessage(
  129. "deleted_menu",
  130. array(
  131. "menu_term_id" => $menu_id,
  132. "menu_name" => $menu->name,
  133. )
  134. );
  135. }
  136. /**
  137. * Fired after menu is deleted, so we don't have the name in this action
  138. * So that's why we can't use this only
  139. */
  140. /*
  141. function on_wp_delete_nav_menu($menu_term_id) {
  142. $this->infoMessage(
  143. "deleted_menu",
  144. array(
  145. "menu_term_id" => $menu_term_id,
  146. "menu" => print_r($menu, true),
  147. "request" => print_r($_REQUEST, true),
  148. )
  149. );
  150. }
  151. */
  152. function on_wp_create_nav_menu($term_id, $menu_data) {
  153. $menu = wp_get_nav_menu_object( $term_id );
  154. if ( ! $menu ) {
  155. return;
  156. }
  157. $this->infoMessage(
  158. "created_menu",
  159. array(
  160. "term_id" => $term_id,
  161. "menu_name" => $menu->name
  162. )
  163. );
  164. }
  165. /*
  166. function on_wp_update_nav_menu_item($menu_id, $menu_item_db_id, $args) {
  167. $this->infoMessage(
  168. "edited_menu_item",
  169. array(
  170. "menu_id" => $menu_id,
  171. "menu_item_db_id" => $menu_item_db_id,
  172. "args" => $this->simpleHistory->json_encode($args),
  173. "request" => $this->simpleHistory->json_encode($_REQUEST)
  174. )
  175. );
  176. }
  177. */
  178. /**
  179. * Detect menu being saved
  180. */
  181. function on_load_nav_menus_page_detect_update() {
  182. /*
  183. This is the data to be saved
  184. $_REQUEST:
  185. Array
  186. (
  187. [action] => update
  188. [menu] => 25
  189. [menu-name] => Main menu edit
  190. [menu-item-title] => Array
  191. (
  192. [25243] => My new page edited
  193. [25244] => My new page
  194. [25245] => This is my new page. How does it look in the logs? <h1>Hej!</h1>
  195. [25264] => This page have revisions
  196. [25265] => Lorem ipsum dolor sit amet
  197. )
  198. [menu-locations] => Array
  199. (
  200. [primary] => 25
  201. )
  202. )
  203. */
  204. // Check that needed vars are set
  205. if ( ! isset( $_REQUEST["menu"], $_REQUEST["action"], $_REQUEST["menu-name"] ) ) {
  206. return;
  207. }
  208. // Only go on for update action
  209. if ( "update" !== $_REQUEST["action"]) {
  210. return;
  211. }
  212. // Make sure we got the id of a menu
  213. $menu_id = $_REQUEST["menu"];
  214. if ( ! is_nav_menu( $menu_id) ) {
  215. return;
  216. }
  217. // Get saved menu. May be empty if this is the first time we save the menu
  218. $arr_prev_menu_items = wp_get_nav_menu_items( $menu_id );
  219. // Compare new items to be saved with old version
  220. $old_ids = wp_list_pluck( $arr_prev_menu_items, "db_id" );
  221. $new_ids = array_values( isset( $_POST["menu-item-db-id"] ) ? $_POST["menu-item-db-id"] : array() );
  222. // Get ids of added and removed post ids
  223. $arr_removed = array_diff($old_ids, $new_ids);
  224. $arr_added = array_diff($new_ids, $old_ids);
  225. // Get old version location
  226. // $prev_menu = wp_get_nav_menu_object( $menu_id );
  227. // $locations = get_registered_nav_menus();
  228. // $menu_locations = get_nav_menu_locations();
  229. $this->infoMessage(
  230. "edited_menu",
  231. array(
  232. "menu_id" => $menu_id,
  233. "menu_name" => $_POST["menu-name"],
  234. "menu_items_added" => sizeof($arr_added),
  235. "menu_items_removed" => sizeof($arr_removed),
  236. //"request" => $this->simpleHistory->json_encode($_REQUEST)
  237. )
  238. );
  239. }
  240. /**
  241. * This seems to get called twice
  242. * one time with menu_data, a second without
  243. */
  244. /*
  245. function on_wp_update_nav_menu($menu_id, $menu_data = array()) {
  246. if (empty($menu_data)) {
  247. return;
  248. }
  249. $this->infoMessage(
  250. "edited_menu",
  251. array(
  252. "menu_id" => $menu_id,
  253. "menu_name" => $menu_data["menu-name"],
  254. "menu_data" => $this->simpleHistory->json_encode($menu_data),
  255. "request" => $this->simpleHistory->json_encode($_REQUEST)
  256. )
  257. );
  258. }
  259. */
  260. /**
  261. * Get detailed output
  262. */
  263. function getLogRowDetailsOutput($row) {
  264. $context = $row->context;
  265. $message_key = $context["_message_key"];
  266. $output = "";
  267. if ( "edited_menu" == $message_key ) {
  268. if ( ! empty( $context["menu_items_added"] ) || ! empty( $context["menu_items_removed"] ) ) {
  269. $output .= "<p>";
  270. $output .= '<span class="SimpleHistoryLogitem__inlineDivided">';
  271. $output .= sprintf(
  272. _nx( '%1$s menu item added', '%1$s menu items added', $context["menu_items_added"], "menu logger", "simple-history" ),
  273. esc_attr( $context["menu_items_added"] )
  274. );
  275. $output .= '</span> ';
  276. $output .= '<span class="SimpleHistoryLogitem__inlineDivided">';
  277. $output .= sprintf(
  278. _nx( '%1$s menu item removed', '%1$s menu items removed', $context["menu_items_removed"], "menu logger", "simple-history" ),
  279. esc_attr( $context["menu_items_removed"] )
  280. );
  281. $output .= '</span> ';
  282. $output .= "</p>";
  283. }
  284. }
  285. return $output;
  286. }
  287. /**
  288. * Log updates to theme menu locations
  289. */
  290. function on_load_nav_menus_page_detect_locations_update() {
  291. // Check that needed vars are set
  292. if ( ! isset( $_REQUEST["menu"], $_REQUEST["action"] ) ) {
  293. return;
  294. }
  295. if ( "locations" !== $_REQUEST["action"]) {
  296. return;
  297. }
  298. /*
  299. Array
  300. (
  301. [menu-locations] => Array
  302. (
  303. [primary] => 25
  304. )
  305. )
  306. */
  307. $menu_locations = $_POST["menu-locations"];
  308. $this->infoMessage(
  309. "edited_menu_locations",
  310. array(
  311. "menu_locations" => $this->simpleHistory->json_encode($menu_locations)
  312. )
  313. );
  314. }
  315. }