2013-04-29 4 views
0

사이드 바에 맞춤 메뉴를 표시하는 데 문제가 있습니다. 이제 WordPress 백엔드에서 메뉴를 만들었습니다. 이 메뉴는 템플릿의 사이드 바에 메뉴 이름 (예 : CUSTOM MENU)과 부모와 자식이있는 구조로 표시되어야합니다.Wordpress의 맞춤 메뉴 Wordpress

내 목표는 this입니다. 이 코드

$meta_box_menu = array(
'id' => 'custom-meta-menu', 
'title' => 'Menu Sidebar', 
'page' => 'page', 
'context' => 'side', 
'priority' => 'high', 
'fields' => array(
    array(
     'id' => 'custom-meta-menu-name', 
     'type' => 'select', 
     'std' => 'none' 
    ), 
), 
); 

/* 
* This function will register the meta box with WordPress 
*/ 
function custom_add_box() { 
    global $meta_box_menu; 
    add_meta_box($meta_box_menu['id'], $meta_box_menu['title'], 'custom_meta_menu_html', 
$meta_box_menu['page'], $meta_box_menu['context'], $meta_box_menu['priority']); 
} 
add_action('admin_init', 'custom_add_box'); 

/* 
* This function will produce the html needed to display our meta box in the admin area 
*/ 
function custom_meta_menu_html() { 
    global $meta_box_menu, $post; 

    $output = '<p style="padding:10px 0 0 0;">'.__('Scegli il menu da mostrare nella Sidebar di questa pagina.', 'custom').'</p>'; 
    $output .= '<input type="hidden" name="sf_meta_box_nonce" value="'. 
wp_create_nonce(basename(__FILE__)). '" />'; 

    $output .= '<table class="form-table">'; 

    foreach ($meta_box_menu['fields'] as $field) { 
    $meta = get_post_meta($post->ID, $field['id'], true); 

/* 
* Get out all our menus using the function from functions.php 
*/ 
$menus = custom_get_all_menus(); 

/* 
* Grab out saved data for edit mode 
*/ 
$meta = get_post_meta($post->ID, $field['id'], true); 

$output .= '<select name="'.$field['id'].'" class="widefat">'; 
$output .= '<option value="none">- none -</option>'; 
if(is_array($menus)): 
    foreach($menus as $k => $v): 
    if($meta==$v->slug): 
     $output .= '<option selected="selected" value="' . $v->slug .'">' . $v->name . '</option>'; 
    else: 
     $output .= '<option value="' . $v->slug .'">' . $v->name . '</option>'; 
    endif; 
    endforeach; 
endif; 
$output .= '</select>'; 

    } 

    $output .= '</table>'; 

    echo $output; 
} 

/* 
* This function will save our preferences into the database 
*/ 
function custom_save_data($post_id) { 

    global $meta_box, $meta_box_menu; 

foreach ($meta_box_menu['fields'] as $field) { 
    $old = get_post_meta($post_id, $field['id'], true); 
    $new = $_POST[$field['id']]; 

    if ($new && $new != $old) { 
    update_post_meta($post_id, $field['id'], stripslashes(htmlspecialchars($new))); 
    } elseif ('' == $new && $old) { 
    delete_post_meta($post_id, $field['id'], $old); 
    } 
    } 
} 
add_action('save_post', 'custom_save_data'); 

function custom_get_all_menus() { 
    $menu_obj = get_terms('nav_menu'); 
    return $menu_obj; 
} 

/* 
* Html Custom Sidebar Menu 
*/ 
function custom_generate_menu_from_items($items) { 
    if(count($items)>0): 
    $menu_list = '<aside class="widget sidebar_menu"><h5 class="widget-title">' .'CUSTOM MENU'. '</h5><nav><ul class="sidebar-menu-items">'; 
    foreach ((array) $items as $key => $menu_item) { 
    $title = $menu_item->title; 
    $url = $menu_item->url; 
    $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>'; 
    } 
$menu_list .= '</ul></nav></aside>'; 
return $menu_list; 
$menu_item->title = get_post_meta($menu_item->ID, '_menu_item_title', true); 
    return $menu_item; 
endif; 
add_filter('wp_get_nav_menu_items', 'custom_generate_menu_from_items', null, 3); 
} 

, 메뉴가 출력 페이지에 보여되지만 페이지가 부모 자식 관계없이 동일한 수준에 배치됩니다 :

는 순간, 나는 코드의이 부분을했습니다. 이 관계를 유지하려면 어떻게해야합니까?

감사합니다. 관계를 확인 거기에는 논리가 없다

답변

0

, 어디 선가

var_dump($items); 

말과 메뉴 항목의 관계에 관한 몇 가지 필드가 있는지 것입니다. 아마도 "부모"또는 그 선을 따라 보이는 무언가 일 것입니다.

없으면 직접 쿼리해야합니다.

일단 부모 ID가 있으면 부모 ID가 있는지 확인하고 그 방법으로 형식을 처리 할 수 ​​있습니다. 부모가 부모를 갖고 있는지 확인하고 다른 모든 경우에 대해 서식을 처리해야하기 때문에 두 개 이상의 수준이 중첩되면 약간 까다로워집니다.

관련 문제