Gezinme öğelerinden sayfa kimliklerini alma


11

Ben wp_querysadece gezinme listelenen sayfaları almak için kullanabilirsiniz böylece benim gezinti tüm kimlikleri almak ve bir dizeye dönüştürmek çalışıyorum . Kimlikleri almak için kod:

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

Ama yanlış rakamlar geri geliyor. Yönetici alanına gidip faremin sayfaların üzerine geldiğimde, ekranın altındaki adres çubuğunda gösterilen sayı eşleşmiyor. Neyi yanlış yapıyorum?

Yanıtlar:


13

Menü öğeleri saklanır postsbir masanın post_typeait nav_menu_item. Yani, geri döndüğünüz şey, işaret ettiği şeyin değil menü öğesinin kimliğidir.

Menü öğesinin atıfta bulunduğu sayfa / posta kimliği postmetatabloda post_idve menü öğesiyle IDve meta_key= ile eşleşen bir depoda saklanır _menu_item_object_id. Almanın en kolay yolu meta_value(yani, menü öğesinin işaret ettiği sayfa) şöyle bir şey kullanmaktır:

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


Çalışmak için yukarıda gönderdiğim kodu almak biraz zaman aldı. Kodunuzu eklemeye çalışıyorum ama işe almak mümkün değil. Foreach döngüsünü çıkardım ve yukarıdaki çizginizi denedim ama hiçbir şey almadım. Örneğinizi nasıl kullanırım?
Jamie

@Jamie Sadece hattınızı değiştirin: cevabımdakiyle $numbers[] = $menu_item->ID;.
anu

1

Bu değişikliğin ne zaman gerçekleştiğini size söyleyemem, ancak WordPress sürüm 5.2.4'ten itibaren sayfa kimliğini kullanabilir objectve object_idalabilirsiniz. İşte bunu nasıl yapacağım:

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

İlginç. Teşekkür ederim
Jamie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.