有没有一种方法(除了添加自定义链接外)可以将自定义帖子类型档案添加到WordPress的菜单中?如果使用自定义链接(例如/ cpt-archive-slug /)添加了WordPress,则WordPress不会将类应用于current-menu-item
list元素,这会给菜单样式设置带来挑战。
如果自定义链接包含整个URL(例如,http : //site.com/cpt-archive-slug/),则会添加这些类。但是,这可能不是“最佳实践”。
有没有一种方法(除了添加自定义链接外)可以将自定义帖子类型档案添加到WordPress的菜单中?如果使用自定义链接(例如/ cpt-archive-slug /)添加了WordPress,则WordPress不会将类应用于current-menu-item
list元素,这会给菜单样式设置带来挑战。
如果自定义链接包含整个URL(例如,http : //site.com/cpt-archive-slug/),则会添加这些类。但是,这可能不是“最佳实践”。
Answers:
最好的选择是使用具有完整url的自定义链接,因为自定义帖子类型档案是不同形式的基于分类的档案(类别,标签,任何自定义分类)和基于日期的档案,它们都有自己的档案标签。
我知道这很旧,但是我也有这个问题,我发现一种比较干净的处理方法是使用自定义菜单浏览器
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(),
));
注意:这假定您的帖子类型的子句和名称相同。
我在tungd的答案上做了一些扩展,以使用该方法提供更多通用性。此实现允许在菜单“宏”和仅后端知道的内部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'));
我遇到了同样的问题,并找到了以下解决方案:
// $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
我在寻找类似问题时找到了这个答案。我只是将代码复制到我的finctions.php文件中,它开箱即用:)希望对您有所帮助!
我没有添加链接,而是创建了一个空白页。在该页面中,我在编辑器中添加了诸如“从cpt-name生成的内容”之类的内容,以便我的客户知道所有内容的来源。
然后,将该页面添加到菜单,并使用以下代码确保在运行archives-cpt或single-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 );
这将检查菜单/页面标题,以及我们是否实际上正在查看自定义帖子类型的档案或单个页面。如果为true,则将添加current-menu-item类。