Wordpress在哪里存储自定义菜单?

Wordpress在哪里存储自定义菜单?,wordpress,Wordpress,我不得不将整个wordpress安装复制到另一台服务器上。我只是在那里安装了一个新的Wordpress,并从以前Wordpress为我“导出”的xml文件中导入了所有数据。无论如何,自定义菜单不包括在内。您知道它们在数据库中的位置吗,这样我就可以从那里获取它们了?此设置发生在wp_posts表中。 在表格中查找菜单顺序大于零的记录 select * from wp_posts where menu_order > 0; 它还将在配置菜单选项的wp_选项表中为您提供选项名称 select

我不得不将整个wordpress安装复制到另一台服务器上。我只是在那里安装了一个新的Wordpress,并从以前Wordpress为我“导出”的xml文件中导入了所有数据。无论如何,自定义菜单不包括在内。您知道它们在数据库中的位置吗,这样我就可以从那里获取它们了?

此设置发生在wp_posts表中。 在表格中查找菜单顺序大于零的记录

select * from wp_posts where menu_order > 0;
它还将在配置菜单选项的wp_选项表中为您提供选项名称

select * from wp_options where option_name = "nav_menu_options";

还要注意,wordpress导入/导出工具不会从媒体库导入未在帖子中使用的媒体(图像、视频等)。如果你有直接链接的东西,它也不会被移动。

我发现这一点只是因为我自己在寻找答案。 我看到你的帖子很老了,但答案是在wp_posteta中,运行以下查询:

SELECT *
FROM `wp_postmeta`
WHERE meta_key LIKE '%menu%'
LIMIT 0, 30

你会发现很多条目。

我有一个站点,其中Magento安装和WordPress安装并排放置,并且相互链接

我最近花了几个小时编写了一个类,将其放到Magento安装中,这样我就可以将WordPress菜单呈现为Magento站点中的导航菜单

这里的帖子很有帮助,但没有一篇文章完全解释了WordPress菜单的存储结构。与许多WP事物一样,它存储在一系列关系中。结构如下:

