Удалить пункт меню в меню
Я знаю, что об этом спрашивали много раз. Но из того, что я получил после поисков, я многого не мог понять. Я использовал wp_update_nav_menu_item
для программного добавления пунктов меню. Но я не знаю, как удалить определенный пункт меню. На одном из форумов было сказано отменить установку элемента массива (форум). Но я этого не понимал. Кто-нибудь может объяснить, как это сделать?
3 answers
Я думаю, что лучший способ удалить пункт меню из меню - это подключиться к фильтру wp_nav_menu_objects
(ответ @Otto из упомянутой вами темы). И способ, который вы используете, заключается в том, чтобы сначала проверить правильное меню для фильтрации, а затем найти пункт меню и удалить его, сбросив его из массива $sorted_menu_objects
.
В следующем примере будет удален пункт меню Uncategorized
из меню, которое находится в расположении темы secondary-menu
:
add_filter('wp_nav_menu_objects', 'ad_filter_menu', 10, 2);
function ad_filter_menu($sorted_menu_objects, $args) {
// check for the right menu to remove the menu item from
// here we check for theme location of 'secondary-menu'
// alternatively you can check for menu name ($args->menu == 'menu_name')
if ($args->theme_location != 'secondary-menu')
return $sorted_menu_objects;
// remove the menu item that has a title of 'Uncategorized'
foreach ($sorted_menu_objects as $key => $menu_object) {
// can also check for $menu_object->url for example
// see all properties to test against:
// print_r($menu_object); die();
if ($menu_object->title == 'Uncategorized') {
unset($sorted_menu_objects[$key]);
break;
}
}
return $sorted_menu_objects;
}
НА САМОМ ДЕЛЕ ЭТО НАМНОГО ПРОЩЕ
Простое решение :
После нескольких итераций с функцией wp_update_nav_menu_item (см. Ниже) я просто просмотрел код, чтобы посмотреть, что делает сам WP, если администратор нажмет ссылку "Удалить" в пункте меню.
Оказывается, что он просто вызывает wp_delete_post для этого конкретного пункта меню, и это все. Ничего больше, ничего особенного. Так что на случай, если вы захотите удалите пункт меню, просто получите его db_id и вызовите эту функцию
wp_delete_post($menu_item_db_id);
Для ясности я оставляю здесь свои прежние решения, чтобы заверить вас, что ничего такого сложного на самом деле не нужно:
НЕ ИСПОЛЬЗУЙТЕ ОДНО ИЗ СЛЕДУЮЩИХ, НЫНЕ УСТАРЕВШИХ, ИСПОЛЬЗУЙТЕ ПРОСТОЕ, ПРИВЕДЕННОЕ ВЫШЕ
Версия 1:
Добавление (публикация ) элемента меню так же просто, как удаление ( отмена публикации ) и может также можно выполнить с той же функцией.
Я предполагаю, что вы использовали едва документированную функцию wp_update_nav_menu_item (см. Ссылку на публикацию с примером), чтобы программно добавить пункт меню и знать, как его вызвать, поэтому для его удаления вы вызываете ту же функцию с идентификатором объекта и статусом неопубликовано
function removeMenuEntry($menu_id, $object_id, $menu_item_db_id) {
$itemData = array(
'menu-item-object-id' => $object_id,
'menu-item-status' => 'unpublish'
);
return wp_update_nav_menu_item( $menu_id, $menu_item_db_id, $itemData );
}
$menu_id
является ли идентификатор меню, в котором находится запись, и $object_id
записи меню уникальным идентификатором WP, который вы знаете, как получить, как вы сказали, что уже добавили запись вручную, если нет обратитесь к ссылке, которую я дал для функции wp_update_nav_menu_item, чтобы увидеть пример.
Приведенный выше код отменит публикацию записи, которая, похоже, в точности соответствует тому, что происходит, когда вы удаляете запись меню через панель администратора.
Версия 2:
Раньше я не использовал $menu_item_db_id
и просто установил это значение равным нулю, что отлично работало для записи меню, которая была 'menu-item-type' => 'taxonomy'
, но та же функция не работала для записи меню типа 'menu-item-type' => 'post_type'
.
После просмотра источника WP просто немного кажется, что тот факт, что он работал без установки $menu_item_db_id
, является скорее упущением, и правильный способ сделать это - использовать его, так как нулевое значение создаст новый пункт меню (что он и сделал в последнем случае, очевидно, без названия или чего-либо еще).
Приведенный выше пример кода был обновлен и теперь должен работать без проблем для пунктов меню таксономия и post_type.
Полезные ответы здесь, для тех из вас, кто просто хочет "Удалить определенный идентификатор страницы из любого меню", я сделал простую функцию:
/**
* Removes a page from front-end menus by ID
*
* @param int id WordPress Page ID
*
* @return int count of removed
*/
function zeroBSCRM_wp_removePageFromMenus($pageID=-1){
// only if a valid $pageID
if ($pageID > 0){
// get menu locations
$locations = get_nav_menu_locations();
// cycle through (any) and get menu in slot
if (is_array($locations)) foreach ($locations as $location => $menuID){
// Retrieve Menu & Pages in menu
$menu = wp_get_nav_menu_object($menuID);
$pagesItem = wp_get_nav_menu_items($menu, array("object"=>"page"));
// Cycle through pages & remove target menu page link if present
if (is_array($pagesItem))
foreach ($pagesItem as $page)
if ($page->object_id == $pageID) wp_delete_post($page->db_id);
}
}
return 0;
}