wordpress菜单到底存放在哪里?

玩wordpress的知道,通过后台管理界面,可以给主题配置菜单,但是这些菜单到底存放在哪里?以什么格式存放的?很多人却是不知。

mmexport1473384999432

举例说明。当使用主题A时,创建了一组菜单,并且与“位置”进行了关联,浏览网站,菜单出现,一切正常。可是,当切换到主题B时,发现网站上虽然出现了菜单,但是此菜单非彼菜单,并不是我们在主题A中创建的那组菜单,全是指向页面的菜单。

回到管理后台一看,在A中创建的菜单还在,先舒一口气,仔细检查,发现只是它跟“菜单位置”的关系不存在了,于是重新关联上,保存后再浏览网站,OK,前面创建的菜单终于又出现了。

这是怎么回事呢?

分析一下上面的现象。因为在主题A中创建的菜单和菜单项,当换成B主题后,它们并没有丢失,可见它们不是主题级参数,应当是站点级的参数。而换主题后菜单与“位置”的对应关系丢失了,所以这个对应关系应当是主题级参数。

其实wordpress这样做是可以理解的。你不会希望在主题A中辛辛苦苦做好的菜单,因为换了一个主题就全部消失吧?而“位置”是在主题中定义的,主题一换,它里面定义的“位置”当然也不复存在,连“位置”都不存在了,菜单与“位置”的对应关系当然也不会存在了。

先谈wordpress中的菜单和菜单项,其实它们是2个不同的概念。

所谓菜单项,就是指文本和url,这个好理解;而菜单,是指一个集合名(或者理解成容器名),它是用来容纳一些菜单项的。菜单是一个集合,而wp中taxonomy就是用来管集合的,所以菜单自然而然走的是taxonomy那一套;而菜单项就只是一个普通的post而已,只不过它的post_type是nav_menu_item。

当你通过后台创建一个菜单时,wp底层就会为你在wp_terms表中插入一条记录,当你为这个菜单增加一个菜单项时,底层就会为你在wp_posts表中插入一条post记录。当然在正式保存之前,它的状态是draft状态。

可见,菜单及菜单项确实跟主题没有半毛钱关系。它们确实是站点级参数,但是并不是保存在wp_options中,而是在wp_terms、wp_posts等这种表中。

前面讲了,菜单与“位置”的对应关系,属于主题级参数,那保存在哪里?保存在wp_options中,通过get_theme_mod( ‘nav_menu_locations’);可以获取位置与菜单id的对应关系。当你给某个位置指派一个菜单时,底层就会更新一次主题参数,即调用set_theme_mod( ‘nav_menu_locations’, $menu_locations )一次。

《wordpress菜单到底存放在哪里?》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注