ナビゲーションアイテムからページ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は、メニュー項目に一致するpostmetaa および= とともにテーブルに格納されpost_idます。を取得する最も簡単な方法(つまり、メニュー項目によってポイントされているページ)は、次のようなものを使用することです。IDmeta_key_menu_item_object_idmeta_value

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


上記で投稿したコードが機能するまでに少し時間がかかりました。私はあなたのコードを追加しようとしましたが、それを機能させることができませんでした。私はforeachループを取り出し、上の行を試しましたが何も得られませんでした。あなたの例をどのように使用しますか?
ジェイミー

@ジェイミーちょうどあなたの行を置き換えてください:$numbers[] = $menu_item->ID;私の答えの1つで。
an

1

この変更がいつ発生したかはわかりませんが、WordPressバージョン5.2.4以降では、ページIDを使用objectobject_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
) );

面白い。ありがとう
ジェイミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.