我正在寻找一个能够与菜单类交互的定制permalink插件。
例如,我有一个包含父菜单的菜单website.com/shop
作为其列表项之一。如果是一页,说website.com/shop/product
, 包括菜单,列表项website.com/shop
会上一节课current-page-ancestor
. 这对于设置链接样式非常有用,这样用户就可以知道他们在网站的哪个部分。
但我会有一些家长不会website.com/shop
(一个我无法更改的功能),但我希望它看起来website.com/shop
是父级。例如,页面是website.com/foo/product-2
. 我目前正在使用Custom Permalinks plugin 将永久链接更改为website.com/shop/product-2
. 但在执行此操作时,菜单无法识别website.com/shop
是父级,并且未将任何类添加到菜单的列表项中。
是否有任何解决方法,或者是否有人知道支持菜单祖先的自定义permalinks插件?
编辑
我觉得我就在那里,但错过了一件事。。。
function getUrl() {
$url = @( $_SERVER["HTTPS"] != \'on\' ) ? \'http://\'.$_SERVER["SERVER_NAME"] : \'https://\'.$_SERVER["SERVER_NAME"];
$url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
$url .= $_SERVER["REQUEST_URI"];
return $url;
}
function getDir($foo) {
$url = $foo;
$info = parse_url($url);
$dir = dirname($info["path"]);
return $dir;
}
function wpa83498_nav_class( $classes, $item ){
// if Shop is the current menu item being output
// and we\'re viewing a single product post type
$currentDirPath = getDir(getUrl());
if( (\'Sales\' == $item->title && is_singular( \'product\' )) || (parse_url($item->url, PHP_URL_PATH) == $currentDirPath && is_singular( \'product\' )) )
$classes[] = \'current-page-ancestor\';
return $classes;
}
add_filter( \'nav_menu_css_class\', \'wpa83498_nav_class\', 10, 2 );
最合适的回答,由SO网友:Timothy D 整理而成
这是我想出的最终解决方案。我花了很多时间研究是否可以将自定义帖子类型“product”更改为层次结构,并适当地设置其页面父级,以便菜单可以自然地添加正确的祖先类。但我遇到了一个障碍,最终回到了基于新permalink的解决方案。
因此,我想这应该适用于任何在使用自定义永久链接时试图伪造页面父层次结构的人。
我们获取当前页面url(由自定义permalinks插件设置),然后将其剥离到路径并将其保存为$currentDirPath
变量然后,我们评估菜单项的url路径是否包含在$currentDirPath
, 如果是这样,我们添加current-page-ancestor
班
function getUrl() {
$url = @( $_SERVER["HTTPS"] != \'on\' ) ? \'http://\'.$_SERVER["SERVER_NAME"] : \'https://\'.$_SERVER["SERVER_NAME"];
$url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
$url .= $_SERVER["REQUEST_URI"];
return $url;
}
function getDir($foo) {
$url = $foo;
$info = parse_url($url);
$dir = dirname($info["path"]);
return $dir;
}
function wpa83498_nav_class( $classes, $item ){
$currentDirPath = getDir(getUrl());
if( (strpos($currentDirPath,(parse_url($item->url, PHP_URL_PATH))) !== false) && is_singular( \'product\' ) )
$classes[] = \'current-page-ancestor\';
return $classes;
}
add_filter( \'nav_menu_css_class\', \'wpa83498_nav_class\', 10, 2 );
SO网友:Milo
您可以将类添加到wp_nav_menu
通过nav_menu_css_class 过滤器:
function wpa83498_nav_class( $classes, $item ){
// if Shop is the current menu item being output
// and we\'re viewing a single product post type
if( \'Shop\' == $item->title && is_singular( \'product\' ) )
$classes[] = \'current-page-ancestor\';
return $classes;
}
add_filter( \'nav_menu_css_class\', \'wpa83498_nav_class\', 10, 2 );
EDIT-
试试看组成菜单的对象是如何构造的。也许这会让您了解如何操作菜单输出。看看这样的事情
menu_item_parent
和
object_id
查看菜单项之间的关系以及它们所代表的帖子/页面。警告-请勿在活动站点上执行此操作!
function wpa_inspect_menu_objects( $menu ) {
echo \'<pre>\';
print_r( $menu );
echo \'</pre>\';
die();
}
add_filter( \'wp_nav_menu_objects\' , \'wpa_inspect_menu_objects\' );