wp_get_nav_menu_items () không hoạt động với sên


9

Theo các tài liệu , wp_get_nav_menu_items()tham số 1 chấp nhận

(string) (Required) Menu name, ID, or slug.

Đây là cách tôi đang đăng ký thực đơn của mình

register_nav_menus(
    array(
        'primary' => 'Navigation primaire',
        'secondary' => 'Navigation secondaire',
    )
);

Đây là cách tôi đã thử tải một

var_dump( wp_get_nav_menu_items('primary') );             // bool(false)
var_dump( wp_get_nav_menu_items('navigation-primaire') ); // bool(false)
var_dump( wp_get_nav_menu_items('Navigation primaire') ); // bool(false)

var_dump( wp_get_nav_menu_items(51) );                      // array([...]) (correct)

Vì vậy, chức năng sẽ chỉ trả về menu khi tôi sử dụng ID. Tôi muốn sử dụng sên hơn vì trang web của tôi là đa ngôn ngữ và tôi không muốn phải sử dụng các ID khác nhau tùy thuộc vào ngôn ngữ.

Tôi đang làm gì đó sai hay đây là một lỗi cốt lõi? Tôi đã thử điều này trên chủ đề TwentySixteen với plugin đa ngôn ngữ của tôi bị vô hiệu hóa (Polylang).

Câu trả lời:


14

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 $menutham 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_byhà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');

primarykhông phải là sên my-primary-navcũ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;

}

2

Sửa đổi nhỏ cho câu trả lời được chấp nhận

Sau khi xóa menu khỏi vị trí menu, $locations[ $menu_slug ]trả về 0, vì vậy thật tốt khi thêm kiểm tra này:

function get_menu_items_by_registered_slug($menu_slug) {
  $menu_items = array();

  if ( ($locations = get_nav_menu_locations()) && isset($locations[$menu_slug]) && $locations[$menu_slug] != 0 ) {
    $menu = get_term( $locations[ $menu_slug ] );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
  }

  return $menu_items;
}

0

Thử cái này:

    $menu_name = 'primary'; 

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
        $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);
        // Your output code
    }

Bạn có thể giải thích một chút tại sao câu trả lời của bạn sẽ làm việc?
cjbj

Dường như không làm việc cho tôi. get_nav_menu_locations()trả về một mảng với một mục duy nhất ( 'primary' => 51), nhưng wp_get_nav_menu_items()trả về false khi sử dụng sên.
somebodysomewhere

Chỉ cần nhận ra tôi có thể sử dụng mảng từ get_nav_menu_locations () để tải menu chính xác cho mỗi ngôn ngữ mà không cần xác định các hằng số. Cảm ơn đã làm cho tôi nhận thức được các chức năng.
somebodysomewhere

0
custom_menu('primary');

function custom_menu( $theme_location ) {
if ( ($theme_location) && ($locations = get_nav_menu_locations()) && isset($locations[$theme_location]) ) {
    $menu = get_term( $locations[$theme_location], 'nav_menu' );
    $menu_items = wp_get_nav_menu_items($menu->term_id);
    //your menu code.
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.