将自定义帖子类型档案添加到WordPress菜单

时间:2011-02-25 作者:Travis Northcutt

有没有办法(除了添加自定义链接外)将自定义帖子类型存档添加到WordPress的菜单中?如果是使用自定义链接(例如/cpt archive slug/)添加的,WordPress不会应用像这样的类current-menu-item 列表元素,这在设置菜单样式时会带来挑战。

如果自定义链接包含整个URL(例如。http://site.com/cpt-archive-slug/), 将添加这些类。然而,这可能不是“最佳实践”。

8 个回复
最合适的回答,由SO网友:Bainternet 整理而成

您最好的选择是使用完整url进行自定义链接,因为自定义帖子类型归档不同于基于分类法的归档(类别、标记、任何自定义分类法)和基于日期的归档,它们都有自己的归档slug。

SO网友:tungd

我知道这很旧,但我也有这个问题,我找到了一个相当干净的方法来处理它,那就是使用自定义菜单漫游器

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ \'#post_type_\'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}
具有URL为的自定义链接菜单项#post_type_album, 您可以这样使用它:

# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types(\'album\');

# And display the menu
wp_nav_menu(array(
  \'theme_location\' => \'primary-nav\',
  \'walker\' => new KB_Custom_Menu_Walker(),
));
注意:这假设您的帖子类型的slug和name是相同的。

SO网友:pospi

我已经扩展了一点tungd\'s answer 为该方法提供更多通用性。此实现允许在菜单“宏”和内部Wordpress URL之间添加只有后端知道的任意映射。

我还决定使用! 作为这些宏的前缀,以避免它们与命名锚冲突-这包括从链接URL中去除“http://”的开销(因为Wordpress将尝试正常化这些奇怪的链接)。如果该实现让您感到困扰,您可以随时删除preg_replace() 呼叫和使用# 像以前一样作为链接前缀。

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace(\'@^https?://@\', \'\', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls[\'!\' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping(\'post_type_\' . $type, get_post_type_archive_link($type));
    }
}

