탐색 항목에서 페이지 ID 가져 오기 ( (

내 탐색의 모든 ID를 가져 와서 문자열로 변환 wp_query하여 탐색에만 나열된 페이지를 가져올 때 사용할 수 있도록 노력하고 있습니다. 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);

그러나 잘못된 숫자를 반환합니다. 관리 영역으로 이동하여 페이지 위로 마우스를 가져 가면 화면 하단의 주소 표시 줄에 표시되는 숫자가 일치하지 않습니다. 내가 무엇을 잘못하고 있지?



답변

메뉴 항목은에 저장됩니다 posts와 테이블 post_typenav_menu_item. 그래서, 당신이 돌려주는 것은 그것이 가리키는 것이 아니라 메뉴 항목 자체의 ID입니다.

메뉴 항목이 참조하는 페이지 / 포스트 ID가 메뉴 항목 및 = 와 일치하는 postmeta표와 함께 표에 저장됩니다 . 메뉴 항목이 가리키는 페이지 를 얻는 가장 쉬운 방법 은 다음과 같은 것을 사용하는 것입니다.post_idIDmeta_key_menu_item_object_idmeta_value

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


답변

이 변경 사항이 발생하면 알려 드릴 수 없지만 WordPress 버전 5.2.4 부터 페이지 ID를 사용 object하고 object_id검색 할 수 있습니다 . 이 작업을 수행하는 방법은 다음과 같습니다.

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