SELECT t.term_id
FROM wp_term_taxonomy as tax
LEFT JOIN wp_terms as t ON tax.term_id = t.term_id
WHERE taxonomy = 'nav_menu' and name like '%top%'
(查找名称为“Top”的菜单项,并获取术语id)
SELECT p.ID, p.post_title, p.post_name, p.menu_order, n.post_name as n_name, n.post_title as n_title, m.meta_value, pp.meta_value as menu_parent
FROM wp_term_relationships as txr
INNER JOIN wp_posts as p ON txr.object_id = p.ID
LEFT JOIN wp_postmeta as m ON p.ID = m.post_id
LEFT JOIN wp_postmeta as pl ON p.ID = pl.post_id AND pl.meta_key = '_menu_item_object_id'
LEFT JOIN wp_postmeta as pp ON p.ID = pp.post_id AND pp.meta_key = '_menu_item_menu_item_parent'
LEFT JOIN wp_posts as n ON pl.meta_value = n.ID
WHERE txr.term_taxonomy_id = 3 AND p.post_status='publish'
AND p.post_type = 'nav_menu_item' AND m.meta_key = '_menu_item_url'
ORDER BY p.menu_order
SELECT
p.ID,
m.meta_value,
md.post_author,
wp_users.user_nicename,
p.post_parent,
p.menu_order,
md.post_title
FROM
wp_posts AS p
INNER JOIN wp_postmeta AS m ON m.post_id = p.ID
INNER JOIN wp_posts AS md ON md.ID = m.meta_value AND m.meta_value = md.ID
INNER JOIN wp_users ON md.post_author = wp_users.ID
WHERE
p.menu_order > 0 AND
p.post_type = 'nav_menu_item' AND
m.meta_key = '_menu_item_object_id'
ORDER BY
p.menu_order ASC
SELECT p.ID, p.post_title, p.post_name, p.menu_order,
n.post_name as n_name, n.post_title as n_title,
m.meta_value, pp.meta_value as menu_parent
FROM wp_term_taxonomy as tax
INNER JOIN wp_terms as t ON tax.term_id = t.term_id
INNER JOIN wp_term_relationships as txr ON t.term_id = txr.term_taxonomy_id
INNER JOIN wp_posts as p ON txr.object_id = p.ID AND p.post_status = 'publish' AND p.post_type = 'nav_menu_item'
LEFT JOIN wp_postmeta as m ON p.ID = m.post_id AND m.meta_key = '_menu_item_url'
LEFT JOIN wp_postmeta as pl ON p.ID = pl.post_id AND pl.meta_key = '_menu_item_object_id'
LEFT JOIN wp_postmeta as pp ON p.ID = pp.post_id AND pp.meta_key = '_menu_item_menu_item_parent'
LEFT JOIN wp_posts as n ON pl.meta_value = n.ID
WHERE tax.taxonomy = 'nav_menu'
AND t.name like '%main nav%'
ORDER BY p.menu_order
SELECT t.name as 'menu name',
p1.ID as 'post id', p1.post_title as title, p1.post_name as slug, p1.menu_order as 'order',
m1.meta_value as classes, m2.meta_value as menu_item_parent, m3.meta_value as object, m4.meta_value as object_id,
m5.meta_value as target, m6.meta_value as type, m7.meta_value as url,
p2.post_title as 'title-2', p2.post_name as 'slug-2'
FROM wp_term_taxonomy as tax
INNER JOIN wp_terms as t ON t.term_id = tax.term_id AND t.name = 'main nav'
INNER JOIN wp_term_relationships as txr ON txr.term_taxonomy_id = t.term_id
INNER JOIN wp_posts as p1 ON p1.ID = txr.object_id AND p1.post_status = 'publish' AND p1.post_type = 'nav_menu_item'
LEFT JOIN wp_postmeta as m1 ON m1.post_id = txr.object_id AND m1.meta_key = '_menu_item_classes'
LEFT JOIN wp_postmeta as m2 ON m2.post_id = txr.object_id AND m2.meta_key = '_menu_item_menu_item_parent'
LEFT JOIN wp_postmeta as m3 ON m3.post_id = txr.object_id AND m3.meta_key = '_menu_item_object'
LEFT JOIN wp_postmeta as m4 ON m4.post_id = txr.object_id AND m4.meta_key = '_menu_item_object_id'
LEFT JOIN wp_postmeta as m5 ON m5.post_id = txr.object_id AND m5.meta_key = '_menu_item_target'
LEFT JOIN wp_postmeta as m6 ON m6.post_id = txr.object_id AND m6.meta_key = '_menu_item_type'
LEFT JOIN wp_postmeta as m7 ON m7.post_id = txr.object_id AND m7.meta_key = '_menu_item_url'
LEFT JOIN wp_posts as p2 ON p2.ID = m4.meta_value AND p2.post_status = 'publish' AND m6.meta_value = 'post_type'
WHERE tax.taxonomy = 'nav_menu'
ORDER BY p1.menu_order
select case when a.meta_value = 0 then least(@lvl:=1, @p1:=a.id)
when a.meta_value = @p1 then least(@lvl:=2, @p2:=a.id)
when a.meta_value = @p2 then least(@lvl:=3, @p3:=a.id)
when a.meta_value = @p3 then least(@lvl:=4, @p4:=a.id)
when a.meta_value = @p4 then least(@lvl:=5, @p5:=a.id)
when a.meta_value = @p5 then least(@lvl:=6, @p6:=a.id)
end lvl
,a.id
from (
SELECT p.id
,p.post_title
,p.post_name
,pp.meta_value
,p.menu_order
,n.post_name as n_name
,n.post_title as n_title
,m.meta_value meta2
FROM wordpress_dw.stat_term_relationships as txr
INNER JOIN wordpress_dw.stat_posts as p ON txr.object_id = p.ID
LEFT JOIN wordpress_dw.stat_postmeta as m ON p.ID = m.post_id and m.meta_key = '_menu_item_url'
LEFT JOIN wordpress_dw.stat_postmeta as pl ON p.ID = pl.post_id AND pl.meta_key = '_menu_item_object_id'
LEFT JOIN wordpress_dw.stat_postmeta as pp ON p.ID = pp.post_id AND pp.meta_key = '_menu_item_menu_item_parent'
LEFT JOIN wordpress_dw.stat_posts as n ON pl.meta_value = n.ID
,(select @lvl:=0, @p1:=0, @p2:=0, @p3:=0, @p4:=0, @p5:=0, @p6:=0) x
WHERE txr.term_taxonomy_id = 2 -- your menu term id
AND p.post_status='publish'
AND p.post_type = 'nav_menu_item'
ORDER BY p.menu_order
) a
9条答案
按热度按时间yfwxisqw1#
我有一个Magento安装和WordPress安装坐在彼此旁边的网站,和交叉链接。
我最近花了几个小时编写了一个类,以进入Magento安装,这样我就可以将WordPress菜单呈现为Magento站点中的导航菜单。
这里的帖子很有帮助,但没有一个完全解释了WordPress菜单的存储结构。像许多WP东西一样,它存储在一系列关系中。结构如下:
(note该示例假定表前缀为“wp_”)
1.首先,重要的是要认识到菜单项可以是一个 * post *(技术上它是一个页面,但页面存储在post表中),一个 * category *,或者它可以是一个 * custom * 链接。
1.由于WP支持多菜单,因此您首先在wp_term_taxonomy表中查找分类为'nav_menu'的任何术语。注意该表中的term_id。
1.要查找菜单的名称和slug,请访问wp_terms表,并查找上面步骤2中标记的id的术语。
1.转到wp_term_relationships表,列出term_taxonomy_id与步骤1中的term_id匹配的所有记录。object_id字段告诉您wp_post. id记录,您可以在其中找到菜单记录。
执行上述操作的SQL语句示例:
(查找名称为“Top”的菜单项,并获取术语id)
(根据term_id为3加载菜单的数据)
请注意,这个sql语句将适用于页面和自定义菜单(我没有任何类别,所以没有包括)。加载的数据将允许您使用wp_options表中的siteurl构建永久链接,并将post_name附加到末尾(技术上,它没有获得父结构,但WP在没有它的情况下正确找到页面/帖子)
一位评论者询问如何将子菜单项与父菜单项组合在一起。这需要用PHP来完成。下面这样的东西会为你做到这一点:
fquxozlt2#
对于那些还在思考这个问题的人,我将用简单的phpMyAdmin术语来解释。
涉及6张table。
1. wp_term_taxonomy
WordPress将每个导航菜单位置作为记录保存在“wp_term_taxonomy”表中,但唯一的唯一标识符是一个数字ID; 1、2、3等
您还可以看到“计数”数字,显示每个菜单位置中的项目数量。
这是你输入的时候创建的
您将不会在数据库中的任何地方找到名称“您的导航菜单”-这只是用于在界面中标记它。
但是,您可以在其他地方找到“your-navmenu”。
2. wp_terms
你的实际菜单被存储在'wp_terms'中。
WordPress与这个术语混淆。在界面中,它有“显示位置”和“菜单”。位置是由
register_nav_menu()
创建的。最好将界面中的“菜单”视为页面列表。我在这里给他们命名为“导航列表”。
菜单也有自己的ID,通常与位置ID相同(因为人们通常同时为一个位置创建一个菜单),这可能会让人感到困惑。
此项目由管理界面中的“菜单”页面创建:
3. wp_options
您将在'wp_options'中看到'your-navmenu'。在这里,WordPress存储了导航菜单的当前设置。它将其存储在一个序列化数组中(使用PHP的
serialize()
函数)。原始数组(使用
unserialize()
获得)如下所示。这会根据菜单的不同而变化(根据其ID;'2','3')你设置到哪个位置(由它的slug;'your-navmenu',' another-navmenu')。
4. wp_posts
菜单项本身存储在另一个表“wp_posts”中。
您可以通过搜索“nav_menu_item”找到这些:
为了简洁,我删掉了大部分专栏,保留了相关的专栏。
在这里,您可以看到'menu_order'列,它将它们的顺序存储在它们所在的菜单中。
菜单条目像实际的帖子一样存储,具有帖子ID和URL(但如果您访问它,它将带来404,并且它们没有'post_content')。
作为子项存储的所有菜单项都将具有“post_parent”ID。这是其父级链接到的实际页面的ID,而不是其菜单项ID。
5. wp_postmeta
菜单项链接到'wp_postmeta'表中的相应页面。
菜单项ID('post_id')相对于帖子ID('meta_value')存储在'_menu_item_object_id'行中,而子项链接到'_menu_item_menu_item_parent'行中的其父项。
在这里很容易混淆。
'post_id'是菜单项的ID,而不是帖子的ID。' meta_value'是'_menu_item_object_id'行中文章的ID,而不是菜单项,但它是'_menu_item_menu_item_parent'行中父菜单项的ID,而不是文章。
6. wp_term_relationships
每个菜单项和每个菜单位置之间的链接存储在“wp_term_relationships”中。
这里,'object_ID'是菜单项的post ID(如'wp_posts'中所示),'term_taxonomy_id'是菜单位置的ID(如'wp_term_taxonomy'中所示)。
希望这能为一些人澄清。我知道一开始我很困惑。
mbskvtky3#
我发现这个只是因为我自己在寻找答案。我看到你的帖子很老了,但答案在wp_postmeta中,运行这个查询:
你会发现很多条目。
7tofc5zh4#
此设置发生在wp_posts表中。在表中查找menu_order大于零的记录。
它还将为您提供配置菜单选项的wp_options表中的选项名称。
还要注意的是,WordPress的导入/导出工具不会从媒体库中导入未在帖子中使用的媒体(图像,视频等)。如果你有你直接链接到的东西,它也不会被移动。
p1tboqfb5#
我一直在寻找高和低的整个结构,我终于破解了代码:
g6ll5ycj6#
要简化/复杂化@random_user_name的两个查询,可以将它们压缩为一个查询,这样只需要输入菜单名。像这样:
xxhby3vn7#
我认为,这条SQL语句比其他语句更彻底、更清晰地完成了这项工作。您所需要做的就是在第一次连接时将菜单名放入
t.name = 'main nav'
。它输出菜单信息的每个花絮 * 除了 * XFN字段。p1iqtdky8#
我在cale_B的查询中添加了额外的列。列
lvl
具有缩进深度。假设:
查询:
结果:
eqfvzcg89#
SELECT post_name FROM wp_posts where post_status ='publish' and menu_order=0 and post_type ='page'