Vì không ai thực sự giải thích lý do tại sao chức năng này không hoạt động theo cách bạn nghĩ, nên tôi sẽ cố gắng giải thích chi tiết khi tôi rơi vào cái bẫy giống như bạn đã làm.
Đây là nơi mà các tài liệu không thực sự rõ ràng về những gì con sên đang đề cập đến. Hầu hết mọi người sẽ cho rằng đó là sên của menu đã đăng ký nhưng điều đó không chính xác. Nó thực sự là con sên của thuật ngữ phân loại nav_menu.
Hãy đi sâu vào mã nguồn để xem lõi Wordpress diễn giải sên của menu.
function wp_get_nav_menu_items( $menu, $args = array() ) {
$menu = wp_get_nav_menu_object( $menu );
....
Dòng đầu tiên cho thấy nó sử dụng hàm có tên wp_get_nav_menu_object () để truy xuất menu. Nó truyền $menu
tham số là tham số đầu tiên cho hàm này. Vì đây là những gì chúng tôi sử dụng cho sên của chúng tôi, chúng tôi sẽ phải đi sâu vào nguồn cho wp_get_nav_menu_object()
.
function wp_get_nav_menu_object( $menu ) {
$menu_obj = false;
if ( is_object( $menu ) ) {
$menu_obj = $menu;
}
if ( $menu && ! $menu_obj ) {
$menu_obj = get_term( $menu, 'nav_menu' );
if ( ! $menu_obj ) {
$menu_obj = get_term_by( 'slug', $menu, 'nav_menu' );
}
if ( ! $menu_obj ) {
$menu_obj = get_term_by( 'name', $menu, 'nav_menu' );
}
}
....
chúng ta có thể thấy rằng hàm này sử dụng get_term_by
hàm để lấy $menu_obj
. Đây là nơi chúng tôi nhận được thực đơn của chúng tôi.
Khi bạn tạo một menu trong khu vực quản trị Wordpress, nó sẽ tạo ra một thuật ngữ mới. Điều khoản, có sên dựa trên tên của họ. Vì vậy, nếu bạn có tên menu là "Menu tuyệt vời của tôi" thì Wordpress sẽ tạo ra một con sên có tên là "my-awesome-menu". Bạn có thể đã đăng ký menu là "chính" nhưng đó không phải là slug mà các chức năng này đề cập đến. Nó thực sự là sên hạn.
Vì vậy, để rõ ràng, hãy nói rằng bạn đã đăng ký một menu như vậy:
register_nav_menu('primary', 'my primary nav');
primary
không phải là sên my-primary-nav
cũng không phải là sên.
Vì chúng tôi đã tạo một menu có tên "Menu tuyệt vời của tôi" (làm ví dụ) và sên là 'menu của tôi tuyệt vời', bạn có thể truy xuất nó như vậy:
$awesome_menu = wp_get_nav_menu_items( 'my-awesome-menu' );
Bạn có thể tự mình xem con sên chỉ là gì bằng cách kiểm tra cơ sở dữ liệu trong bảng wp_terms (hoặc bất kể tiền tố của bạn là gì) và tìm tên menu của bạn trong đó.
Vì bạn đang sử dụng một trang web đa ngôn ngữ hoặc thậm chí là nhiều trang, nên phương pháp này sẽ không phải là cách tốt nhất để tìm hiểu về nó. Vì tên và sên có thể khác nhau.
Vì vậy, phương pháp tốt nhất là lấy tất cả các vị trí menu get_nav_menu_locations()
sẽ trả về một mảng kết hợp trong đó khóa là sên của menu đã đăng ký và giá trị là id của thuật ngữ menu được chọn cho vị trí của nó.
Với id thuật ngữ, chúng ta có thể lấy thông tin thuật ngữ đó và sau đó trả về slug đúng mà hàm yêu cầu.
Dưới đây là một chức năng sử dụng wp_get_nav_items()
chức năng nhưng bạn sẽ vượt qua trong slug menu đã đăng ký. Trong trường hợp của bạn, đây sẽ là 'chính'.
Giải pháp mã
// kind of a long function name but whatevs
function get_menu_items_by_registered_slug($menu_slug) {
$menu_items = array();
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_slug ] ) ) {
$menu = get_term( $locations[ $menu_slug ] );
$menu_items = wp_get_nav_menu_items($menu->term_id);
}
return $menu_items;
}