Lấy ID của trang một mục menu liên kết đến?


9

Tôi hiện đang sử dụng một walker tùy chỉnh để tùy chỉnh đầu ra wp_nav_menu()và tôi đang cố gắng thêm thông tin bổ sung vào các <a>thẻ.

Những gì tôi muốn đầu ra cho mỗi liên kết menu trông giống như:

<a class="boxPAGEID" href="#">About Me Page</a>

Trong trường hợp PAGEIDlà ID của trang tôi đang liên kết đến.

Lý do là vì tôi đang phát triển một chủ đề mở nội dung trang trong hộp đèn, được kích hoạt bởi lớp trong thẻ.

Dưới đây là mã của trình đi bộ tùy chỉnh trong functions.phptệp của tôi (sau mã tôi sẽ chỉ đến khu vực tôi gặp sự cố):

class description_walker extends Walker_Nav_Menu
{

      function start_el(&$output, $item, $depth, $args)
      {
           global $wp_query;     
           $pageid = $wp_query->post->ID;

           $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

           $class_names = $value = '';

           $classes = empty( $item->classes ) ? array() : (array) $item->classes;

           $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
           $class_names = ' class="'. esc_attr( $class_names ) . '"';

           $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

           $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
           $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
           $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
           $attributes .= ! empty( $item->url )        ? ' href="'   . '#' .'"' : '';

           $prepend = '<strong>';
           $append = '</strong>';
           $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';

           if($depth != 0)
           {
                     $description = $append = $prepend = "";
           }

            $item_output = $args->before;
            $item_output .= '<a'. $attributes . 'class="box' . $pageid . '"' .'>';
            $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
            $item_output .= $args->link_after;
            $item_output .= '</a>';
            $item_output .= $args->after;

            $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );

            if ($item->menu_order == 1) {
                $classes[] = 'first';
            }

            }
}

Về cuối là một vài dòng bắt đầu bằng $item_output. Dòng thứ hai là nơi tôi đang cố gắng tạo ID trang:

$item_output .= '<a'. $attributes . 'class="box' . $pageid . '"' .'>';

Trường hợp $pageidtheo:

global $wp_query;    
$pageid = $wp_query->post->ID;

Điều này mang lại cho tôi một ID cố định duy nhất cho tất cả các liên kết được tạo.

Ngoài ra, thay vì $pageidtôi đã thử sử dụng $item->ID, nhưng điều đó đã cho tôi ID của mục menu thay thế.

Bất kỳ đề xuất?


Nếu có các lựa chọn thay thế cho id trang, điều đó cũng sẽ hoạt động. Ban đầu tôi đã thử sử dụng $ item-> url, nhưng url sẽ không hoạt động như một tên lớp. Tiêu đề trang chỉ hoạt động nếu không có khoảng trắng và các thuộc tính khác không được tạo theo mặc định.
Raiman Au

Câu trả lời:


23

ID trang (hoặc ID đối tượng, vì một mục menu có thể liên kết với bất kỳ đối tượng nào) được lưu trữ trong postmetabảng, với khóa _menu_item_object_id. Vì vậy, bạn có thể nhận được ID trang với mã sau đây:

get_post_meta( $item->ID, '_menu_item_object_id', true );

THÁNG MỘT!!!!! Điều này đã làm nó! Xin lỗi vì phản hồi muộn, nhưng đề nghị của bạn đã lừa Bạn thật tuyệt vời! Cảm ơn bạn! Và để ghi lại cho những người không chắc chắn phải làm gì: Tôi đã thay đổi $pageid = $wp_query->post->ID;ở đầu trang thành$pageid = get_post_meta( $item->ID, '_menu_item_object_id', true );
Raiman Au

@Jan Fabry: Tuyệt vời !!! nó tiết kiệm thời gian của tôi..Tạo !!!
Sanjay Khatri

-1

Tôi không thể nhìn sâu vào mã của bạn nhưng để tạo menu có lẽ bạn nên sử dụng get_pages ..

http://codex.wordpress.org/Function_Reference/get_pages

<?php 
  $pages = get_pages(); 
  foreach ($pages as $pagg) {
    $option = '<a class="box' . $pagg->ID . '" href="#">';
    $option .= $pagg->post_title;
    $option .= '</a>';
    echo $option;
  }
 ?>

Cảm ơn lời đề nghị, Serdar! Thật không may, điều này sẽ không hoạt động vì tôi cần menu để có thể được kiểm soát từ phần menu> xuất hiện của bảng quản trị! Đó là lý do tại sao tôi đang sử dụng wp_menu_nav chứ không phải get_pages.
Raiman Au
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.