사용자 정의 메뉴 항목을 하드 코딩하는 방법


22

첫 번째 테마를 설치할 때 사용자 정의 메뉴 항목을 하드 코딩 할 수있는 방법이 있습니까? 설치할 때 공통 페이지를 자동으로 만드는 테마를 만들고 있습니다. 따라서 Wordpress 사용자 정의 메뉴에 추가 할 수 있는지 알아야 클라이언트가 수동으로 추가 할 필요가 없습니까?

즉, 프로그래밍 방식으로 사용자 정의 메뉴 항목을 삽입 / 생성하는 방법은 무엇입니까?

불분명 한 것이 있으면 알려주세요. 적절한 코덱스 페이지에 대한 안내를 환영합니다. 감사!


업데이트 : 여기에서 코드 시도 wp_nav_menu_items를 사용하여 특정 메뉴 타겟팅

메뉴 등록 :

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

add_action( 'init', 'register_my_menus' );

템플릿 사용 :

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

새 항목을 추가하기위한 코드 :

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

functions.php파일의 탐색 메뉴에 새 항목을 추가하는 코드를 추가 할 때 관리자 패널의 메뉴 페이지에는 아무 일도 일어나지 않지만 현재 메뉴 항목은 사이트에 사라졌습니다!

답변:


23

코드의 문제는 실제로 메뉴에 대한 링크를 추가하지 않고 메뉴의 출력에만 링크를 추가하므로 필터 (add_filter)를 사용하므로 실제로 메뉴의 출력을 필터링하지 않는 것입니다. 사용중인 코드와 함께 링크가 표시되는 메뉴가 있습니다. 그러나 링크를 만들어 메뉴에 추가하려면 다음 코드를 사용할 수 있습니다.

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

나는 그것을 더 간단하게 만들기 위해 온통 댓글을 달았습니다.

하위 페이지 / 하위 페이지 / 두 번째 레벨 메뉴를 만들려면 (그러나 언제라도 호출 할 수 있음) menu-item-parent-id새 항목 을 설정해야합니다 . 예를 들면 다음과 같습니다.

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

또한 코드로 위치를 설정할 수 있으며 다음 menu-item-position 과 같이 생각합니다.

  • 첫 번째 항목- 'menu-item-position'=> 1
    • 첫 번째 항목 첫 번째 자식- 'menu-item-position'=> 1
    • 첫 번째 항목 두 번째 자식- 'menu-item-position'=> 1
      • 첫 번째 항목 두 번째 자식 첫 번째 자식- 'menu-item-position'=> 1
  • 두 번째 항목- 'menu-item-position'=> 2
  • 세 번째 항목- 'menu-item-position'=> 3
  • 네 번째 항목- 'menu-item-position'=> 4

. 사람들은 내가가 :) 사본 내가 홈 항목에 항목 아이를 추가하는 방법이 :( 하나 더 질문을 포함하지 않는 찾던 기능입니다 난 당신이 곧 내가 내 PC에 도착로 알려드립니다 감사합니다.!
Sisir을

@Sisir : 나는 자식 페이지를 만드는 방법을 예제로 업데이트했다
Bainternet

@Bainternet : 코드를 처음 실행할 때이 오류가 발생했습니다 Fatal error: Cannot use object of type stdClass as array in C:\wamp\www\citystir\wp-admin\menu.php on line 25. 그러나 메뉴가 만들어지고 페이지를 새로 고치면 모든 것이 작동하지만 Appearance -> Menu Theme Location섹션 에는 아무것도 표시되지 않습니다 . 우리는 정말 가깝습니다 :) 감사합니다!
Sisir

@Bainternet : 내 추측으로는 코드를 실행하려고 할 때 코드에 오류가 발생 $locations = get_theme_mod('nav_menu_locations');하기 때문에 그 전에 코드 (모든 메뉴 삽입이 완료 됨)가 실행되고 그 이후 코드 (원하는 테마 위치 설정)가 실행되지 않습니다 .
Sisir

@Sisir : 코드가 잘 작동하고 있습니다. 테마 위치 이름은 무엇이며 사용중인 정확한 코드를 보여줍니다. 도움이 될 수 있는지 확인할 것입니다.
Bainternet

8

원래 코드는 돈에 매우 가깝고 @Bainternet의 긴 해결책 (범죄 없음)은 과도하다고 생각합니다. 대신이를 살펴보십시오.

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

유일한 문제는 함수가 올바른 메뉴를 확인한 후 $ items를 반환하지 않고 확인하는 데 필요한 두 번째 콜백 인수가 누락되었다는 것입니다 ( $ args ).


이 방법을 사용하여 메뉴 항목의 위치를 ​​어떻게 설정 하시겠습니까?
Michael N

1

Wordpress 3.4.2에는 버그가 있습니다.

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

용어 관계를 수동으로 작성해야합니다.

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

간단한 메뉴 생성을위한 Menu 클래스의 예는 https://gist.github.com/4148529 를 참조 하십시오 .


0

정보를 위해 현재 사용자는 용어를 추가 할 수있는 권한이 있어야합니다. wp_set_current_user (1)에 대한 호출을 추가하기 전에 내 menu_items가 작성되었지만 wp_terms_relationship 테이블에 추가되지 않았습니다.

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