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


11

내 탐색의 모든 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);

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

답변:


13

메뉴 항목은에 저장됩니다 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 );


위에 게시 한 코드를 작동시키는 데 시간이 걸렸습니다. 코드를 추가하려고 시도했지만 작동시키지 못했습니다. 나는 foreach 루프를 꺼내고 위의 라인을 시도했지만 아무것도 얻지 못했습니다. 당신의 모범을 어떻게 사용합니까?
Jamie

@Jamie 그냥 당신의 라인을 교체하십시오 : $numbers[] = $menu_item->ID;내 대답 의 라인으로 바꾸십시오 .
anu

1

이 변경 사항이 발생하면 알려 드릴 수 없지만 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
) );

흥미 롭군 감사합니다
Jamie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.