Để lấy mảng dữ liệu các mục menu trong WordPress, bạn có thể sử dụng hàm wp_get_nav_menu_items()
. Hàm này sẽ trả về một mảng các đối tượng mục menu dựa trên ID hoặc tên của menu.
Dưới đây là các bước chi tiết để lấy mảng dữ liệu các mục menu trong WordPress:
1. Tìm ID hoặc Tên của Menu
Trước khi bạn có thể lấy các mục menu, bạn cần biết ID hoặc tên của menu mà bạn muốn lấy. Bạn có thể tìm thấy thông tin này trong phần quản lý Giao diện > Menu của WordPress Dashboard.
2. Sử dụng Hàm wp_get_nav_menu_items()
Sau khi biết ID hoặc tên của menu, bạn có thể sử dụng hàm wp_get_nav_menu_items()
để lấy các mục menu.
Cú pháp:
wp_get_nav_menu_items( $menu, $args );
$menu
: ID, slug, hoặc đối tượng menu để lấy các mục menu. Đây là tham số bắt buộc.
$args
: Một mảng các tham số bổ sung. Đây là tham số tùy chọn.
3. Ví Dụ Mã PHP
Dưới đây là một ví dụ cơ bản để lấy các mục menu bằng ID và in ra danh sách các mục menu:
// Lấy các mục menu bằng ID của menu (ví dụ: ID là 2)
$menu_id = 2;
$menu_items = wp_get_nav_menu_items($menu_id);
// Kiểm tra nếu menu tồn tại và có các mục
if (!empty($menu_items)) {
echo '<ul>';
foreach ($menu_items as $menu_item) {
echo '<li>';
echo '<a href="' . $menu_item->url . '">' . $menu_item->title . '</a>';
echo '</li>';
}
echo '</ul>';
} else {
echo 'Menu không tồn tại hoặc không có mục nào.';
}
4. Ví Dụ Sử Dụng Tên Menu
Nếu bạn muốn sử dụng tên của menu thay vì ID, bạn có thể làm như sau:
// Lấy các mục menu bằng tên của menu
$menu_name = 'primary-menu'; // Tên của menu, thay bằng tên menu của bạn
$menu_items = wp_get_nav_menu_items($menu_name);
// Kiểm tra nếu menu tồn tại và có các mục
if (!empty($menu_items)) {
echo '<ul>';
foreach ($menu_items as $menu_item) {
echo '<li>';
echo '<a href="' . $menu_item->url . '">' . $menu_item->title . '</a>';
echo '</li>';
}
echo '</ul>';
} else {
echo 'Menu không tồn tại hoặc không có mục nào.';
}
5. Cấu Trúc Của Đối Tượng Mục Menu
Đối tượng mục menu được trả về bởi wp_get_nav_menu_items()
sẽ chứa các thuộc tính như:
- ID: ID của mục menu.
- title: Tiêu đề của mục menu.
- url: Đường dẫn liên kết của mục menu.
- menu_item_parent: ID của mục menu cha (nếu có).
- type: Loại mục menu (ví dụ:
post_type
, taxonomy
, custom
).
- object: Loại đối tượng của mục menu (ví dụ:
page
, category
).
Bạn có thể sử dụng các thuộc tính này để tùy chỉnh hiển thị menu của mình theo nhu cầu.
Mảng 2 chiều và đa chiều của menu
Để lấy mảng 2 chiều hoặc đa chiều của các mục menu trong WordPress, bạn có thể sử dụng hàm wp_get_nav_menu_items()
để lấy tất cả các mục menu, sau đó sắp xếp chúng thành một cấu trúc mảng 2 chiều hoặc đa chiều theo mong muốn.
1. Lấy Mảng 2 Chiều Của Menu
Mảng 2 chiều thường bao gồm các mục menu cấp cao nhất và các mục con trực tiếp của chúng. Để xây dựng mảng 2 chiều, bạn cần sắp xếp các mục menu dựa trên thuộc tính menu_item_parent
.
Dưới đây là ví dụ mã PHP để tạo mảng 2 chiều:
// Lấy các mục menu bằng ID của menu
$menu_id = 2; // Thay bằng ID menu của bạn
$menu_items = wp_get_nav_menu_items($menu_id);
$menu_array = array();
// Sắp xếp các mục menu thành mảng 2 chiều
if (!empty($menu_items)) {
foreach ($menu_items as $menu_item) {
if ($menu_item->menu_item_parent == 0) {
// Mục menu cấp cao nhất
$menu_array[$menu_item->ID] = array(
'title' => $menu_item->title,
'url' => $menu_item->url,
'children' => array()
);
} else {
// Mục menu con
$menu_array[$menu_item->menu_item_parent]['children'][$menu_item->ID] = array(
'title' => $menu_item->title,
'url' => $menu_item->url
);
}
}
}
// In ra mảng 2 chiều
echo '<pre>';
print_r($menu_array);
echo '</pre>';
2. Lấy Mảng Đa Chiều của Menu
Để tạo mảng đa chiều, bạn cần xây dựng cấu trúc mảng đệ quy để bao gồm tất cả các cấp mục menu và các mục con của chúng.
Dưới đây là ví dụ mã PHP để tạo mảng đa chiều:
// Lấy các mục menu bằng ID của menu
$menu_id = 2; // Thay bằng ID menu của bạn
$menu_items = wp_get_nav_menu_items($menu_id);
function build_tree(array $elements, $parentId = 0) {
$branch = array();
foreach ($elements as $element) {
if ($element->menu_item_parent == $parentId) {
$children = build_tree($elements, $element->ID);
if ($children) {
$element->children = $children;
}
$branch[$element->ID] = array(
'title' => $element->title,
'url' => $element->url,
'children' => isset($element->children) ? $element->children : array()
);
}
}
return $branch;
}
// Xây dựng mảng đa chiều
$menu_tree = build_tree($menu_items);
// In ra mảng đa chiều
echo '<pre>';
print_r($menu_tree);
echo '</pre>';
3. Giải Thích Mã
- Lấy các mục menu: Chúng ta sử dụng hàm
wp_get_nav_menu_items()
để lấy tất cả các mục menu từ ID menu cụ thể.
- Hàm
build_tree()
: Đây là hàm đệ quy giúp xây dựng cấu trúc cây cho các mục menu:
- Hàm này nhận một mảng các phần tử (
$elements
) và parentId
, mặc định là 0
(các mục menu cấp cao nhất).
- Với mỗi phần tử, hàm kiểm tra xem
menu_item_parent
có bằng với parentId
hiện tại không.
- Nếu có, phần tử đó được thêm vào nhánh (
branch
) và hàm được gọi lại đệ quy để tìm các mục con của nó.
- Mảng kết quả cuối cùng là một cây đa chiều của các mục menu.
Với hai đoạn mã trên, bạn có thể dễ dàng lấy mảng 2 chiều hoặc đa chiều của các mục menu trong WordPress, tùy thuộc vào cấu trúc dữ liệu mà bạn mong muốn.
Bạn có thể viết hàm get_menu_array
kết hợp với việc sử dụng closure để xây dựng cây menu trong cùng một hàm. Điều này giúp mã gọn hơn và tránh việc tách biệt thành nhiều hàm. Dưới đây là cách thực hiện:
function get_menu_array($theme_location) {
// Kiểm tra xem theme_location có tồn tại không
if (($locations = get_nav_menu_locations()) && isset($locations[$theme_location])) {
// Lấy đối tượng menu
$menu = wp_get_nav_menu_object($locations[$theme_location]);
// Lấy tất cả các mục menu
$menu_items = wp_get_nav_menu_items($menu->term_id);
// Closure để xây dựng cây menu (đệ quy)
$build_menu_tree = function ($items, $parent_id) use (&$build_menu_tree) {
$tree = array();
foreach ($items as $item) {
if ($item->menu_item_parent == $parent_id) {
$tree[$item->ID] = array(
'ID' => $item->ID,
'title' => $item->title,
'url' => $item->url,
'children' => $build_menu_tree($items, $item->ID) // Gọi lại chính closure để xử lý đệ quy
);
}
}
return $tree;
};
// Bắt đầu xây dựng cây menu từ root (cha có ID = 0)
return $build_menu_tree($menu_items, 0);
}
return array(); // Trả về mảng rỗng nếu không tìm thấy menu
}
// Gọi hàm với theme_location mong muốn
$menu = get_menu_array('primary'); // Thay 'primary' bằng theme_location của bạn
print_r($menu);
Giải thích:
- Closure
build_menu_tree
: Hàm đệ quy này được định nghĩa bên trong get_menu_array
và nhận đối số là danh sách các mục menu và parent_id
.
- Nó sẽ duyệt qua tất cả các mục trong menu và tìm những mục có
menu_item_parent
trùng với parent_id
hiện tại.
- Khi tìm thấy mục con, nó sẽ gọi lại chính mình để tiếp tục tìm các cấp con của mục đó (đệ quy).
- Sử dụng closure: Closure này sử dụng
use (&$build_menu_tree)
để đảm bảo có thể gọi chính nó đệ quy bên trong.
- Đơn giản hóa mã: Việc đưa toàn bộ logic vào cùng một hàm giúp mã gọn gàng hơn, không phải tách ra nhiều hàm nhỏ mà vẫn duy trì tính linh hoạt.
Kết quả sẽ là một mảng đa cấp chứa tất cả các mục menu và các mục con theo đúng cấu trúc phân cấp.