Удалить пункт меню в меню


Я знаю, что об этом спрашивали много раз. Но из того, что я получил после поисков, я многого не мог понять. Я использовал wp_update_nav_menu_item для программного добавления пунктов меню. Но я не знаю, как удалить определенный пункт меню. На одном из форумов было сказано отменить установку элемента массива (форум). Но я этого не понимал. Кто-нибудь может объяснить, как это сделать?

 8
Author: Community, 2013-02-14

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;
}
 8
Author: Ahmad M, 2013-02-14 08:02:56

НА САМОМ ДЕЛЕ ЭТО НАМНОГО ПРОЩЕ


Простое решение :

После нескольких итераций с функцией 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.

 6
Author: Larzan, 2017-04-13 12:37:54

Полезные ответы здесь, для тех из вас, кто просто хочет "Удалить определенный идентификатор страницы из любого меню", я сделал простую функцию:

/**
 * 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;

}
 0
Author: Woody Hayday, 2020-03-25 15:45:35