Wordpress自定义帖子类型层次结构和菜单突出显示(current_page_parent)

Cra*_*aig 9 wordpress menu highlight hierarchical custom-post-type

我创建了一个自定义帖子类型的"投资组合"和页面,其中包含一个模板,用于检索与该自定义帖子类型匹配的所有帖子.

问题是当我深入到实际帖子时,帖子似乎位于主菜单突出显示的"博客"下面(将current_page_parent显示为一个类)

永久链接网址是正确的:www.site.com/portfolio/post-slug

但菜单认为父母是"博客".

这显然是一个等级问题,但我不知道如何解决它.

use*_*977 12

看来这是核心Wordpress代码的一个问题; 除了查看静态页面模板时,生成菜单类的代码会将current_page_parent添加到您的Blog页面.

(已经在http://core.trac.wordpress.org/ticket/13543上进行了讨论).

但是,您可以使用page_css_class过滤器使用一些自定义代码解决此问题.例如,沿着这些行添加一些东西到functions.php(不是100%测试):

function my_page_css_class($css_class, $page) {
    if (get_post_type()=='portfolio' || is_page(57)) {
        if ($page->ID == get_option('page_for_posts')) {
            foreach ($css_class as $k=>$v) {
                if ($v=='current_page_parent') unset($css_class[$k]);
            }
        }
        if ($page->ID==57) {
            $css_class[]='current_page_parent';
        }
    }
    return $css_class;
}
add_filter('page_css_class','my_page_css_class',10,2);

当然,用您的投资组合页面的ID替换57.这会在打印博客页面时删除current_page_parent,并在查看单个投资组合或查看投资组合页面本身时将current_page_parent添加到您的投资组合页面.


Tan*_*uki 6

这是我之前建议的解决方案的优化/扩展版本,几乎完全自动化.不再需要额外的CSS或菜单属性.

此版本动态获取自定义帖子类型列表,如果当前帖子类型是自定义帖子类型,则它会从所有菜单项中删除"current_page_parent"类.

此外,它会检查每个菜单项,以查看是否为包含页面模板的页面,如"page- {custom_post_type_slug} .php",如果是,则会添加"current_page_parent"类.

过滤器优先级为1,因为某些主题会替换current_page_parent/etc. 类似'active'的类(例如'root'就是这样),所以这个过滤器需要先执行.

最后,它使用3个静态变量,因为这个函数被重复调用,并且这些(显然)通过所有调用保持相同.

function theme_current_type_nav_class($css_class, $item) {
    static $custom_post_types, $post_type, $filter_func;

    if (empty($custom_post_types))
        $custom_post_types = get_post_types(array('_builtin' => false));

    if (empty($post_type))
        $post_type = get_post_type();

    if ('page' == $item->object && in_array($post_type, $custom_post_types)) {
        $css_class = array_filter($css_class, function($el) {
            return $el !== "current_page_parent";
        });

        $template = get_page_template_slug($item->object_id);
        if (!empty($template) && preg_match("/^page(-[^-]+)*-$post_type/", $template) === 1)
            array_push($css_class, 'current_page_parent');

    }

    return $css_class;
}
add_filter('nav_menu_css_class', 'theme_current_type_nav_class', 1, 2);
Run Code Online (Sandbox Code Playgroud)

PS.只是指出我到目前为止看到的所有非CSS解决方案中的一个缺点,包括我自己:没有考虑的事情是突出显示项目的菜单项父/祖先链接到显示当前自定义帖子的页面发布类型.考虑一个自定义的帖子类型"产品"和菜单,如:

Home  Company  News  Contact
      |
      \--About Us
      \--Products
Run Code Online (Sandbox Code Playgroud)

"产品"是包含模板"page-product.php"的页面,并显示"产品"类型的帖子的概述.由于发布了解决方案,它突出显示.但是,"公司"作为其父/祖先也应该突出显示,但事实并非如此.要记住的事情.