菜单中的自定义固定链接插件和当前页面/祖先

时间:2013-01-28 作者:Timothy D

我正在寻找一个能够与菜单类交互的定制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 );

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_parentobject_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\' );

结束

相关推荐

permalinks issue and archives

我对运行在WP 3.3上的一个站点有一个问题,当我们通过“/%post\\u id%/%postname%/”使永久链接成为任何内容时,归档页面会断开并变成404。经过一些研究,我明白了为什么从性能的角度来看,这不是一个好的做法,所以我尝试了建议的备选方案:“/%year%/%postname%/”和“/%post\\u id%/%postname%/”这两个建议都有效,只是只有使用post\\u id的建议,归档URL才会变成“/date/2012/11/”,并被找到。根据permalink的任何其他建