WordPress: Автоматическое добавление подстраниц в меню

Один из заказчиков разработки сайта на wordpress пожелал формировать большое многоуровневое боковое меню, в котором состоит каждая страница сайта. При этом вместо записей должны использоваться страницы - заказчику так привычней.

Естественно захотелось чтобы созданная страница автоматически добавлялась в меню. Иначе придется ручками каждую страницу в него прописывать. Для корневых страниц функционал wordpress позволяет эту опцию включить "из коробки": Внешний вид - Меню - выбираем необходимое меню - ставим галочку возле "Автоматически добавлять в это меню новые страницы верхнего уровня":

Wordpress Автоматически добавлять в это меню новые страницы верхнего уровня

А вот для того, чтобы добавлялись в меню и подстраницы (дочерние страницы) придется устанавливать дополнительный плагин Auto Submenu.

После активации плагина все дочерние страницы какой-либо родительской страницы буду автоматически добавляться во все меню, где есть эта родительская страница, при условии что в этих меню установлена вышеупомянутая галочка.

Но тут возникла небольшая проблема: меню действительно формируется очень большое (значительно более 200 пунктов меню), а wordpress не рассчитан на работу с такими большими меню. Когда меню состоит из более 200 пунктов оно перестает редактироваться. Для этого придется в настройках PHP на хостинге увеличить значение параметра max_input_vars (устанавливает максимальное возможное количество входящих параметров в запросе). По умолчанию значение max_input_vars установлено в "1000", можно увеличить до "2000" или до "10 000". Но тогда сама страничка начинает очень долго грузится и медленно работать, что начинает раздражать.

Выход: делать не одно большое меню, а множество мелких, по одному меню на каждую страницу верхнего уровня. Но тогда возникает следующая проблема: если во всех меню стоит галочка "Автоматически добавлять в это меню новые страницы верхнего уровня", то каждая новая корневая страница добавляется во все эти меню. Значит галочку не нужно ставить, но все равно хочется чтобы многочисленные дочерние страницы автоматически добавлялись в необходимые меню.

Пришлось немного отредактировать код плагина Auto Submenu, чтобы он добавлял дочерние страницы в нужные меню даже если галочка не установлена.

Ниже отредактированный код, может кому пригодится:

<?php
/*
Plugin Name: Auto Submenu
Plugin URI: http://jamocreations.com/en/artikelen/auto-submenu
Description: WordPress can only automatically add new top-level pages to menus. With Auto Submenu, new child pages will also be automatically added to menus.
Version: 0.2
Author: Jamo Web Creations
Author URI: http://jamocreations.com/
License: GPL2
*/

/* Copyright 2012 Jamo Web Creations (email : hello@jamocreations.com)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2, as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

class AutoSubmenu {
 /* Constructor */
 function __construct() {
  add_action( 'publish_page', array( &$this, 'on_publish_page' ) );
 }
 /*When publishing a new child page, add it to the appropriate custom menu.*/
 function on_publish_page( $post_id ) {
  // Theme supports custom menus?
  if ( ! current_theme_supports( 'menus' ) ) {
   return;
  }
  // Published page has parent?
  $post = get_post( $post_id );
  if ( ! $post->post_parent ) {
   return;
  }
  // Get menus
  $menus = wp_get_nav_menus(array('fields' => 'ids'));
  // Loop through the menus to find page parent
  foreach ( $menus as $menu_id ) {
   $menu_parent = NULL;
   $menu_items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
   if ( ! is_array( $menu_items ) ) {
    continue;
   }
   foreach ( $menu_items as $menu_item ) {
    // Item already in menu?
    if ( $menu_item->object_id == $post->ID ) {
     continue 2;
    }
    if ( $menu_item->object_id == $post->post_parent ) {
     $menu_parent = $menu_item;
    }
   }
   // Add new item
   if ( $menu_parent ) {
    wp_update_nav_menu_item( $menu_id, 0, array('menu-item-object-id' => $post->ID,'menu-item-object' => $post->post_type,'menu-item-parent-id' => $menu_parent->ID,'menu-item-type' => 'post_type','menu-item-status' => 'publish') );
   }
  }
 }
}
$auto_submenu = new AutoSubmenu();

P.S.: после публикации записи и проверки ее на уникальность увидел что тут на github.com тоже решили этот же вопрос касательно редактирования плагина.

Понравилось? =) Поделись с друзьями:

Обсудить