是否有更简单的方法将此功能添加到菜单页面,而不是使用以下代码?换句话说,一个不同的过滤器/钩子/操作将实现它,所以我不必编写自定义JS来获取当前订单?
需要明确的是,该代码目前只在导航菜单中添加了一个新链接。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;
}
任何有经验的人的指导都会很好,谢谢。
SO网友:Krzysiek Dróżdż
总是很难说哪种解决问题的方法是最好的,因为它是基于意见和信念的。但是
我将使用3种方式(取决于上下文和需要)添加此类菜单项:
1。使用wp_get_nav_menu_items
完全按照您在问题中的方式进行筛选。唯一的问题是,您必须小心地填写$item
对象否则可能导致警告和通知。
PS.Thewp_nav_menu_objects
过滤器非常相似,也经常用于此目的。
此筛选器获取包含菜单项HTML代码的字符串。所以很容易在给定的菜单中附加一些HTML代码。以这种方式添加的项目在wp admin中不可见/不可编辑。
因此,使用它是一个非常好的主意,如果您想向特定菜单添加一些特殊链接,那么应该始终在开头或结尾-比如说登录/注销链接。。。
3。使用上述过滤器之一重写某些菜单项是另一种非常常见的做法。假设您希望放置一个登录/注销链接,并允许用户编辑其标签和位置。但您当然不希望强制用户编辑其URL。
通过这种方式,您可以添加一些占位符作为URL,然后使用过滤器重写它。例如,您可以添加“登录|注销”作为标签,添加“#登录”作为URL,然后使用过滤器根据当前用户(如果其已登录或匿名)更改标签和URL。
所有这些解决方案都有其好的一面和坏的一面。其中一些在某些情况下更好。