add_action(\'init\', array(\'Extendable_Menu_Walker\', \'setupUrls\'));

SO网友:jb510

您可以创建一个页面,然后对其应用自定义存档模板。我创建并使用存档{post type}。php fo模板名称就像默认归档文件一样,我只是手动将其应用于页面。

如果您这样做,我建议将您的CPT设置为has\\u archive=\'false\'以避免永久链接冲突,不管怎样,只要确保您的页面具有与CPT archive slug设置为不同的永久链接slug即可。

SO网友:TJK

我遇到了同样的问题,并找到了解决方案:

// $menu is the menu as a string 
if ( check if youa re on the page you are looking for )
    $menu = str_replace( \'<li class="menu-item"><a href="http://bla.com/bloop/">\', \'<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">\'>, $menu );  
资料来源:http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html

SO网友:sergio

我想我必须创建一个新的“父”帖子类型,这样我要显示的自定义帖子类型就变成了“子”帖子类型,并且该父类型将列在菜单中。

这应该是一种选择。创建一个虚拟父级只是为了将其列在菜单中,工作量太大了。

我想从模板或函数中找到一种方法,这样我就不必在多站点安装中的每个站点的每个菜单设置中进行操作。

SO网友:Ole Henrik Skogstrøm

我在搜索类似问题时找到了这个答案。我只是把代码复制到我的finctions中。php文件,它的工作方式是开箱即用:)希望它有帮助!

Dynamic navigation for custom post type (pages)

SO网友:chifliiiii

我所做的不是添加链接,而是创建一个空页面。在该页面中,我在编辑器中添加了类似“由cpt名称生成的内容”的内容,以便我的客户知道所有内容的来源。

然后,我将该页面添加到菜单中,并使用以下代码确保在归档cpt或单个cpt运行时突出显示该页面。

/**
 * Fix to add Custom post types to nav menu
 * If you custom post is called "concepts"
 * create a new empty page called concepts and add this
 */
 function additional_active_item_classes($classes = array(), $menu_item = false){
    global $wp_query;


    if(in_array(\'current-menu-item\', $menu_item->classes)){
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_post_type_archive(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_singular(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }


    return $classes;
}
add_filter( \'nav_menu_css_class\', \'additional_active_item_classes\', 10, 2 );
这将检查菜单/页面标题,以及我们是否实际看到了自定义帖子类型的存档或单个页面。如果是真的,它将添加当前菜单项类。

结束

相关推荐

Menu API not switching menus?

我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph

将自定义帖子类型档案添加到WordPress菜单 - 小码农CODE - 行之有效找到问题解决它

将自定义帖子类型档案添加到WordPress菜单

时间:2011-02-25 作者:Travis Northcutt

有没有办法(除了添加自定义链接外)将自定义帖子类型存档添加到WordPress的菜单中?如果是使用自定义链接(例如/cpt archive slug/)添加的,WordPress不会应用像这样的类current-menu-item 列表元素,这在设置菜单样式时会带来挑战。

如果自定义链接包含整个URL(例如。http://site.com/cpt-archive-slug/), 将添加这些类。然而,这可能不是“最佳实践”。

8 个回复
最合适的回答,由SO网友:Bainternet 整理而成

您最好的选择是使用完整url进行自定义链接,因为自定义帖子类型归档不同于基于分类法的归档(类别、标记、任何自定义分类法)和基于日期的归档,它们都有自己的归档slug。

SO网友:tungd

我知道这很旧,但我也有这个问题,我找到了一个相当干净的方法来处理它,那就是使用自定义菜单漫游器

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ \'#post_type_\'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}
具有URL为的自定义链接菜单项#post_type_album, 您可以这样使用它:

# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types(\'album\');

# And display the menu
wp_nav_menu(array(
  \'theme_location\' => \'primary-nav\',
  \'walker\' => new KB_Custom_Menu_Walker(),
));
注意:这假设您的帖子类型的slug和name是相同的。

SO网友:pospi

我已经扩展了一点tungd\'s answer 为该方法提供更多通用性。此实现允许在菜单“宏”和内部Wordpress URL之间添加只有后端知道的任意映射。

我还决定使用! 作为这些宏的前缀,以避免它们与命名锚冲突-这包括从链接URL中去除“http://”的开销(因为Wordpress将尝试正常化这些奇怪的链接)。如果该实现让您感到困扰,您可以随时删除preg_replace() 呼叫和使用# 像以前一样作为链接前缀。

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace(\'@^https?://@\', \'\', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls[\'!\' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping(\'post_type_\' . $type, get_post_type_archive_link($type));
    }
}

add_action(\'init\', array(\'Extendable_Menu_Walker\', \'setupUrls\'));

SO网友:jb510

您可以创建一个页面,然后对其应用自定义存档模板。我创建并使用存档{post type}。php fo模板名称就像默认归档文件一样,我只是手动将其应用于页面。

如果您这样做,我建议将您的CPT设置为has\\u archive=\'false\'以避免永久链接冲突,不管怎样,只要确保您的页面具有与CPT archive slug设置为不同的永久链接slug即可。

SO网友:TJK

我遇到了同样的问题,并找到了解决方案:

// $menu is the menu as a string 
if ( check if youa re on the page you are looking for )
    $menu = str_replace( \'<li class="menu-item"><a href="http://bla.com/bloop/">\', \'<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">\'>, $menu );  
资料来源:http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html

SO网友:sergio

我想我必须创建一个新的“父”帖子类型,这样我要显示的自定义帖子类型就变成了“子”帖子类型,并且该父类型将列在菜单中。

这应该是一种选择。创建一个虚拟父级只是为了将其列在菜单中,工作量太大了。

我想从模板或函数中找到一种方法,这样我就不必在多站点安装中的每个站点的每个菜单设置中进行操作。

SO网友:Ole Henrik Skogstrøm

我在搜索类似问题时找到了这个答案。我只是把代码复制到我的finctions中。php文件,它的工作方式是开箱即用:)希望它有帮助!

Dynamic navigation for custom post type (pages)

SO网友:chifliiiii

我所做的不是添加链接,而是创建一个空页面。在该页面中,我在编辑器中添加了类似“由cpt名称生成的内容”的内容,以便我的客户知道所有内容的来源。

然后,我将该页面添加到菜单中,并使用以下代码确保在归档cpt或单个cpt运行时突出显示该页面。

/**
 * Fix to add Custom post types to nav menu
 * If you custom post is called "concepts"
 * create a new empty page called concepts and add this
 */
 function additional_active_item_classes($classes = array(), $menu_item = false){
    global $wp_query;


    if(in_array(\'current-menu-item\', $menu_item->classes)){
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_post_type_archive(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_singular(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }


    return $classes;
}
add_filter( \'nav_menu_css_class\', \'additional_active_item_classes\', 10, 2 );
这将检查菜单/页面标题,以及我们是否实际看到了自定义帖子类型的存档或单个页面。如果是真的,它将添加当前菜单项类。

将自定义帖子类型档案添加到WordPress菜单 - 小码农CODE - 行之有效找到问题解决它

将自定义帖子类型档案添加到WordPress菜单

时间:2011-02-25 作者:Travis Northcutt

有没有办法(除了添加自定义链接外)将自定义帖子类型存档添加到WordPress的菜单中?如果是使用自定义链接(例如/cpt archive slug/)添加的,WordPress不会应用像这样的类current-menu-item 列表元素,这在设置菜单样式时会带来挑战。

如果自定义链接包含整个URL(例如。http://site.com/cpt-archive-slug/), 将添加这些类。然而,这可能不是“最佳实践”。

8 个回复
最合适的回答,由SO网友:Bainternet 整理而成

您最好的选择是使用完整url进行自定义链接,因为自定义帖子类型归档不同于基于分类法的归档(类别、标记、任何自定义分类法)和基于日期的归档,它们都有自己的归档slug。

SO网友:tungd

我知道这很旧,但我也有这个问题,我找到了一个相当干净的方法来处理它,那就是使用自定义菜单漫游器

class KB_Custom_Menu_Walker extends Walker_Nav_Menu {

  protected static $custom_post_types = array();

  public function start_el(&$output, $item, $depth=0, $args=array(), $id=0) {
    if (isset( self::$custom_post_types[ $item->url ] )) {
      $item->url = get_post_type_archive_link( self::$custom_post_types[$item->url] );
    }
    parent::start_el($output, $item, $depth, $args, $id);
  }

  public static function custom_post_types($type=null) {
    if ($type) {
      self::$custom_post_types[ \'#post_type_\'.$type ] = $type;
    }
    return self::$custom_post_types;
  }
}
具有URL为的自定义链接菜单项#post_type_album, 您可以这样使用它:

# Where you defined your custom post type (could be anywhere anyway)
KB_Custom_Menu_Walker::custom_post_types(\'album\');

# And display the menu
wp_nav_menu(array(
  \'theme_location\' => \'primary-nav\',
  \'walker\' => new KB_Custom_Menu_Walker(),
));
注意:这假设您的帖子类型的slug和name是相同的。

SO网友:pospi

我已经扩展了一点tungd\'s answer 为该方法提供更多通用性。此实现允许在菜单“宏”和内部Wordpress URL之间添加只有后端知道的任意映射。

我还决定使用! 作为这些宏的前缀,以避免它们与命名锚冲突-这包括从链接URL中去除“http://”的开销(因为Wordpress将尝试正常化这些奇怪的链接)。如果该实现让您感到困扰,您可以随时删除preg_replace() 呼叫和使用# 像以前一样作为链接前缀。

class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();

    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }

    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace(\'@^https?://@\', \'\', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }

    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls[\'!\' . $urlKey] = $realUrl;
    }

    public static function mapPostType($type)
    {
        self::createMapping(\'post_type_\' . $type, get_post_type_archive_link($type));
    }
}

add_action(\'init\', array(\'Extendable_Menu_Walker\', \'setupUrls\'));

SO网友:jb510

您可以创建一个页面,然后对其应用自定义存档模板。我创建并使用存档{post type}。php fo模板名称就像默认归档文件一样,我只是手动将其应用于页面。

如果您这样做,我建议将您的CPT设置为has\\u archive=\'false\'以避免永久链接冲突,不管怎样,只要确保您的页面具有与CPT archive slug设置为不同的永久链接slug即可。

SO网友:TJK

我遇到了同样的问题,并找到了解决方案:

// $menu is the menu as a string 
if ( check if youa re on the page you are looking for )
    $menu = str_replace( \'<li class="menu-item"><a href="http://bla.com/bloop/">\', \'<li class="current-menu-item menu-item"><a href="http://bla.com/bloop/">\'>, $menu );  
资料来源:http://www.wptavern.com/forum/plugins-hacks/2169-current-page-custom-post-type-archive.html

SO网友:sergio

我想我必须创建一个新的“父”帖子类型,这样我要显示的自定义帖子类型就变成了“子”帖子类型,并且该父类型将列在菜单中。

这应该是一种选择。创建一个虚拟父级只是为了将其列在菜单中,工作量太大了。

我想从模板或函数中找到一种方法,这样我就不必在多站点安装中的每个站点的每个菜单设置中进行操作。

SO网友:Ole Henrik Skogstrøm

我在搜索类似问题时找到了这个答案。我只是把代码复制到我的finctions中。php文件,它的工作方式是开箱即用:)希望它有帮助!

Dynamic navigation for custom post type (pages)

SO网友:chifliiiii

我所做的不是添加链接,而是创建一个空页面。在该页面中,我在编辑器中添加了类似“由cpt名称生成的内容”的内容,以便我的客户知道所有内容的来源。

然后,我将该页面添加到菜单中,并使用以下代码确保在归档cpt或单个cpt运行时突出显示该页面。

/**
 * Fix to add Custom post types to nav menu
 * If you custom post is called "concepts"
 * create a new empty page called concepts and add this
 */
 function additional_active_item_classes($classes = array(), $menu_item = false){
    global $wp_query;


    if(in_array(\'current-menu-item\', $menu_item->classes)){
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_post_type_archive(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }

    if ( $menu_item->title == \'PAGE TITLE\' && is_singular(\'cpt-slug\') ) {
        $classes[] = \'current-menu-item\';
    }


    return $classes;
}
add_filter( \'nav_menu_css_class\', \'additional_active_item_classes\', 10, 2 );
这将检查菜单/页面标题,以及我们是否实际看到了自定义帖子类型的存档或单个页面。如果是真的,它将添加当前菜单项类。

相关推荐

用标准的干净文件替换NAV-menus.php文件?

我是一个自学成才的wordpress网站设计师,请原谅我的无知。我为一个客户开发的几个网站最近被一个印尼黑客组织破坏了(很有趣!)。客户端没有更新wordpress安装和其他一些危及安全的事情。遗憾的是,没有网站的清理备份。网络主机给了我一个包含恶意软件扫描结果的文本文件。看起来很多受影响的文件都是导航菜单。网站的php文件。文本文件中显示的扫描结果示例如下:“[主目录]/[网站文件夹名称]/wp includes/nav-menu.php:SL-php-INJECTOR-1-ejw.UNOFFICIAL