自定义菜单保存在 Wordpress 3.0 数据库中的啥位置?
Posted
技术标签:
【中文标题】自定义菜单保存在 Wordpress 3.0 数据库中的啥位置?【英文标题】:Where are Custom Menus saved in the Database for Wordpress 3.0?自定义菜单保存在 Wordpress 3.0 数据库中的什么位置? 【发布时间】:2011-04-15 15:03:25 【问题描述】:我一直在 phpmyadmin 中搜索和搜索我的 sql 数据库,但我似乎无法找到自定义菜单在数据库中的存储位置。有谁知道它存放在哪里?我有一个大菜单,基本上需要很长时间才能创建。我现在正在开发中,而不是在生产中重新创建它,我想尝试复制 sql 以查看它是否有效。谢谢!
【问题讨论】:
【参考方案1】:添加新的自定义菜单时,其条目会添加到多个表格中。
-
表:
_term_taxonomy
,列taxonomy
,值nav_menu
。
来自 1) term_id
也在表中:_terms
,菜单标题显示在管理面板中
table:_term_relationship
将包含来自 1) 的 term_texonomy_id
以及与所有 object_id 的连接,该 object_id 将链接到具有 sub_menu
及以下级别菜单的所有 _post
表。
table:_postmeta
将包含与来自_posts
表的每个object_id
的菜单和子菜单相关的所有详细信息。
【讨论】:
我不明白这怎么不被赞成。我正在寻找一种导出和导入菜单的方法。我知道我的答案。别。我会手动完成。 应该澄清第 3 步,说 term_relationships 中的 object_id 等于 wp_post 中的 id 字段 我已经卸载了 WP Fastest Cache,完成卸载过程后在左侧菜单中留下了一个条目,我在你说的表格上的任何地方都找不到它...【参考方案2】:导航菜单项以post_type = 'nav_menu_item'
存储在 wp_posts 表中。
【讨论】:
但是什么自定义帖子类型? 这是多么错误,wordpress 膨胀了 _posts 和 _options 表,将各种东西扔在那里,应该放在一个单独的表中,以便更好的数据库管理和加载速度 是的,数据库的标准化非常差,这个答案只是部分正确。它标识组成菜单的对象,但不提供与菜单关联的值(例如菜单文本)。我仍在挖掘以尝试找到该数据。【参考方案3】:实际的菜单标题、ID 和名称存储在 wp_terms 表中。
【讨论】:
$menu_list = get_terms('nav_menu');
将返回所有菜单。
此查询仅返回菜单 ID。什么查询返回具有足够信息的每个菜单项来重新生成菜单?
一旦你有了菜单ID,你就可以运行$wp_menu_items = wp_get_nav_menu_items( $id );
【参考方案4】:
我讨厌碰到一个旧线程。但是,如果有人像我在寻找答案时遇到这种情况,从WP 3.2
开始,菜单的post_type
现在在wp_posts
表中称为nav_menu_item
。他们在 wp 页面上没有那个,他们只有nav_menu
。我找不到。
【讨论】:
谢谢老兄!很高兴知道这一点。【参考方案5】:自定义菜单链接位于"meta_value"
下的wp_postmeta
表中
meta_key = _menu_item_url
【讨论】:
查看 WordPress Answers,Stack Exchange 的 WordPress 问答网站。如果您能分享您的一些专业知识,那就太好了。顺便说一句,凤凰城 WordCamp 很棒! @Chris_O 嘿伙计!谢谢..我见过它我只是很少上堆栈.....网站。我应该尝试更频繁地在那里闲逛:/ #toobusy @Chris_O fyi,我确实有一个帐户:wordpress.stackexchange.com/users/2173/ryno【参考方案6】:我想为像我一样偶然发现这篇文章的人提供更完整和最新的答案。如果您想手动插入或更新菜单项,数据库中有几个地方需要检查/更新。
第一步是找到您的主菜单容器。这存储在wp_terms
中。只需通过 name
搜索菜单名称即可。记下身份证。在我的示例中,这将是33
。同样,您可以在此处插入新行以创建新菜单。蛞蝓里面不能有空格。只需替换为-
。
现在我们将开始在该菜单中查找项目。这些存储在wp_posts
中,post_type
为nav_menu_item
。此表中没有任何内容与您上面的 ID 相关联,因此您必须使用 post_title
。如果目标是插入一个新的菜单项,使用 phpMyAdmin 您只需在任何菜单中的现有项上单击Copy
并更改post_title
和post_name
。现在记下您插入的项目的 ID。我的是 9179。最好记下您复制的项目的 ID(如果它来自同一个菜单,那就更好了),因为我们将在下一步中使用它。
现在转到wp_postmeta
并在post_id
字段中搜索我们刚刚复制的项目。这将显示所有需要填写的字段,以获取我们新菜单项的信息。使用 phpMyAdmin 复制每个条目并根据需要进行更改。 _menu_item_menu_item_parent
、_menu_item_target
和 _menu_item_classes
是最有可能需要更改的字段。并确保将新项目的 ID (9179) 放入 _menu_item_object_id
。
创建完这些之后,我们现在可以将该菜单项绑定到我们的菜单。我们需要从wp_term_taxonomy
获取term_taxonomy_id
。只需使用第一步中的 ID 搜索 term_id
,我是 33。 term_taxonomy_id
对我来说也恰好是 33 岁。不,我们需要在wp_term_relationships
中插入一个新行。 object_id
将是您的帖子 ID (9179),term_taxonomy_id
是我们刚刚查找的 (33)。
现在您的新项目应该在您的菜单中。
【讨论】:
可怕的模式。不过还是谢谢。【参考方案7】:这是我使用的 SQL 脚本:
从 wp_term 表中获取菜单:
SELECT * FROM wp_terms AS t LEFT JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id WHERE tt.taxonomy = 'nav_menu'
使用 term_id 从所有其他连接的表中获取所有菜单标题/链接。在我看来,这是一个糟糕的关系数据库。只需将上面查询中的 tt.term_id 替换为您的,下面是 11。
SELECT p.post_title, p.post_name, p.menu_order, pm.meta_value FROM wp_posts AS p LEFT JOIN wp_term_relationships AS tr ON tr.object_id = p.ID LEFT JOIN wp_term_taxonomy AS tt ON tt.term_taxonomy_id = tr.term_taxonomy_id INNER JOIN wp_postmeta AS pm ON p.Id = pm.post_id WHERE p.post_type = 'nav_menu_item' AND tt.term_id = 11 AND pm.meta_key = '_menu_item_url'
【讨论】:
【参考方案8】:每个菜单项都保存在posts表中,属于这些项的菜单层次结构/选项/url等存储在postmeta表中。在 postmeta 表中,您可以看到 post_id 列属于帖子表项。
【讨论】:
【参考方案9】:$postId = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM `wp_postmeta` WHERE meta_key='_menu_item_object_id' AND `meta_value`='$id'"));
$postIdc = $wpdb->get_var($wpdb->prepare("SELECT post_id FROM `wp_postmeta` WHERE meta_key='_menu_item_object_id' AND `meta_value`='$a[1]'"));
$sql2 = "SELECT * FROM `wp_postmeta` WHERE meta_key='_menu_item_menu_item_parent' AND `meta_value`='$postId'";
$sql2c = "SELECT * FROM `wp_postmeta` WHERE meta_key='_menu_item_menu_item_parent' AND `meta_value`='$postIdc'";
【讨论】:
尝试在您的答案中加入更多信息。 “只是代码”并不能帮助我们理解为什么或如何解决这个问题。 @GeorgeStocker 这到底是个怎样的答案?以上是关于自定义菜单保存在 Wordpress 3.0 数据库中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章
php 一个自定义的WordPress导航助手类,使用我内置的WordPress在自定义主题中完全实现Bootstrap 3.0+导航样式