Hard Kod Nasıl Yapılır Özel menü öğeleri


22

İlk tema yüklendiğinde özel menü öğelerini kodlayabilmemin bir yolu var mı? Yüklendiğinde otomatik olarak bazı ortak sayfalar oluşturacak bir tema oluşturuyorum. Bu yüzden onları Wordpress özel menüsüne de ekleyip ekleyemeyeceğimi bilmem gerekiyor, böylece müşterinin elle eklemesi gerekmiyor mu?

Başka bir deyişle: özel menü öğesini programlı olarak ekleme / oluşturma

Bir şey belirsiz ise bana bildirin. Uygun kodeks sayfasına Rehberlik açığız. Teşekkürler!


güncelleme: buradan kodu denedi wp_nav_menu_items ile belirli bir menü hedefleme

Menü kaydı:

function register_my_menus() {
  register_nav_menus(
    array('main-menu' => __( 'Main Menu' ) )
  );
}

add_action( 'init', 'register_my_menus' );

Şablon kullanımı:

<?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?>

Yeni ürün ekleme kodu:

function new_nav_menu_items($items) {
    if( $args->theme_location == 'main-menu' ){
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    $items = $homelink . $items;
    return $items;
    }
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Navigasyon menüsündeki yeni öğelerin eklenmesi için kod eklendiğinde, functions.phpdosya notlarında admin panelindeki menü sayfasında olur fakat mevcut menü öğeleri siteye girer!

Yanıtlar:


23

Kodunuzla ilgili sorun, aslında menüye ve yalnızca menünün çıkışına bağlantılar eklememesidir, bu nedenle bir süzgeç (add_filter) kullanımıdır; Bağlantınızın kullandığınız kodla birlikte gösterileceği bir menüye sahip olmak. Ancak bir link oluşturmak ve onu bir menüye eklemek için bu kodu kullanabilirsiniz:

$run_once = get_option('menu_check');
if (!$run_once){
    //give your menu a name
    $name = 'theme default menu';
    //create the menu
    $menu_id = wp_create_nav_menu($name);
    //then get the menu object by its name
    $menu = get_term_by( 'name', $name, 'nav_menu' );

    //then add the actuall link/ menu item and you do this for each item you want to add
    wp_update_nav_menu_item($menu->term_id, 0, array(
        'menu-item-title' =>  __('Home'),
        'menu-item-classes' => 'home',
        'menu-item-url' => home_url( '/' ), 
        'menu-item-status' => 'publish'));

    //then you set the wanted theme  location
    $locations = get_theme_mod('nav_menu_locations');
    $locations['main-menu'] = $menu->term_id;
    set_theme_mod( 'nav_menu_locations', $locations );

    // then update the menu_check option to make sure this code only runs once
    update_option('menu_check', true);
}

Daha basit hale getirmek için her yere yorum yaptım.

Bir alt sayfa / alt sayfa / ikinci seviye menü oluşturmak için (nasıl arayabilirseniz), menu-item-parent-idörneğin yeni öğeyi ayarlamanız yeterlidir :

//create the top level menu item (home)
$top_menu = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => 0,
    ));
//Sub menu item (first child)
$first_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('First_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $top_menu,
    ));
//Sub Sub menu item (first child)
$Second_child = wp_update_nav_menu_item($menu->term_id, 0, array( 
    'menu-item-title' =>  __('Second_Child'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'
    'menu-item-parent-id' => $first_child,
    ));

ayrıca pozisyonu koda göre ayarlayabilirsiniz menu-item-position ve bunun böyle yapıldığını düşünüyorum:

  • İlk öğe - 'menu-item-position' => 1
    • İlk madde birinci çocuk - 'menu-item-position' => 1
    • Birinci madde ikinci çocuk - 'menu-item-position' => 1
      • İlk madde ikinci çocuk ilk çocuk - 'menu-item-position' => 1
  • İkinci öğe - 'menu-item-position' => 2
  • 3. öğe - 'menü öğesi öğesi' => 3
  • 4. öğe - 'menü öğesi öğesi' => 4

. Bunlar ı için :) kodeksi i Ana öğe için bir öğe çocuğu ekleyebilir bunların nasıl :( Bir soru daha dahil değildir bakıyordu fonksiyonlar Ben en kısa sürede ben benim pc olsun bildireceğiz teşekkürler.!
Sisir

@Sisir: Alt sayfaların nasıl oluşturulacağıyla ilgili bir örnekle güncelledim
Bainternet

@Bainternet: kodu ilk çalıştırdığınızda bu hatayı aldım Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. Ancak menü oluşturulur ve sayfa yenilendiğinde her şey çalışır ancak Appearance -> Menu Theme Locationbölümde hiçbir şey gösterilmez . Gerçekten yakınız :) Teşekkürler!
Sisir

@Bainternet: Tahminim kod çalıştırmaya çalışırken kodun yanlış olduğunu gösteriyor. $locations = get_theme_mod('nav_menu_locations');Bundan önce kodlar (tüm menü ekleme yapılır) yürütülür ve bundan sonra kod (istenen tema konumunu ayarla) çalıştırılmaz. .
Sisir

@Sisir: kod gayet iyi çalışıyor, tema konum adınız nedir ve bana tam olarak kullandığınız kodu gösterin, yardım edip edemeyeceğimi göreceğim.
Bainternet

8

Orjinal kodunuz paraya çok yakın ve ciddi bir şekilde @Bainternet'in (suçsuz) bu uzun çözümünün çok fazla aşikar olduğunu düşünüyorum, bunun yerine şuna bir göz atın:

function new_nav_menu_items($items, $args) {
    if( $args->theme_location == 'primary' ){
        $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
        $items = $homelink . $items;
    }
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );

Tek sorun, işlev doğru menüyü kontrol ettikten sonra $ öğelerini döndürmemeniz ve çek ( $ args ) işlemini yapmak için gereken ikinci geri arama değişkenini kaçırmanızdı .


Bu yöntemi kullanarak menü öğesinin konumunu nasıl ayarladınız?
Michael N

1

Wordpress 3.4.2'de bir hata var:

https://github.com/WordPress/WordPress/commit/ae96b842f9f55ecfb22da705a4902b9d25580259#wp-includes/nav-menu.php

İlişki terimini manuel olarak oluşturmanız gerekir:

$menu = wp_get_nav_menu_object('top menu');
$id = wp_update_nav_menu_item($menu->term_id, 0, $data);

if ($menu->term_id && (!is_object_in_term($id, 'nav_menu', (int)$menu->term_id))) {
    wp_set_post_terms($id, array((int)$this->id), 'nav_menu');
}

Basit menü oluşturma ile ilgili Menu sınıfının bir örneği için https://gist.github.com/4148529 adresine bakın .


0

Bilgi için, mevcut kullanıcının terimler ekleme hakları olmalı, wp_set_current_user (1) 'e bir çağrı eklemeden önce menu_items'im oluşturuldu ama wp_terms_relationship tablosuna eklenmedi;

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.