去除 wordpress 链接中的域名

nav_walker

上次说到去除一些不必需的 class 和 ID, 从上图看出,这些 domain name 似乎也是不必须的,如果像下图:

这样会不会更好呢,下面的代码可以实现这个效果。

add_filter('walker_nav_menu_start_el' , 'yao_walker_nav_menu_start_el' , 10 , 2);
function yao_walker_nav_menu_start_el($item_output, $item){
	//print_r($item);
	$home_url = home_url();
	$site_url = site_url();
	preg_match("/^(http:\/\/)?([^\/]+)/i",site_url(), $matches);
	$domain = $matches[0];
	if( $domain == $home_url){
		$replace  = '';
	}else{
		$replace  = str_replace($matches[0], '', site_url());
	}
	$item->url = str_replace($home_url,$replace,$item->url);
		
	$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 ) .'"' : '';
	$item_output = $args->before;
	$item_output .= '<a'. $attributes .'>';
	$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
	$item_output .= '</a>';
	$item_output .= $args->after;
	return $item_output;
}


add_filter('the_permalink', 'yao_the_permalink');
function yao_the_permalink (){
	$yao_permalink = get_permalink();
	$site_url = home_url();
	echo str_replace($site_url,'',$yao_permalink);
}

add_filter('get_permalink', 'yao_get_permalink');
function yao_get_permalink (){
	$site_url = home_url();
	return str_replace($site_url,'', get_permalink());
}

清理wordpress菜单里的 id 和 class

wordpress 默认的菜单会产生很多 id 和 class 在代码里,打多时候,这些都是不需要的。

通过下面2个滤镜,可以去除那些我们不需要的 class 和 ID

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
	$current_and_home = array("current-menu-item", "menu-item-home", 'last');
	$classes = array_intersect($item->classes,$current_and_home);
        //保留有需要的 class
	return $classes;
}

add_filter('nav_menu_item_id' , 'special_nav_item_id' , 10 , 2);
function special_nav_item_id($item_id, $item){
        $item_id = ""; //去除 id
	return $item_id;
}

清理之后如:

不过尚有 class=”” 无法除去,主要是在核心代码里,class=””是在附加过滤后面加上得,所以暂时还不可以通过更改滤镜的方法去除,但是 id 属性可以完全去除