Как добавить пункты меню навигации в определенную позицию в меню

Я добавляю ссылки входа / выхода в навигационное меню, используя следующий код:

function rp_add_login_logout_links( $items, $args ) { $link = wp_loginout( get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ), false ); if ( 'Shop Menu' == $args->menu ) { $items .= '<li id="menu-item-login" class="menu-item menu-item-login">' . $link . '</li>'; } return $items; } add_filter( 'wp_nav_menu_items', 'rp_add_login_logout_links', 10, 2 ); 

Поскольку $items – это строка, я могу просто просто добавить или добавить ссылки в список. Мне нужно, чтобы эта ссылка появлялась перед определенным элементом меню в списке, в конечном итоге это будет третий элемент. Есть ли другой фильтр или метод, который я мог бы использовать для этого?

Я попытался использовать strpos чтобы найти элемент nav, который я искал, и манипулировать строкой $items но не смог получить его в соответствии с пунктом меню HTML.

Оказывается, есть фильтр wp_nav_menu_objects который позволяет вам изменять массив элементов навигационного меню, прежде чем они будут объединены в строку. Я смог выполнить то, что мне нужно, используя следующую функцию:

 function wpse121517_add_shop_menu_links( $items, $args ) { if ( 'Shop Menu' !== $args->menu ) return $items; // Where to redirect after logging in or out $redirect = get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ); $new_links = array(); if ( is_user_logged_in() ) { $label = 'Logout'; $link = wp_logout_url( $redirect ); // Create a nav_menu_item object to hold our link // for My Account, only if user is logged-in $item = array( 'title' => 'Account', 'menu_item_parent' => 0, 'ID' => 'my-account', 'db_id' => '', 'url' => get_permalink( get_option( 'woocommerce_myaccount_page_id' ) ), 'classes' => array( 'menu-item' ) ); $new_links[] = (object) $item; // Add the new menu item to our array unset( $item ); } else { $label = 'Login'; $link = wp_login_url( $redirect ); } // Create a nav_menu_item object to hold our link // for login/out $item = array( 'title' => $label, 'menu_item_parent' => 0, 'ID' => 'loginout', 'db_id' => '', 'url' => $link, 'classes' => array( 'menu-item' ) ); $new_links[] = (object) $item; // Add the new menu item to our array $index = count( $items ) - 2; // Insert before the last two items // Insert the new links at the appropriate place. array_splice( $items, $index, 0, $new_links ); return $items; } add_filter( 'wp_nav_menu_objects', 'wpse121517_add_shop_menu_links', 10, 2 );