Làm thế nào để đếm các mục menu nav?


7

Tôi đang tạo một walker tùy chỉnh cho menu nav của tôi. Mục tiêu là chia menu thành các cột như vậy:

nhập mô tả hình ảnh ở đây

Tôi có thể dễ dàng xác định vị trí của mình trong danh sách bằng cách nhìn vào $item->menu_order. Những gì tôi không biết là có bao nhiêu món trong tổng số menu.

Làm thế nào tôi có thể tìm ra điều đó từ bên trong xe tập đi?

Cập nhật:

Tôi nhận ra có một số cách khác để tạo cột. Tất cả đều có nhược điểm của họ, tuy nhiên:

  1. Phao CSS. Như được đề xuất dưới đây bởi @sagive, điều này có thể được thực hiện bằng cách thả nổi tất cả các thành phần danh sách. Vấn đề là danh sách thay đổi thứ tự. Thay vì đi xuống cột đầu tiên, sau đó kết thúc sang cột thứ hai, danh sách sẽ đi qua tất cả bốn cột trên hàng đầu tiên, sau đó qua tất cả bốn cột trong hàng thứ hai. Điều này làm rối trật tự.

  2. Cột CSS. Đây gần như là giải pháp hoàn hảo. Nó sẽ cho tôi chính xác những gì tôi muốn - ngoại trừ IE hoàn toàn không có. Ngay cả trên IE 9. Điều đó làm cho nó không thể sử dụng được cho một trang web chính thống.

  3. jQuery. Với một số javascript phía máy khách, tôi có thể hack danh sách và sắp xếp nó theo cách tôi muốn. Mặc dù điều đó rất lộn xộn và nó phá vỡ đối với những người bị khuyết tật js.

  4. PHP. Đây là phương pháp tôi đang hỏi về câu hỏi này. Tôi chia danh sách thành bốn danh sách không có thứ tự riêng biệt, kết xuất từng danh sách trong html, sau đó sử dụng CSS để thả danh sách để tạo bốn cột riêng biệt. Nó có thể khó sản xuất trong PHP, nhưng kết quả trông giống nhau cho tất cả các trình duyệt. Điều đó làm cho nó là lựa chọn tốt nhất tôi tin.

Giải pháp:

Đối với những người có thể theo dõi, đây là mã tôi cuối cùng đã sử dụng để có câu trả lời:

// The menu handle from the register_nav_menu statement in functions.php
$theme_location = 'my-menu-handle';

$theme_locations = get_nav_menu_locations();

$menu_obj = get_term( $theme_locations[$theme_location], 'nav_menu' );

// Echo count of items in menu
echo $menu_obj->count;

Câu trả lời:


11

Gọi wp_get_nav_menu_objectđể có được một đối tượng menu, sẽ cung cấp cho bạn số lượng các mục cho menu đó.

Thí dụ:

// Get menu object
$my_menu = wp_get_nav_menu_object( 'your-menu-name-or-slug' );

// Echo count of items in menu
echo $my_menu->count;

Mong rằng sẽ giúp.


Cảm ơn bạn! Điều đó không giúp tôi có được chính xác những gì tôi muốn, nhưng nó đủ gần để giúp tôi tìm câu trả lời. Vấn đề là tôi không biết tên menu hoặc sên, chỉ có tên chủ đề được đặt trong câu lệnh register_nav_menu. Tôi đã tìm thấy một số mã để xác định tên menu tuy nhiên. Với điều đó trong tay, tôi có thể sử dụng mã của bạn ở trên.
Axeva

À ... bạn không nói rằng trong câu hỏi của bạn, bạn đã làm xong nên có lẽ tôi đã tặc lưỡi thêm một số mã để tìm ra tên menu. Rất vui vì đã giúp đỡ trong mọi trường hợp ..;)
t31os

Có thể lọc cái này bằng cách nào đó để chỉ đếm các mục menu cấp cao nhất và bỏ qua các mục con và menu con?
Sử dụng

1

Tại sao không chỉ sử dụng hàm Array_chunk () ?

Giả sử bạn đã tạo ra một loạt các <li>thẻ đã hoàn thành , mã của bạn sẽ phân tách và hiển thị chúng có thể trông như thế này:

$columns = array_chunk( $myArray, 4 );
foreach ( $columns as $column ) {
    echo '<li>' . $column . '</ul>';
}

0

Tôi biết bạn đã tìm thấy một giải pháp và không biết đó có chính xác là những gì bạn đang tìm kiếm hay không, nhưng tôi đã viết một plugin trước đây để sử dụng trong trang web của khách hàng và nó tạo ra các lớp cho mọi menu, menu phụ và mục menu . Nó được gọi là Menu điều hướng nâng cao. Nếu bạn kết thúc sử dụng, hãy gửi cho tôi các yêu cầu tính năng.


0

Bạn có nghĩ (và xin lỗi nếu tôi thô lỗ) rằng nó đơn giản và dễ dàng hơn nhiều
chỉ để nổi: trái; tất cả "li" và đặt chúng vào trong div với
cấu trúc đó backgroung như một hình ảnh ??

Thí dụ:

<style type="text/css">
.fourPartMenu {

    border: 1px solid #444;
    width: 800px;
    padding: 10px 15px;
}

.fourPartMenu ul {
    list-style: circle; // replace with your img
    padding: 0px;
    margin: 0px;
}

.fourPartMenu ul li {
    float: left;
    width: 190px;
}

</style>

<div class="fourPartMenu">
    <ul>
        <li><a href="#">One</a></li>
        <li><a href="#">Two</a></li>
        <li><a href="#">Three</a></li>
        <li><a href="#">Four</a></li>
        <li><a href="#">Five</a></li>
        <li><a href="#">Six</a></li>
        <li><a href="#">Seven</a></li>
        <li><a href="#">Eight</a></li>
        <li><a href="#">Nine</a></li>
        <li><a href="#">Ten</a></li>
    </ul>
</div>

Tôi nghĩ rằng điều đó sẽ dễ thực hiện hơn nhiều - nhưng .. tôi biết rằng không phải là những gì bạn mong muốn sau một cái nhìn mới mẻ đôi khi giúp đỡ :)


Cảm ơn câu trả lời. Tôi nhận ra rằng tôi có thể làm điều đó với CSS, nhưng danh sách sẽ bị lỗi. Đi qua các cột bạn sẽ nhận được một, hai, ba, bốn ở trên cùng. Cái tôi cần là một, bốn, bảy, chín. Nói cách khác, danh sách đi xuống cột đầu tiên, sau đó xuống cột thứ hai, v.v.
Axeva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.