Tôi đang tạo một mảng menu lồng nhau từ phản hồi mà tôi nhận được từ cơ sở dữ liệu WP. Tôi nhận được dữ liệu từ WP trong bộ điều khiển trong Laravel với sự giúp đỡ của corcel package, và sau đó tạo một mảng với dữ liệu trình đơn, mà bây giờ là một cấp độ sâu. Vì vậy, khi một liên kết đơn có một liên kết menu con, mảng trông như thế này:PHP - Tạo cấu trúc menu cây lồng nhau từ một mảng phẳng
{
"Hjem": {
"ID": 112,
"title": "Hjem",
"slug": "hjem",
"url": "http://hivnorge.app/?p=112",
"status": "publish",
"main_category": "Hovedmeny",
"submenus": [
{
"ID": 129,
"title": "Lorem ipsum",
"slug": "lorem-ipsum",
"url": "http://hivnorge.app/?p=129",
"status": "publish",
"main_category": "Nyheter"
}
]
},
"Nytt test innlegg": {
"ID": 127,
"title": "Nytt test innlegg",
"slug": "nytt-test-innlegg",
"url": "http://hivnorge.app/?p=127",
"status": "private",
"main_category": "Nyheter",
"submenus": [
{
"ID": 125,
"title": "Test innlegg",
"slug": "test-innlegg",
"url": "http://hivnorge.app/?p=125",
"status": "publish",
"main_category": "Nyheter"
},
{
"ID": 129,
"title": "Lorem ipsum",
"slug": "lorem-ipsum",
"url": "http://hivnorge.app/?p=129",
"status": "publish",
"main_category": "Nyheter"
}
]
},
"Prosjektsamarbeidets verdi": {
"ID": 106,
"title": "Prosjektsamarbeidets verdi",
"slug": "prosjektsamarbeidets-verdi",
"url": "http://hivnorge.no.wordpress.seven.fredrikst/?p=106",
"status": "publish",
"main_category": "Prevensjon"
}
}
Đây là cách tôi đang tạo ra phản ứng này:
$menu = Menu::slug('hovedmeny')->first();
$res = [];
foreach ($menu->nav_items as $item) {
$item->makeHidden($hiddenAttributes)->toArray();
$parent_id = $item->meta->_menu_item_menu_item_parent;
if ($parent_id == '0') {
if ($item->title == '') {
$item = $this->findPost($item);
}
$parentItem = $item;
$res[$parentItem->title] = $parentItem->makeHidden($hiddenAttributes)->toArray();
}
else {
$childItem = $this->findPost($item);
$res[$parentItem->title]['submenus'][] = $childItem->makeHidden($hiddenAttributes)->toArray();
}
}
return $res;
Vấn đề là tôi có câu trả lời từ WP chỉ trả parent_id
cho mỗi $item
và không có dữ liệu về nếu một mục có một số trẻ em, vì vậy đây là các dữ liệu meta của mặt hàng đó mẹ ví dụ:
#attributes: array:4 [
"meta_id" => 209
"post_id" => 112
"meta_key" => "_menu_item_menu_item_parent"
"meta_value" => "0"
]
và đây là lần thứ e dữ liệu meta của mục con:
#attributes: array:4 [
"meta_id" => 326
"post_id" => 135
"meta_key" => "_menu_item_menu_item_parent"
"meta_value" => "112"
]
Làm cách nào để tôi có thể thực hiện điều này linh hoạt và cho phép lồng sâu hơn để tôi có thể có menu con bên trong menu phụ?
Tôi đã cố gắng tìm giải pháp here, bởi vì đó là khá nhiều vấn đề tương tự như của tôi, nhưng không thể triển khai nó. Trong các mục menu mảng của tôi cũng chỉ có parent_id
và parent_id
là 0
được coi là phần tử gốc. Ngoài ra, parent_id
nếu số menu item
là post
, trỏ đến meta id
và không phải là id của post
mà tôi cần, vì vậy tôi cần phải nhận số bổ sung đó từ meta->_menu_item_object_id
.
CẬP NHẬT
tôi đã được quản lý để thực hiện một cây như cấu trúc, nhưng vấn đề tôi có bây giờ là tôi không biết làm thế nào để có được những title
cho các yếu tố menu là posts
. Tôi đã làm điều đó trong ví dụ trước bằng cách kiểm tra nếu title
trống sau đó tôi sẽ tìm kiếm mà post
bởi id
:
if ($item->title == '') {
$item = $this->findPost($item);
}
Nhưng, với mã mới, nơi tôi đang làm cho một cây giống như cấu trúc Tôi không chắc chắn làm thế nào để làm điều đó, kể từ đó tôi không thể làm cho cấu trúc cây, kể từ khi tôi so sánh tất cả mọi thứ với các id
, và ids
của phần tử menu khác với id
của post
được trỏ đến, vì vậy sau đó tôi không thể tạo cấu trúc cây:
private function menuBuilder($menuItems, $parentId = 0)
{
$hiddenAttributes = \Config::get('middleton.wp.menuHiddenAttributes');
$res = [];
foreach ($menuItems as $index => $item) {
$itemParentId = $item->meta->_menu_item_menu_item_parent;
if ($itemParentId == $parentId) {
$children = self::menuBuilder($menuItems, $item->ID);
if ($children) {
$item['submenu'] = $children;
}
$res[$item->ID] = $item->makeHidden($hiddenAttributes)->toArray();
unset($menuItems[$index]);
}
}
return $res;
}
Vì vậy, sau đó dữ liệu tôi nhận được là:
{
"112": {
"ID": 112,
"submenu": {
"135": {
"ID": 135,
"title": "",
"slug": "135",
"url": "http://hivnorge.app/?p=135",
"status": "publish",
"main_category": "Hovedmeny"
}
},
"title": "Hjem",
"slug": "hjem",
"url": "http://hivnorge.app/?p=112",
"status": "publish",
"main_category": "Hovedmeny"
},
"136": {
"ID": 136,
"submenu": {
"137": {
"ID": 137,
"submenu": {
"138": {
"ID": 138,
"title": "",
"slug": "138",
"url": "http://hivnorge.app/?p=138",
"status": "publish",
"main_category": "Hovedmeny"
}
},
"title": "",
"slug": "137",
"url": "http://hivnorge.app/?p=137",
"status": "publish",
"main_category": "Hovedmeny"
}
},
"title": "",
"slug": "136",
"url": "http://hivnorge.app/?p=136",
"status": "publish",
"main_category": "Hovedmeny"
},
"139": {
"ID": 139,
"title": "",
"slug": "139",
"url": "http://hivnorge.app/?p=139",
"status": "publish",
"main_category": "Hovedmeny"
}
}
Nếu bạn muốn đọc thêm về các tài liệu tham khảo trong PHP, hướng dẫn có một phần cho nó http://php.net/manual/en/language.references.php – hakre
Cảm ơn bạn rất nhiều cho câu trả lời chi tiết của bạn! – Leff
Cảm ơn bạn vì tiền thưởng tốt đẹp đó! Nếu nó hữu ích, xin vui lòng xem xét một upvote của câu trả lời. – hakre