Khi thêm menu vào theme WordPress bằng hàm register_nav_menu và hiển thị với wp_nav_menu, menu sẽ có cấu trúc mặc định với các menu con nằm trong thẻ <ul> có class sub-menu và mỗi thẻ <li> sẽ có class riêng.


    $VNEngineer_Nav_Walker = new VNEngineer_Nav_Walker();
    wp_nav_menu( array(
        'theme_location' => 'header_menu', // tên location cần hiển thị
        'container' => 'nav', // thẻ container của menu
        'container_class' => 'header_menu', //class của container
        'menu_class' => 'nav-menu nav navbar-nav', // class của menu bên trong
        'walker' => $VNEngineer_Nav_Walker,
    ) );

Nếu dự án của bạn yêu cầu cấu trúc menu khác (như menu của Bootstrap hoặc Foundation), bạn sẽ cần chỉnh sửa lại cấu trúc menu mặc định của WordPress.

Bài viết này mình sẽ giải thích về lớp Walker_Nav_Menu trong WordPress, dùng để thiết lập cấu trúc hiển thị menu. Bằng cách tạo một lớp mới kế thừa lớp này, chúng ta có thể tùy chỉnh lại cấu trúc của các menu theo ý muốn.

Walker là một lớp trong WordPress dùng để định hình cấu trúc của các chức năng như menu, widget Category, và widget Pages. Bài này chúng ta sẽ tập trung vào việc sử dụng Walker để chỉnh sửa cấu trúc menu. Để áp dụng cấu trúc tùy chỉnh của Walker_Nav_Menu cho một menu cụ thể, bạn cần kích hoạt nó bằng cách thêm tham số walker vào hàm wp_nav_menu.

class VNEngineer_Nav_Walker extends Walker_Nav_Menu {
    public function start_lvl( &$output, $depth = 0, $args = NULL) {

    }
    public function end_lvl( &$output, $depth = 0, $args = NULL ) {

    }
    public function start_el( &$output, $data_object, $depth = 0, $args = NULL, $current_object_id = 0 ) {

    }
    public function end_el( &$output, $data_object, $depth = 0, $args = NULL, $current_object_id = 0 ) {

    }
}

Phương thức start_lvl()

  • Được sử dụng để hiển thị các thẻ bắt đầu cho cấu trúc của một cấp độ mới trong menu (ví dụ: <ul class="sub-menu">).
  • $output: Chuỗi này được sử dụng để thêm nội dung vào phần hiển thị ra bên ngoài.
  • $depth: Xác định cấp độ hiện tại của menu, với cấp độ 0 là cấp cao nhất.
  • $args: Chứa các tham số được truyền vào từ hàm wp_nav_menu().

Phương thức end_lvl()

  • Được sử dụng để hiển thị các thẻ kết thúc cho cấu trúc của một cấp độ mới trong menu (ví dụ: </ul>).
  • $output: Chuỗi này được sử dụng để thêm nội dung vào phần hiển thị ra bên ngoài.
  • $depth: Xác định cấp độ hiện tại của menu, với cấp độ 0 là cấp cao nhất.
  • $args: Chứa các tham số được truyền vào từ hàm wp_nav_menu().

Phương thức start_el()

  • Được sử dụng để hiển thị đoạn bắt đầu của một phần tử trong menu (ví dụ: <li id="menu-item-5">).
  • $output: Chuỗi này được sử dụng để thêm nội dung vào phần hiển thị ra bên ngoài.
  • $data_object: Chứa dữ liệu của các phần tử trong menu.
  • $depth: Xác định cấp độ hiện tại của menu, với cấp độ 0 là cấp cao nhất.
  • $args: Chứa các tham số được truyền vào từ hàm wp_nav_menu().
  • $current_object_id: ID của phần tử menu hiện tại.

Phương thức end_el()

  • Được sử dụng để hiển thị đoạn kết thúc của một phần tử trong menu (ví dụ: </li>).
  • $output: Chuỗi này được sử dụng để thêm nội dung vào phần hiển thị ra bên ngoài.
  • $data_object: Chứa dữ liệu của các phần tử trong menu.
  • $depth: Xác định cấp độ hiện tại của menu, với cấp độ 0 là cấp cao nhất.
  • $args: Chứa các tham số được truyền vào từ hàm wp_nav_menu().
  • $current_object_id: ID của phần tử menu hiện tại.

Để tùy biến cấu trúc menu trong WordPress mà không phải chỉnh sửa trực tiếp mã nguồn, bạn có thể tạo một lớp mới kế thừa từ Walker_Nav_Menu. Cụ thể, bạn sẽ tạo lớp VNEngineer_Nav_Walker của riêng mình, kế thừa từ Walker_Nav_Menu, và tùy chỉnh lại các phương thức như start_lvl(), start_el(), v.v., để thay đổi cấu trúc hiển thị theo ý muốn.

Toàn bộ mã của lớp Walker_Nav_Menu có thể được xem từ dòng 10 đến dòng 191 trong tập tin /wp-includes/nav-menu-template.php của mã nguồn WordPress. Việc xem xét các đoạn mã này sẽ giúp bạn hiểu cách thức hoạt động của nó và dễ dàng thực hiện các tùy chỉnh cần thiết cho lớp mới của mình.
Lưu ý rằng khi tùy biến lớp Walker_Nav_Menu, bạn chỉ cần khai báo lại những phương thức mà bạn muốn thay đổi. Không cần phải khai báo lại toàn bộ các phương thức của lớp gốc. Tuy nhiên, nếu bạn quyết định tùy chỉnh một phương thức, bạn phải viết lại nó chính xác như đã được định nghĩa trong /wp-includes/nav-menu-template.php. Bất kỳ sai sót hoặc thiếu sót nào trong việc khai báo phương thức sẽ dẫn đến lỗi trong quá trình thực thi.

Với các menu đơn giản từ 1 đến 2 cấp độ, bạn có thể sử dụng Walker_Nav_Menuwp_nav_menu để tùy chỉnh thông qua các tham số như class và các thẻ bao HTML. Tuy nhiên, nếu bạn cần làm việc với menu đa cấp phức tạp, có cấu trúc thẻ và thuộc tính phức tạp, thì cách tốt hơn là sử dụng hàm để lấy thông tin mảng dữ liệu của các menu đã cấu hình trong admin. Từ đó, bạn có thể tùy chỉnh và tạo giao diện menu theo nhu cầu của mình một cách linh hoạt hơn. Xem thêm bài viết: Lấy mảng dữ liệu các mục menu trong WordPress