Ich mache ein verschachteltes Menü Array aus der Antwort, die ich von WP-Datenbank erhalten. Ich bekomme die Daten von WP in der Steuerung in Laravel mit Hilfe von corcel package, und mache dann ein Array mit Menü-Daten, die jetzt eine Ebene tief ist. Also, wenn ein Menü-Link einen Untermenü Link hat, sieht das Array wie folgt:PHP - Erstellen einer verschachtelten Struktur Menüstruktur aus einem flachen Array
{
"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"
}
}
Dies ist, wie ich diese Antwort erschaffe:
$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;
Das Problem, das ich habe ist, dass die Antwort von WP Findet nur parent_id
für jede $item
und keine Daten zu, wenn ein Artikel ein paar Kinder hat, so ist dies die Metadaten des übergeordneten Artikels zum Beispiel:
#attributes: array:4 [
"meta_id" => 209
"post_id" => 112
"meta_key" => "_menu_item_menu_item_parent"
"meta_value" => "0"
]
und das ist th e Meta-Daten des Kindes Artikel:
#attributes: array:4 [
"meta_id" => 326
"post_id" => 135
"meta_key" => "_menu_item_menu_item_parent"
"meta_value" => "112"
]
Wie kann ich diese flexibler zu machen und ermöglichen tiefer nisten, so dass ich Untermenüs innerhalb Untermenüs haben kann?
Ich habe versucht, nach der Lösung here zu suchen, denn das ist so ziemlich das gleiche Problem wie meins, aber war nicht in der Lage, es zu implementieren. In meinem Array Menü Elemente haben auch nur parent_id
, und die parent_id
das ist 0
wird als ein Wurzelelement betrachtet. Auch die parent_id
wenn die menu item
ist eine post
, verweist auf die meta id
, und nicht die ID der post
, die ich brauche, also muss ich das zusätzlich von meta->_menu_item_object_id
bekommen.
UPDATE
Ich habe es geschaffen, einen Baum wie Struktur zu machen, aber das Problem, das ich jetzt habe, dass ich weiß nicht, wie die title
für die Menüelemente zu erhalten, die posts
sind. Ich habe das im vorherigen Beispiel durch Prüfen, ob die title
leer ist, dann würde ich für diese post
von id
suchen:
if ($item->title == '') {
$item = $this->findPost($item);
}
Aber mit dem neuen Code, wo ich einen Baum wie Struktur mache ich bin nicht sicher, wie das geht, da ich dann nicht in der Lage bin, die Baumstruktur zu erstellen, da ich alles mit der id
vergleiche und die ids
des Menüelements sich von der id
der post
unterscheidet, die darauf hinweist, also dann bin ich nicht in der Lage, die Baumstruktur zu machen:
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;
}
Also, dann die Daten, die ich bekommen ist:
{
"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"
}
}
Wenn Sie mehr über die Referenzen in PHP lesen möchten, finden Sie im Handbuch eine Anleitung dazu http://php.net/manual/en/language.references.php – hakre
Vielen Dank für Ihre ausführliche Antwort! – Leff
Vielen Dank für diese nette Prämie! Wenn es nützlich ist, denken Sie bitte an eine Verbesserung der Antwort. – hakre