Где Wordpress хранит пользовательские меню?

Мне пришлось копировать целую WordPress-установку на другой сервер. Я просто установил новый Wordpress там и импортировал все данные из xml файла предыдущего Wordpress, "экспортированного" для меня. В любом случае, пользовательские меню не были включены. Знаете ли вы, где они находятся в базе данных, чтобы я мог их схватить?

Ответ 1

Этот параметр происходит в таблице wp_posts. Посмотрите в таблице записи, где menu_order больше нуля.

select * from wp_posts where menu_order > 0;

Он также даст вам имя параметра в таблице wp_options, где настроен параметр меню.

select * from wp_options where option_name = "nav_menu_options";

Также имейте в виду, что этот инструмент импорта/экспорта Wordpress не будет импортировать медиа (изображения, видео и т.д.) из медиа-библиотеки, которые не используются в сообщениях. Если у вас есть материал, с которым вы напрямую связаны, его также не будут перемещать.

Ответ 2

У меня есть сайт с установкой Magento и установкой WordPress, сидящей рядом друг с другом, и сшиванием.

Недавно я провел несколько часов, написав класс, чтобы перейти в установку Magento, чтобы я мог отобразить меню WordPress в качестве меню навигации на сайте Magento.

Сообщения здесь были полезны, но ни один из них не полностью объяснил структуру того, как хранятся меню WordPress. Как и многие вещи WP, он хранится в нескольких отношениях. Здесь структура:

(обратите внимание, что в этом примере предполагается префикс таблицы if из "wp _" )

  • Во-первых, важно признать, что пунктом меню может быть сообщение (технически это страница, но страницы хранятся в таблице сообщений), категория или может быть настраиваемой ссылкой.
  • Поскольку WP поддерживает несколько меню, вы сначала смотрите в таблице wp_term_taxonomy, чтобы найти какие-либо термины с таксономией "nav_menu". Обратите внимание на term_id из этой таблицы.
  • Чтобы найти имя и пул меню, перейдите в таблицу wp_terms и найдите термин с идентификатором, отмеченным с шага 2 выше.
  • Перейдите в таблицу wp_term_relationships и перечислите все записи с помощью term_taxonomy_id, которые соответствуют term_id с шага 1. Поле object_id сообщает вам запись wp_post.id, где вы можете найти запись в меню.
  • Наконец, перейдите в wp_postmeta​​strong > , чтобы найти много элементов, описывающих меню. Особый интерес представляют:
  • _menu_item_object - ТИП пункта меню (страница, обычай или категория)
_menu_item_object_id - идентификатор фактического POST (или категории, если он является категорией), который указывает пункт меню _menu_item_menu_item_parent - иерархическая родительская структура МЕНЮ (которая может отличаться от отношений родителя post) _menu_item_url - пуля пункта меню (если это элемент меню пользовательской ссылки)

Примеры операторов 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" )

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

(загружает данные для меню на основе term_id из 3)

Обратите внимание, что этот оператор sql будет работать для страниц и пользовательских меню (у меня нет категорий, поэтому не включайте это). Загруженные данные позволят вам построить постоянную ссылку, используя сайтurl из таблицы wp_options, и добавьте post_name в конец (технически, он не получает родительскую структуру, но 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
 */

Ответ 3

Я нашел это только потому, что сам искал ответ. Я вижу, что ваш пост довольно старый, но ответ в wp_postmeta, запустите этот запрос:

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

Вы найдете много записей.

Ответ 4

Я искал высокий и низкий для всей структуры, и я, наконец, взломал код:

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