(请注意,此示例假定表前缀为“wp_”)

  • 首先,必须认识到菜单项可以是一个帖子(从技术上讲,它是一个页面,但页面存储在post表中)、一个类别,也可以是一个自定义链接
  • 由于WP支持多个菜单,因此您首先查看WP\u term\u taxonomy表,以查找任何具有“nav\u menu”分类法的术语。请注意该表中的术语_id
  • 要查找菜单的名称和slug,请访问wp_terms表,并查找上面步骤2中标注id的术语
  • 转到wp\u term\u relationships表,列出所有具有与步骤1中的term\u id匹配的term\u taxonomy\u id的记录。object_id字段告诉您wp_post.id记录,您可以在其中找到菜单记录
  • 最后,转到wp_postemta查找描述菜单的许多元素。特别令人感兴趣的是:
    • \u菜单项\u对象-菜单项的类型(页面、自定义或类别)
    • \u菜单项\u对象\u id-菜单项引用的实际帖子(或类别,如果是类别)的id
    • \u menu\u item\u menu\u item\u parent-菜单的继承架构父结构(可以不同于后父关系)
    • \u菜单项\u url-菜单项的slug(如果是自定义链接菜单项)
  • 执行上述操作的示例SQL语句:

    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)

    (加载菜单的数据,基于术语_id 3)

    请注意,此sql语句将适用于页面和自定义菜单(我没有任何类别,因此没有包含这些类别)。加载的数据将允许您使用wp_options表中的siteurl构建永久链接,并将post_名称附加到末尾(从技术上讲,它不会获取父结构,但wp可以在没有父结构的情况下正确查找页面/帖子)

    更新
    一位评论员询问了如何将子菜单项与父菜单项组合在一起。这需要用PHP来完成。下面的内容将为您提供:

    // run the query from above
    $results = $wpdb->get_results('SELECT....');
    
    // declare new variable to store "assembled" menu
    $menu = array();
    
    // loop over the items assigning children to parents
    foreach( $results AS $row ) {
        // assemble key bits for the menu item
        $item = array(
            // handles custom navigation labels
            'title' => ( $row->post_title ) ? $row->post_title : $row->n_title,
            // handles custom links
            'permalink' => ( $row->meta_value ) ? $row->meta_value : get_permalink( $row->ID ),
            // declares empty placeholder for any child items
            'children' => array()
        );
    
        // if the menu item has a parent, assign as child of the parent
        if ( $row->menu_parent ) {
            $menu[ $row->menu_parent ][ 'children' ][] = $item;
        } else {
            $menu[ $row->ID ] = $item;
        }
    }
    
    var_dump( $menu );
    
    // outputs something like below:
    /**
     * array (size=6)
     *  77 => 
     *     array (size=3)
     *       'title' => string 'About Us' (length=8)
     *       'permalink' => string 'http://www.example.com/about' (length=33)
     *       'children' => 
     *        array (size=7)
     *          0 => 
     *            array (size=3)
     *              'title' => string 'Welcome' (length=22)
     *              'permalink' => string 'http://www.example.com/welcome' (length=35)
     *              'children' => 
     *                array (size=0)
     *                  empty
     *          1 => 
     *            array (size=3)
     *              'title' => string 'Mission' (length=20)
     *              'permalink' => string 'http://www.example.com/mission' (length=33)
     *              'children' => 
     *                array (size=0)
     *                  empty
     *  90 => 
     *    array (size=3)
     *      'title' => string 'Contact Us' (length=10)
     *      'permalink' => string 'http://www.example.com/contact' (length=33)
     *      'children' => 
     *        array (size=5)
     *          0 => 
     *            array (size=3)
     *              'title' => string 'Why Us' (length=12)
     *              'permalink' => string 'http://www.example.com/why' (length=35)
     *              'children' => 
     *                array (size=0)
     *                  empty
     *  1258 => 
     *    array (size=3)
     *      'title' => string 'Login' (length=12)
     *      'permalink' => string 'https://customlink.example.com/some/path/login.php' (length=82)
     *      'children' => 
     *        array (size=0)
     *          empty
     */
    

    我一直在上下搜索整个结构,最终破解了代码:

    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
    

    我在cale_b的查询中添加了额外的列。列
    lvl
    具有缩进深度

    假设:

    • 最大深度是6,所以我定义了6个变量
    • 菜单的post_id超过6。你们中的大多数人已经超过了这个数字
    查询:

    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       
    
    结果:

    lvl |id  |
    ----|----|
    1   |508 |
    1   |509 |
    2   |510 |
    3   |511 |
    3   |512 |
    3   |513 |
    3   |514 |
    2   |515 |
    1   |516 |
    2   |517 |
    2   |518 |
    3   |519 |
    3   |520 |
    3   |521 |
    3   |522 |
    

    对于仍在讨论这个问题的人,我将用简单的phpMyAdmin术语来解释

    共涉及6张表格

    1.wp_术语_分类法 WordPress将每个导航菜单位置作为记录保存在“wp_term_taxonomy”表中,但唯一的唯一标识符是数字ID;1、2、3等

    您还可以看到显示每个菜单位置中项目数量的“计数”数字

    这是您键入时创建的内容

    register_nav_menu('your-navmenu', 'Your Navmenu');
    
    在数据库中的任何地方都找不到名称“Your Navmenu”–该名称仅用于在界面中标记它

    但是,您可以在其他地方找到“您的导航菜单”

    2.wp_术语 您的实际菜单存储在“wp_terms”中

    WordPress混淆了这个术语。在界面中,它有“显示位置”和“菜单”。该位置是由
    注册导航菜单()创建的。
    。最好把界面中的“菜单”当作页面列表。

    我给他们起的名字是“导航列表”

    菜单也有自己的ID,这些ID通常与位置ID相同(因为人们经常同时为一个位置创建一个菜单),这可能会让人困惑

    此项由管理界面中的“菜单”页面创建:

    3.wp_选项 您将在“wp_选项”中看到“您的导航菜单”段塞。在这里,WordPress存储导航菜单的当前设置。它将其存储在一个序列化数组中(使用PHP函数)

    原始数组(使用获得)如下所示

    array (
      'custom_css_post_id' => 56,
      'nav_menu_locations' => 
      array (
        'your-navmenu' => 2,
        'another-navmenu' => 3,
      ),
    )
    
    这将根据您设置到哪个位置的菜单(通过其ID;'2','3')(通过其slug;'your navmenu','other navmenu')进行更改

    4.wp_员额 菜单项本身存储在不同的表“wp_posts”中

    你可以通过电话找到这些
    array (
      'custom_css_post_id' => 56,
      'nav_menu_locations' => 
      array (
        'your-navmenu' => 2,
        'another-navmenu' => 3,
      ),
    )
    
    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