这是向WordPress菜单动态添加项目的最佳实践吗?

时间:2019-04-19 作者:Daniel Wright

是否有更简单的方法将此功能添加到菜单页面,而不是使用以下代码?换句话说,一个不同的过滤器/钩子/操作将实现它,所以我不必编写自定义JS来获取当前订单?

The Nav's menus page.

需要明确的是,该代码目前只在导航菜单中添加了一个新链接。php页面称为books,但我希望能够对当前菜单中的项目进行排序,而不必将某些内容拼凑在一起,因为可能需要使用一些更常见的做法,以便在编辑菜单项时保存它们的顺序。

    add_filter( \'wp_get_nav_menu_items\', \'custom_nav_menu_items\', 20, 2 );
/**
 * Simple helper function for make menu item objects
 * 
 * @param $title      - menu item title
 * @param $url        - menu item url
 * @param $order      - where the item should appear in the menu
 * @param int $parent - the item\'s parent item
 * @return \\stdClass
 */ 
function _custom_nav_menu_item( $title, $url, $order, $parent = 0 ){
  $item = new stdClass();
  $item->ID = 1000000 + $order + parent;
  $item->db_id = $item->ID;
  $item->title = $title;
  $item->url = $url;
  $item->menu_order = $order;
  $item->menu_item_parent = $parent;
  $item->type = \'\';
  $item->object = \'\';
  $item->object_id = \'\';
  $item->classes = array();
  $item->target = \'\';
  $item->attr_title = \'\';
  $item->description = \'\';
  $item->xfn = \'\';
  $item->status = \'\';
  return $item;
}

function custom_nav_menu_items( $items, $menu ){
  // only add item to a specific menu
  $items[] = _custom_nav_menu_item( \'Books\', get_post_type_archive_link(\'books\'), 100 ); 
  return $items;
}
任何有经验的人的指导都会很好,谢谢。

1 个回复
SO网友:Krzysiek Dróżdż

总是很难说哪种解决问题的方法是最好的,因为它是基于意见和信念的。但是

我将使用3种方式(取决于上下文和需要)添加此类菜单项:

1。使用wp_get_nav_menu_items 完全按照您在问题中的方式进行筛选。唯一的问题是,您必须小心地填写$item 对象否则可能导致警告和通知。

PS.Thewp_nav_menu_objects 过滤器非常相似,也经常用于此目的。

2。使用wp_nav_menu_items filter可附加某些项目

此筛选器获取包含菜单项HTML代码的字符串。所以很容易在给定的菜单中附加一些HTML代码。以这种方式添加的项目在wp admin中不可见/不可编辑。

因此,使用它是一个非常好的主意,如果您想向特定菜单添加一些特殊链接,那么应该始终在开头或结尾-比如说登录/注销链接。。。

3。使用上述过滤器之一重写某些菜单项是另一种非常常见的做法。假设您希望放置一个登录/注销链接,并允许用户编辑其标签和位置。但您当然不希望强制用户编辑其URL。

通过这种方式,您可以添加一些占位符作为URL,然后使用过滤器重写它。例如,您可以添加“登录|注销”作为标签,添加“#登录”作为URL,然后使用过滤器根据当前用户(如果其已登录或匿名)更改标签和URL。

所有这些解决方案都有其好的一面和坏的一面。其中一些在某些情况下更好。

相关推荐

Add extra markup to WP menus

我被要求将一个HTML网站重新开发为一个WP主题,它有一个非常高级的菜单结构,我不太确定如何复制它。第二个菜单项有一个子菜单,但它不仅仅是“li”中的“ul”,还有额外的div等。。因为下拉列表有3列布局,其中2列包含子链接,第3列包含内容。这是一个示例:<ul class=\"nav navbar-nav three\"> <li class=\"dropdown yamm-fw\"> <a href=\"#\" class=\"dropdown-toggl