Advertisement
Guest User

Untitled

a guest
Aug 1st, 2015
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.44 KB | None | 0 0
  1. array(
  2. array(
  3. 'post_type' => 'page',
  4. 'post_name' => 'Home',
  5. 'children' => array()
  6. ),
  7. array(
  8. 'post_type' => 'page',
  9. 'post_name' => 'About Us',
  10. 'children' => array(
  11. array(
  12. 'post_type' => 'page',
  13. 'post_name' => 'Our History',
  14. 'children' => array()
  15. )
  16. )
  17. )
  18. )
  19.  
  20. function wpse170033_nav_menu_object_tree( $nav_menu_items_array ) {
  21. foreach ( $nav_menu_items_array as $key => $value ) {
  22. $value->children = array();
  23. $nav_menu_items_array[ $key ] = $value;
  24. }
  25.  
  26. $nav_menu_levels = array();
  27. $index = 0;
  28. if ( ! empty( $nav_menu_items_array ) ) do {
  29. if ( $index == 0 ) {
  30. foreach ( $nav_menu_items_array as $key => $obj ) {
  31. if ( $obj->menu_item_parent == 0 ) {
  32. $nav_menu_levels[ $index ][] = $obj;
  33. unset( $nav_menu_items_array[ $key ] );
  34. }
  35. }
  36. } else {
  37. foreach ( $nav_menu_items_array as $key => $obj ) {
  38. if ( in_array( $obj->menu_item_parent, $last_level_ids ) ) {
  39. $nav_menu_levels[ $index ][] = $obj;
  40. unset( $nav_menu_items_array[ $key ] );
  41. }
  42. }
  43. }
  44. $last_level_ids = wp_list_pluck( $nav_menu_levels[ $index ], 'db_id' );
  45. $index++;
  46. } while ( ! empty( $nav_menu_items_array ) );
  47.  
  48. $nav_menu_levels_reverse = array_reverse( $nav_menu_levels );
  49.  
  50. $nav_menu_tree_build = array();
  51. $index = 0;
  52. if ( ! empty( $nav_menu_levels_reverse ) ) do {
  53. if ( count( $nav_menu_levels_reverse ) == 1 ) {
  54. $nav_menu_tree_build = $nav_menu_levels_reverse;
  55. }
  56. $current_level = array_shift( $nav_menu_levels_reverse );
  57. if ( isset( $nav_menu_levels_reverse[ $index ] ) ) {
  58. $next_level = $nav_menu_levels_reverse[ $index ];
  59. foreach ( $next_level as $nkey => $nval ) {
  60. foreach ( $current_level as $ckey => $cval ) {
  61. if ( $nval->db_id == $cval->menu_item_parent ) {
  62. $nval->children[] = $cval;
  63. }
  64. }
  65. }
  66. }
  67. } while ( ! empty( $nav_menu_levels_reverse ) );
  68.  
  69. $nav_menu_object_tree = $nav_menu_tree_build[ 0 ];
  70. return $nav_menu_object_tree;
  71. }
  72.  
  73. $nav_menu_items = wp_get_nav_menu_items( 'main-menu' );
  74. wpse170033_nav_menu_object_tree( $nav_menu_items );
  75.  
  76. Array
  77. (
  78. [0] => WP_Post Object
  79. (
  80. [ID] => 51
  81. [post_author] => 1
  82. [post_date] => 2015-06-26 21:13:23
  83. [post_date_gmt] => 2015-06-26 19:13:23
  84. [post_content] =>
  85. [post_title] =>
  86. [post_excerpt] =>
  87. [post_status] => publish
  88. [comment_status] => open
  89. [ping_status] => open
  90. [post_password] =>
  91. [post_name] => 51
  92. [to_ping] =>
  93. [pinged] =>
  94. [post_modified] => 2015-07-29 20:55:10
  95. [post_modified_gmt] => 2015-07-29 18:55:10
  96. [post_content_filtered] =>
  97. [post_parent] => 0
  98. [guid] => http://example.com/?p=51
  99. [menu_order] => 1
  100. [post_type] => nav_menu_item
  101. [post_mime_type] =>
  102. [comment_count] => 0
  103. [filter] => raw
  104. [db_id] => 51
  105. [menu_item_parent] => 0
  106. [object_id] => 2
  107. [object] => page
  108. [type] => post_type
  109. [type_label] => Page
  110. [url] => http://example.com/example-page/
  111. [title] => Example-Page-1
  112. [target] =>
  113. [attr_title] =>
  114. [description] =>
  115. [classes] => Array
  116. (
  117. [0] =>
  118. )
  119. [xfn] =>
  120. [children] => Array
  121. (
  122. [0] => WP_Post Object
  123. (
  124. [ID] => 80
  125. [post_author] => 1
  126. [post_date] => 2015-06-27 14:03:31
  127. [post_date_gmt] => 2015-06-27 12:03:31
  128. [post_content] =>
  129. [post_title] =>
  130. [post_excerpt] =>
  131. [post_status] => publish
  132. [comment_status] => open
  133. [ping_status] => open
  134. [post_password] =>
  135. [post_name] => 80
  136. [to_ping] =>
  137. [pinged] =>
  138. [post_modified] => 2015-07-29 20:55:10
  139. [post_modified_gmt] => 2015-07-29 18:55:10
  140. [post_content_filtered] =>
  141. [post_parent] => 2
  142. [guid] => http://example.com/?p=80
  143. [menu_order] => 2
  144. [post_type] => nav_menu_item
  145. [post_mime_type] =>
  146. [comment_count] => 0
  147. [filter] => raw
  148. [db_id] => 80
  149. [menu_item_parent] => 51
  150. [object_id] => 69
  151. [object] => page
  152. [type] => post_type
  153. [type_label] => Page
  154. [url] => http://example.com/example-page/subpage-1/
  155. [title] => Subpage-1
  156. [target] =>
  157. [attr_title] =>
  158. [description] =>
  159. [classes] => Array
  160. (
  161. [0] =>
  162. )
  163. [xfn] =>
  164. [children] => Array
  165. (
  166. )
  167. )
  168. )
  169. )
  170. [1] => WP_Post Object
  171. (
  172. [ID] => 49
  173. [post_author] => 1
  174. [post_date] => 2015-06-26 21:13:23
  175. [post_date_gmt] => 2015-06-26 19:13:23
  176. [post_content] =>
  177. [post_title] =>
  178. [post_excerpt] =>
  179. [post_status] => publish
  180. [comment_status] => open
  181. [ping_status] => open
  182. [post_password] =>
  183. [post_name] => 49
  184. [to_ping] =>
  185. [pinged] =>
  186. [post_modified] => 2015-07-29 20:55:10
  187. [post_modified_gmt] => 2015-07-29 18:55:10
  188. [post_content_filtered] =>
  189. [post_parent] => 0
  190. [guid] => http://example.com/?p=49
  191. [menu_order] => 3
  192. [post_type] => nav_menu_item
  193. [post_mime_type] =>
  194. [comment_count] => 0
  195. [filter] => raw
  196. [db_id] => 49
  197. [menu_item_parent] => 0
  198. [object_id] => 41
  199. [object] => page
  200. [type] => post_type
  201. [type_label] => Page
  202. [url] => http://example.com/example-page-2/
  203. [title] => Example-Page-2
  204. [target] =>
  205. [attr_title] =>
  206. [description] =>
  207. [classes] => Array
  208. (
  209. [0] =>
  210. )
  211. [xfn] =>
  212. [children] => Array
  213. (
  214. )
  215. )
  216. [2] => WP_Post Object
  217. (
  218. [ID] => 48
  219. [post_author] => 1
  220. [post_date] => 2015-06-26 21:13:23
  221. [post_date_gmt] => 2015-06-26 19:13:23
  222. [post_content] =>
  223. [post_title] =>
  224. [post_excerpt] =>
  225. [post_status] => publish
  226. [comment_status] => open
  227. [ping_status] => open
  228. [post_password] =>
  229. [post_name] => 48
  230. [to_ping] =>
  231. [pinged] =>
  232. [post_modified] => 2015-07-29 20:55:10
  233. [post_modified_gmt] => 2015-07-29 18:55:10
  234. [post_content_filtered] =>
  235. [post_parent] => 0
  236. [guid] => http://example.com/?p=48
  237. [menu_order] => 4
  238. [post_type] => nav_menu_item
  239. [post_mime_type] =>
  240. [comment_count] => 0
  241. [filter] => raw
  242. [db_id] => 48
  243. [menu_item_parent] => 0
  244. [object_id] => 42
  245. [object] => page
  246. [type] => post_type
  247. [type_label] => Page
  248. [url] => http://example.com/example-page-3/
  249. [title] => Example-Page-3
  250. [target] =>
  251. [attr_title] =>
  252. [description] =>
  253. [classes] => Array
  254. (
  255. [0] =>
  256. )
  257. [xfn] =>
  258. [children] => Array
  259. (
  260. [0] => WP_Post Object
  261. (
  262. [ID] => 79
  263. [post_author] => 1
  264. [post_date] => 2015-06-27 14:03:31
  265. [post_date_gmt] => 2015-06-27 12:03:31
  266. [post_content] =>
  267. [post_title] =>
  268. [post_excerpt] =>
  269. [post_status] => publish
  270. [comment_status] => open
  271. [ping_status] => open
  272. [post_password] =>
  273. [post_name] => 79
  274. [to_ping] =>
  275. [pinged] =>
  276. [post_modified] => 2015-07-29 20:55:10
  277. [post_modified_gmt] => 2015-07-29 18:55:10
  278. [post_content_filtered] =>
  279. [post_parent] => 42
  280. [guid] => http://example.com/?p=79
  281. [menu_order] => 5
  282. [post_type] => nav_menu_item
  283. [post_mime_type] =>
  284. [comment_count] => 0
  285. [filter] => raw
  286. [db_id] => 79
  287. [menu_item_parent] => 48
  288. [object_id] => 70
  289. [object] => page
  290. [type] => post_type
  291. [type_label] => Page
  292. [url] => http://example.com/example-page-3/subpage-2/
  293. [title] => Subpage-2
  294. [target] =>
  295. [attr_title] =>
  296. [description] =>
  297. [classes] => Array
  298. (
  299. [0] =>
  300. )
  301. [xfn] =>
  302. [children] => Array
  303. (
  304. [0] => WP_Post Object
  305. (
  306. [ID] => 78
  307. [post_author] => 1
  308. [post_date] => 2015-06-27 14:03:31
  309. [post_date_gmt] => 2015-06-27 12:03:31
  310. [post_content] =>
  311. [post_title] =>
  312. [post_excerpt] =>
  313. [post_status] => publish
  314. [comment_status] => open
  315. [ping_status] => open
  316. [post_password] =>
  317. [post_name] => 78
  318. [to_ping] =>
  319. [pinged] =>
  320. [post_modified] => 2015-07-29 20:55:10
  321. [post_modified_gmt] => 2015-07-29 18:55:10
  322. [post_content_filtered] =>
  323. [post_parent] => 70
  324. [guid] => http://example.com/?p=78
  325. [menu_order] => 6
  326. [post_type] => nav_menu_item
  327. [post_mime_type] =>
  328. [comment_count] => 0
  329. [filter] => raw
  330. [db_id] => 78
  331. [menu_item_parent] => 79
  332. [object_id] => 76
  333. [object] => page
  334. [type] => post_type
  335. [type_label] => Page
  336. [url] => http://example.com/example-page-3/subpage-2/subpage-3/
  337. [title] => Subpage-3
  338. [target] =>
  339. [attr_title] =>
  340. [description] =>
  341. [classes] => Array
  342. (
  343. [0] =>
  344. )
  345. [xfn] =>
  346. [children] => Array
  347. (
  348. [0] => WP_Post Object
  349. (
  350. [ID] => 87
  351. [post_author] => 1
  352. [post_date] => 2015-06-27 15:27:08
  353. [post_date_gmt] => 2015-06-27 13:27:08
  354. [post_content] =>
  355. [post_title] =>
  356. [post_excerpt] =>
  357. [post_status] => publish
  358. [comment_status] => open
  359. [ping_status] => open
  360. [post_password] =>
  361. [post_name] => 87
  362. [to_ping] =>
  363. [pinged] =>
  364. [post_modified] => 2015-07-29 20:55:10
  365. [post_modified_gmt] => 2015-07-29 18:55:10
  366. [post_content_filtered] =>
  367. [post_parent] => 76
  368. [guid] => http://example.com/?p=87
  369. [menu_order] => 7
  370. [post_type] => nav_menu_item
  371. [post_mime_type] =>
  372. [comment_count] => 0
  373. [filter] => raw
  374. [db_id] => 87
  375. [menu_item_parent] => 78
  376. [object_id] => 85
  377. [object] => page
  378. [type] => post_type
  379. [type_label] => Page
  380. [url] => http://example.com/example-page-3/subpage-2/subpage-3/subpage-4/
  381. [title] => Subpage-4
  382. [target] =>
  383. [attr_title] =>
  384. [description] =>
  385. [classes] => Array
  386. (
  387. [0] =>
  388. )
  389. [xfn] =>
  390. [children] => Array
  391. (
  392. [0] => WP_Post Object
  393. (
  394. [ID] => 366
  395. [post_author] => 1
  396. [post_date] => 2015-07-29 20:52:46
  397. [post_date_gmt] => 2015-07-29 18:52:46
  398. [post_content] =>
  399. [post_title] =>
  400. [post_excerpt] =>
  401. [post_status] => publish
  402. [comment_status] => open
  403. [ping_status] => open
  404. [post_password] =>
  405. [post_name] => 366
  406. [to_ping] =>
  407. [pinged] =>
  408. [post_modified] => 2015-07-29 20:55:10
  409. [post_modified_gmt] => 2015-07-29 18:55:10
  410. [post_content_filtered] =>
  411. [post_parent] => 85
  412. [guid] => http://example.com/?p=366
  413. [menu_order] => 8
  414. [post_type] => nav_menu_item
  415. [post_mime_type] =>
  416. [comment_count] => 0
  417. [filter] => raw
  418. [db_id] => 366
  419. [menu_item_parent] => 87
  420. [object_id] => 112
  421. [object] => page
  422. [type] => post_type
  423. [type_label] => Page
  424. [url] => http://example.com/example-page-3/subpage-2/subpage-3/subpage-4/subpage-5/
  425. [title] => Subpage-5
  426. [target] =>
  427. [attr_title] =>
  428. [description] =>
  429. [classes] => Array
  430. (
  431. [0] =>
  432. )
  433. [xfn] =>
  434. [children] => Array
  435. (
  436. )
  437. )
  438. )
  439. )
  440. )
  441. )
  442. )
  443. )
  444. )
  445. )
  446. )
  447.  
  448. /**
  449. * Modification of "Build a tree from a flat array in PHP"
  450. *
  451. * Authors: @DSkinner, @ImmortalFirefly and @SteveEdson
  452. *
  453. * @link http://stackoverflow.com/a/28429487/2078474
  454. */
  455. function buildTree( array &$elements, $parentId = 0 )
  456. {
  457. $branch = array();
  458. foreach ( $elements as &$element )
  459. {
  460. if ( $element->menu_item_parent == $parentId )
  461. {
  462. $children = buildTree( $elements, $element->ID );
  463. if ( $children )
  464. $element->wpse_children = $children;
  465.  
  466. $branch[$element->ID] = $element;
  467. unset( $element );
  468. }
  469. }
  470. return $branch;
  471. }
  472.  
  473. /**
  474. * Transform a navigational menu to it's tree structure
  475. *
  476. * @uses buildTree()
  477. * @uses wp_get_nav_menu_items()
  478. *
  479. * @param String $menud_id
  480. * @return Array|null $tree
  481. */
  482. function wpse_nav_menu_2_tree( $menu_id )
  483. {
  484. $items = wp_get_nav_menu_items( $menu_id );
  485. return $items ? buildTree( $items, 0 ) : null;
  486. }
  487.  
  488. $tree = wpse_nav_menu_2_tree( 'my_menu' ); // <-- Modify this to your needs!
  489. print_r( $tree );
  490.  
  491. $json = json_encode( $tree );
  492.  
  493. $w = new WPSE_Nav_Menu_Tree;
  494. $args = (object) [ 'items_wrap' => '', 'depth' => 0, 'walker' => $w ];
  495. $items = wp_get_nav_menu_items( 'my_menu' );
  496. walk_nav_menu_tree( $items, $args->depth, $args );
  497. print_r( $w->branch );
  498.  
  499. class WPSE_Nav_Menu_Tree extends Walker_Nav_Menu
  500. {
  501. public $branch = [];
  502.  
  503. public function display_element($element, &$children, $max_depth, $depth = 0, $args, &$output )
  504. {
  505. if( 0 == $depth )
  506. $this->branch[$element->ID] = $element;
  507.  
  508. if ( isset($children[$element->ID] ) )
  509. $element->wpse_children = $children[$element->ID];
  510.  
  511. parent::display_element($element, $children, $max_depth, $depth, $args, $output);
  512. }
  513. }
  514.  
  515. wp_nav_menu(array(
  516. 'menu' => 6, // your menu id, name, or slug
  517. 'echo' => true, // set this to false if you want a string back instead
  518. 'walker' => new Your_Walker(),
  519. ));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement