Nhận ID trang từ các mục điều hướng


11

Tôi đang cố gắng để có được tất cả các ID trong điều hướng của mình và chuyển đổi nó thành một chuỗi để tôi có thể sử dụng nó wp_queryđể lấy các trang chỉ được liệt kê trong điều hướng. Mã để nhận ID:

$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);
}

foreach ( $menu_items as $menu_item ) {
    $numbers[] = $menu_item->ID;
}

$number = implode(',',$numbers);

Nhưng nó đang trả lại những con số sai. Khi tôi đi đến khu vực quản trị và di chuột qua các trang, số hiển thị trên thanh địa chỉ ở dưới cùng của màn hình không khớp. Tôi đang làm gì sai?

Câu trả lời:


13

Các mục menu được lưu trữ trong postsbảng với một post_typesố nav_menu_item. Vì vậy, những gì bạn đang trả lại là ID của chính mục menu, không phải những gì nó trỏ đến.

ID trang / bài đăng mà mục menu đề cập đến được lưu trữ trong postmetabảng, với một mục post_idphù hợp với mục menu IDmeta_key= _menu_item_object_id. Cách dễ nhất để có được meta_value(tức là trang được trỏ đến bởi mục menu) là sử dụng cái gì đó như thế này:

$numbers[] = get_post_meta( $menu_item->ID, '_menu_item_object_id', true );


Phải mất một thời gian để có được mã mà tôi đã đăng ở trên để làm việc. Tôi đã cố gắng thêm mã của bạn vào nhưng tôi không thể làm cho nó hoạt động được. Tôi lấy ra vòng lặp foreach và thử dòng của bạn ở trên nhưng không có gì. Làm thế nào để tôi sử dụng ví dụ của bạn?
Jamie

@Jamie Chỉ cần thay thế dòng của bạn: $numbers[] = $menu_item->ID;với câu trả lời của tôi.
anu

1

Tôi sẽ không thể cho bạn biết khi thay đổi này xảy ra nhưng kể từ phiên bản WordPress 5.2.4, bạn có thể sử dụng objectobject_idtruy xuất ID trang. Đây là cách tôi sẽ làm điều này:

/**
 * The `0` is added as a default case.
 * In case our menu does not contain any pages this
 * will prevent our query from returning all pages
 */
$page_ids           = array( 0 );
$registered_menu    = 'my_registered_menu';
$locations          = get_nav_menu_locations();

if( ! empty( $locations ) && isset( $locations[ $registered_menu ] ) ) {

    $menu = wp_get_nav_menu_object( $locations[ $registered_menu ] );
    $menu_items = wp_get_nav_menu_items( $menu->term_id );

    if( ! empty( $menu_items ) ) {

        foreach( $menu_items as $item ) {

            // Only grab page IDs
            if( 'page' !== $item->object ) {
                continue;
            }

            $page_ids[] = $item->object_id;

        }

    }

}

$page_query = new WP_Query( array(
    'post_type'     => 'page',
    'post_status'   => 'publish',
    'no_found_rows' => true,
    'post__in'      => $page_ids,
    'posts_per_page'=> 100, // Large upper limit
) );

Hấp dẫn. Cảm ơn bạn
Jamie
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.