Мне пришлось копировать целую WordPress-установку на другой сервер. Я просто установил новый Wordpress там и импортировал все данные из xml файла предыдущего Wordpress, "экспортированного" для меня. В любом случае, пользовательские меню не были включены. Знаете ли вы, где они находятся в базе данных, чтобы я мог их схватить?
Где 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_postmetastrong > , чтобы найти много элементов, описывающих меню. Особый интерес представляют:
- _menu_item_object - ТИП пункта меню (страница, обычай или категория)
Примеры операторов 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