사용자 정의 메뉴에서 탐색 메뉴 항목을 제외 / 제거하는 방법에 대한 정보를 찾으려고했지만 찾은 유일한 스레드 에는 유용한 답변이 없었습니다.
1. 배경 :
내 사이트에서 WP 사용자 정의 메뉴 (wp_nav_menu)와 jqDock 을 사용하여 Dock 메뉴를 구성 했습니다. jqDock은 마술처럼 작동하기 위해 연속적인 이미지 또는 이미지 링크가 필요하기 때문에 사용자 지정 워커를 사용하여 탐색 메뉴 HTML 출력이 다음과 같이 보입니다.
<div id="menu-first" class="nav">
<a><img src="http://path/to/image-1.png"/></a>
<a><img src="http://path/to/image-2.png"/></a>
<a><img src="http://path/to/image-3.png"/></a>
etc...
</div>
내 맞춤 워커의 코드는 다음과 같습니다.
class custom_nav_walker extends Walker_Nav_Menu
{
var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );
function start_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "\n$indent<ul class=\"sub-menu\">\n";
}
function end_lvl(&$output, $depth) {
$indent = str_repeat("\t", $depth);
$output .= "$indent</ul>\n";
}
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
$class_names = $value = '';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$classes[] = 'menu-item-' . $item->ID;
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
$class_names = ' class="' . esc_attr( $class_names ) . '"';
$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
$id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';
//$output .= $indent . '<li' . $id . $value . $class_names .'>';
$attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
$attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
$attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
$attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';
$description = ! empty( $item->description ) ? esc_attr( strtolower( $item->description )) : '';
$item_title = ! empty( $item->attr_title ) ? esc_attr( $item->attr_title ) : '';
if ( strpos($description, ';') !== false ) {
$description_array = explode (';', $description);
$image_name = $description_array[0];
$image_alt = $description_array[1];
} else {
$image_name = $description;
$image_alt = $item_title;
}
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .'<img src="'.get_bloginfo('template_url').'/images/skin1/'.$image_name.'" alt="'.$image_alt.'" title="'.$item_title.'" />'.$args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
}
function end_el(&$output, $item, $depth) {
$output .= "";
}
}
그런 다음 jqDock 스크립트는 메뉴 ID ( 'menu-first')를 잡고 wp_nav_menu 출력을 Dock 메뉴로 바꿉니다. Dock 메뉴의 HTML 출력은 jqDock을로드 할 때 지정된 옵션에 따라 변경됩니다.
2. 질문 :
사용자의 사이트 위치에 따라 특정 메뉴 항목을 표시하지 않으려 고합니다 (즉, 제외). 예를 들어, 사용자가 집에 없을 때만 홈 항목을 표시하고 그가있을 때만 임의 게시물 항목을 표시하고 싶습니다.
3. 폐기 된 솔루션 :
ㅏ. 다중 메뉴 : 여러 메뉴를 등록 및 생성 한 다음 조건부로 호출하면 작동 할 수 있습니다. 그러나 여러 가지 이유로 이것이 이상적이고 깨끗한 해결책이라고 생각하지 않습니다. 또한 여러 메뉴를 유지 관리하거나 업데이트하기가 쉽지 않습니다.
비. 정규식 검색 및 바꾸기 : HTML 출력이 수정되어 jqDock 옵션을 변경할 때마다 바늘 매개 변수 를 변경해야 할 수 있습니다 .
씨. CSS 'display'속성 : CSS display 속성을 통해 항목을 숨기는 것은 작동하지만 jqDock 메뉴 출력에 적용되어야하기 때문에 메뉴의 시각적 렌더링에 영향을줍니다.
4. 실패한 해결책 :
ㅏ. wp_nav_menu_items로 필터링 : '$ items'변수 (문자열)를 포착하고 다음 코드로 조건부 태그를 통해 다른 값을 할당하려고했습니다.
function userf_dynamic_nav_menu ($items) {
$items_array_home = explode('<a', $items);
$items_array_nothome = $items_array_home;
unset($items_array_home[1]);
unset($items_array_nothome[2]);
$items_home = implode('<a', $items_array_home);
$items_nothome = implode('<a', $items_array_nothome);
if ( is_home() ) {
$items = $items_home;
} else {
$items = $items_nothome;
}
return $items;
}
add_filter('wp_nav_menu_first_items', 'userf_dynamic_nav_menu');
메뉴 항목이 변경되기 때문에 부분적으로 만 작동하지만 조건부 태그는 무시됩니다. 필터가 적용되는 순간 때문에 이것이 의미가 있다고 생각합니다.
비. 사용자 정의 탐색 메뉴 기능 : $ defaults 배열에 제외 인수를 추가하고이 약간 수정 된 코드를 사용 wp_list_pages
하여 추가 인수를 채울 수있는 사용자 정의 탐색 메뉴 기능을 작성하려고했습니다 .
$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );
어떤 아이디어?
exclude
인수 를 전달하려고 생각 했지만 wp_list_pages
다른 많은 WP 함수와 wp_nav_menu
는 달리 인수를 포함하지 않았습니다. 따라서 메뉴를 호출 할 때 또는 워커에서 하나를 지정하더라도 내부 wp_nav_menu
에서 픽업되지 않습니다 .