Наша взаимовыгодная связь https://banwar.org/
Один із замовників розробки сайту на 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: [email protected]) 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 ();PS: після публікації запису та перевірки її на унікальність побачив що тут на github.com теж вирішили це ж питання щодо редагування плагіна.
Сподобалося? =) Поділися з друзями:
Function on_publish_page ($ post_id) {// Theme supports custom menus?If (! current_theme_supports ( 'menus')) {return; } // Published page has parent?
Сподобалося?