PageRenderTime 59ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/htdocs/wp-content/plugins/_gecka-submenu/models/NavMenuHacks.php

https://bitbucket.org/dkrzos/phc
PHP | 427 lines | 285 code | 93 blank | 49 comment | 40 complexity | ce5e570f3166a6e981c2f2bbc72d4123 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. class Gecka_Submenu_NavMenuHacks {
  3. function __construct() {
  4. if(is_admin() ) {
  5. /* use custom walker */
  6. add_filter( 'wp_edit_nav_menu_walker', array($this, 'custom_walker') );
  7. /* add custom field */
  8. add_action('wp_nav_menu_item_custom_fields', array($this, 'wp_nav_menu_item_custom_fields'),10,4 );
  9. /* save custom field */
  10. add_action('wp_update_nav_menu_item', array($this, 'wp_update_nav_menu_item'),10,3 );
  11. /* css */
  12. add_action('admin_init', array($this, 'register_scripts'));
  13. add_action( "admin_print_styles-nav-menus.php", array($this, 'admin_print_styles') );
  14. }
  15. add_filter( 'wp_get_nav_menu_items', array($this, 'wp_get_nav_menu_items'),10,3 );
  16. /* set up nav menu item with custom properties */
  17. add_filter( 'wp_setup_nav_menu_item', array($this, 'wp_setup_nav_menu_item') );
  18. /* customize menu display */
  19. add_filter( 'walker_nav_menu_start_el', array($this, 'walker_nav_menu_start_el'), 10,4 );
  20. }
  21. function wp_get_nav_menu_items ($items, $menu, $args) {
  22. if( is_admin() && $GLOBALS['pagenow'] == 'nav-menus.php' ) return $items;
  23. $order = sizeof($items)+1;
  24. foreach($items as $item) {
  25. if($item->autopopulate !== '1') continue;
  26. switch ($item->autopopulate_type) {
  27. case 'subpages':
  28. $pages = get_pages( apply_filters('gecka-submenu-get_pages', array('child_of' => $item->object_id, 'sort_column' => 'menu_order, post_title')) );
  29. $this->setup_posts ('post', &$item, &$pages, &$items, &$order);
  30. break;
  31. }
  32. }
  33. return $items;
  34. }
  35. function setup_posts ($type, &$item, &$posts, &$items, &$order) {
  36. $_ids = $this->get_ids($type, $order, $posts);
  37. foreach($posts as $key=>$post) {
  38. $id = isset($post->ID) ? $post->ID : $post->term_id;
  39. $parent_id = $item->ID;
  40. if( isset($post->post_parent) && $post->post_parent && $post->post_parent != $item->object_id ) {
  41. $parent_id = $_ids[$post->post_parent];
  42. }
  43. if( isset($post->parent) && $post->parent && $post->parent != $item->object_id ) {
  44. $parent_id = $_ids[$post->parent];
  45. }
  46. $items[] = $this->menu_item_from_post($post, $_ids[$id], $parent_id, $order);
  47. $order++;
  48. }
  49. return $posts;
  50. }
  51. function get_ids ($type, $order, $items) {
  52. $ids = array();
  53. foreach($items as $item) {
  54. $id = $type == 'post' ? $item->ID : $item->term_id;
  55. $ids[$id] = -$order;
  56. $order++;
  57. }
  58. return $ids;
  59. }
  60. function menu_item_from_post ($post, $pseudo_id, $parent_id = 0, $order=0) {
  61. $_item = is_object($post) ? clone $post : clone get_post($post);
  62. $id = $_item->ID ;
  63. $_item->ID = $_item->db_id = $pseudo_id ;
  64. $_item->post_name = '' . $pseudo_id;
  65. $_item->object = $post->post_type;
  66. $_item->post_type = 'nav_menu_item';
  67. $_item->menu_item_parent = $parent_id;
  68. $_item->object_id = $id;
  69. $_item->type = 'post_type';
  70. $_item->menu_order = $order;
  71. $_item->description = $_item->post_excerpt;
  72. $object = get_post_type_object( $post->post_type );
  73. $_item->object = $object->name;
  74. $_item->type_label = $object->labels->singular_name;
  75. $_item->url = get_permalink( $post->ID );
  76. $_item->title = $post->post_title;
  77. $_item->target = '';
  78. $_item->attr_title = '';
  79. $_item->classes = array ( 0 => '');
  80. $_item->xfn = '';
  81. $_item->db_id = $pseudo_id;
  82. return $_item;
  83. }
  84. function walker_nav_menu_start_el ( $item_output, $item, $depth, $args) {
  85. if( isset($item->autopopulate) && $item->autopopulate =='subpages') {
  86. $args = array( 'depth' => 0,
  87. 'child_of' => $item->object_id,
  88. 'echo' => 0, 'title_li' => '' );
  89. //$item_output = $item_output . '<ul class="sub-menu" >' . wp_list_pages($args) . '</ul>';
  90. }
  91. return $item_output;
  92. }
  93. /**
  94. * Setup the nav menu object to have the additionnal properties
  95. */
  96. function wp_setup_nav_menu_item($menu_item) {
  97. if ( isset( $menu_item->post_type ) ) {
  98. if ( 'nav_menu_item' == $menu_item->post_type ) {
  99. $menu_item->autopopulate = empty( $menu_item->autopopulate ) ? get_post_meta( $menu_item->ID, '_menu_item_autopopulate', true ) : $menu_item->autopopulate;
  100. $menu_item->autopopulate_type = empty( $menu_item->autopopulate_type ) ? get_post_meta( $menu_item->ID, '_menu_item_autopopulate_type', true ) : $menu_item->autopopulate_type;
  101. }
  102. }
  103. return $menu_item;
  104. }
  105. /**
  106. * Saves the new fields
  107. */
  108. function wp_update_nav_menu_item($menu_id, $menu_item_db_id, $args) {
  109. $args['menu-item-autopopulate_type'] = isset( $_POST['menu-item-autopopulate_type'][$menu_item_db_id] ) ? $_POST['menu-item-autopopulate_type'][$menu_item_db_id] : '';
  110. if ( empty( $args['menu-item-autopopulate_type'] ) ) {
  111. $args['menu-item-autopopulate_type'] = '';
  112. }
  113. update_post_meta( $menu_item_db_id, '_menu_item_autopopulate_type', $args['menu-item-autopopulate_type'] );
  114. if( $args['menu-item-autopopulate_type'] === 'subpages' ) $args['menu-item-autopopulate'] = '1';
  115. else $args['menu-item-autopopulate'] = '0';
  116. update_post_meta( $menu_item_db_id, '_menu_item_autopopulate', $args['menu-item-autopopulate'] );
  117. /* old version compatibility */
  118. if( get_post_meta($menu_item_db_id, '_menu_item_showsub', true) == '1') {
  119. update_post_meta( $menu_item_db_id, '_menu_item_autopopulate_type', 'subpages' );
  120. update_post_meta( $menu_item_db_id, '_menu_item_autopopulate', '1' );
  121. delete_post_meta( $menu_item_db_id, '_menu_item_showsub', $args['menu-item-showsub'] );
  122. }
  123. }
  124. function register_scripts () {
  125. wp_register_style('gecka-submenu-nav-menu-edit', GKSM_URL . '/css/admin-nav-menu-edit.css' );
  126. }
  127. function admin_print_styles () {
  128. wp_enqueue_style('gecka-submenu-nav-menu-edit');
  129. }
  130. function admin_print_scripts () { }
  131. /**
  132. * Adds a custom fields
  133. */
  134. function custom_walker($a) {
  135. return 'Gecka_Walker_Nav_Menu_Edit';
  136. }
  137. function wp_nav_menu_item_custom_fields ( $item_id, $item, $depth, $args) {
  138. if($item->object === 'page') {
  139. include GKSM_PATH . '/views/Nav-Menu-Fields.php';
  140. }
  141. }
  142. }
  143. /**
  144. * Create HTML list of nav menu input items.
  145. *
  146. * @package WordPress
  147. * @since 3.0.0
  148. * @uses Walker_Nav_Menu
  149. */
  150. class Gecka_Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
  151. /**
  152. * @see Walker_Nav_Menu::start_lvl()
  153. * @since 3.0.0
  154. *
  155. * @param string $output Passed by reference.
  156. * @param int $depth Depth of page.
  157. */
  158. function start_lvl(&$output) {}
  159. /**
  160. * @see Walker_Nav_Menu::end_lvl()
  161. * @since 3.0.0
  162. *
  163. * @param string $output Passed by reference.
  164. * @param int $depth Depth of page.
  165. */
  166. function end_lvl(&$output) {
  167. }
  168. /**
  169. * @see Walker::start_el()
  170. * @since 3.0.0
  171. *
  172. * @param string $output Passed by reference. Used to append additional content.
  173. * @param object $item Menu item data object.
  174. * @param int $depth Depth of menu item. Used for padding.
  175. * @param int $current_page Menu item ID.
  176. * @param object $args
  177. */
  178. function start_el(&$output, $item, $depth, $args)
  179. {
  180. global $_wp_nav_menu_max_depth;
  181. $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;
  182. $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
  183. ob_start();
  184. $item_id = esc_attr( $item->ID );
  185. $removed_args = array(
  186. 'action',
  187. 'customlink-tab',
  188. 'edit-menu-item',
  189. 'menu-item',
  190. 'page-tab',
  191. '_wpnonce',
  192. );
  193. $original_title = '';
  194. if ( 'taxonomy' == $item->type ) {
  195. $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
  196. } elseif ( 'post_type' == $item->type ) {
  197. $original_object = get_post( $item->object_id );
  198. $original_title = $original_object->post_title;
  199. }
  200. $classes = array(
  201. 'menu-item menu-item-depth-' . $depth,
  202. 'menu-item-' . esc_attr( $item->object ),
  203. 'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),
  204. );
  205. $title = $item->title;
  206. if ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
  207. $classes[] = 'pending';
  208. /* translators: %s: title of menu item in draft status */
  209. $title = sprintf( __('%s (Pending)'), $item->title );
  210. }
  211. $title = empty( $item->label ) ? $title : $item->label;
  212. ?>
  213. <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
  214. <dl class="menu-item-bar">
  215. <dt class="menu-item-handle">
  216. <span class="item-title"><?php echo esc_html( $title ); ?></span>
  217. <span class="item-controls">
  218. <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
  219. <span class="item-order">
  220. <a href="<?php
  221. echo wp_nonce_url(
  222. add_query_arg(
  223. array(
  224. 'action' => 'move-up-menu-item',
  225. 'menu-item' => $item_id,
  226. ),
  227. remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
  228. ),
  229. 'move-menu_item'
  230. );
  231. ?>" class="item-move-up"><abbr title="<?php esc_attr_e('Move up'); ?>">&#8593;</abbr></a>
  232. |
  233. <a href="<?php
  234. echo wp_nonce_url(
  235. add_query_arg(
  236. array(
  237. 'action' => 'move-down-menu-item',
  238. 'menu-item' => $item_id,
  239. ),
  240. remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
  241. ),
  242. 'move-menu_item'
  243. );
  244. ?>" class="item-move-down"><abbr title="<?php esc_attr_e('Move down'); ?>">&#8595;</abbr></a>
  245. </span>
  246. <a class="item-edit" id="edit-<?php echo $item_id; ?>" title="<?php _e('Edit Menu Item'); ?>" href="<?php
  247. echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
  248. ?>"><?php _e( 'Edit Menu Item' ); ?></a>
  249. </span>
  250. </dt>
  251. </dl>
  252. <div class="menu-item-settings" id="menu-item-settings-<?php echo $item_id; ?>">
  253. <?php if( 'custom' == $item->type ) : ?>
  254. <p class="field-url description description-wide">
  255. <label for="edit-menu-item-url-<?php echo $item_id; ?>">
  256. <?php _e( 'URL' ); ?><br />
  257. <input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
  258. </label>
  259. </p>
  260. <?php endif; ?>
  261. <p class="description description-thin">
  262. <label for="edit-menu-item-title-<?php echo $item_id; ?>">
  263. <?php _e( 'Navigation Label' ); ?><br />
  264. <input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
  265. </label>
  266. </p>
  267. <p class="description description-thin">
  268. <label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
  269. <?php _e( 'Title Attribute' ); ?><br />
  270. <input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
  271. </label>
  272. </p>
  273. <p class="field-link-target description description-thin">
  274. <label for="edit-menu-item-target-<?php echo $item_id; ?>">
  275. <?php _e( 'Link Target' ); ?><br />
  276. <select id="edit-menu-item-target-<?php echo $item_id; ?>" class="widefat edit-menu-item-target" name="menu-item-target[<?php echo $item_id; ?>]">
  277. <option value="" <?php selected( $item->target, ''); ?>><?php _e('Same window or tab'); ?></option>
  278. <option value="_blank" <?php selected( $item->target, '_blank'); ?>><?php _e('New window or tab'); ?></option>
  279. </select>
  280. </label>
  281. </p>
  282. <p class="field-css-classes description description-thin">
  283. <label for="edit-menu-item-classes-<?php echo $item_id; ?>">
  284. <?php _e( 'CSS Classes (optional)' ); ?><br />
  285. <input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode(' ', $item->classes ) ); ?>" />
  286. </label>
  287. </p>
  288. <p class="field-xfn description description-thin">
  289. <label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
  290. <?php _e( 'Link Relationship (XFN)' ); ?><br />
  291. <input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
  292. </label>
  293. </p>
  294. <p class="field-description description description-wide">
  295. <label for="edit-menu-item-description-<?php echo $item_id; ?>">
  296. <?php _e( 'Description' ); ?><br />
  297. <textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); ?></textarea>
  298. <span class="description"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>
  299. </label>
  300. </p>
  301. <?php
  302. do_action('wp_nav_menu_item_custom_fields', $item_id, $item, $depth, $args);
  303. ?>
  304. <div class="menu-item-actions description-wide submitbox">
  305. <?php if( 'custom' != $item->type ) : ?>
  306. <p class="link-to-original">
  307. <?php printf( __('Original: %s'), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?>
  308. </p>
  309. <?php endif; ?>
  310. <a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="<?php
  311. echo wp_nonce_url(
  312. add_query_arg(
  313. array(
  314. 'action' => 'delete-menu-item',
  315. 'menu-item' => $item_id,
  316. ),
  317. remove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )
  318. ),
  319. 'delete-menu_item_' . $item_id
  320. ); ?>"><?php _e('Remove'); ?></a> <span class="meta-sep"> | </span> <a class="item-cancel submitcancel" id="cancel-<?php echo $item_id; ?>" href="<?php echo add_query_arg( array('edit-menu-item' => $item_id, 'cancel' => time()), remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) ) );
  321. ?>#menu-item-settings-<?php echo $item_id; ?>"><?php _e('Cancel'); ?></a>
  322. </div>
  323. <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
  324. <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
  325. <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
  326. <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
  327. <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
  328. <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
  329. </div><!-- .menu-item-settings-->
  330. <ul class="menu-item-transport"></ul>
  331. <?php
  332. $output .= ob_get_clean();
  333. }
  334. }