WordPress wp_list_pages выделяет текущую страницу

#wordpress #highlight #custom-post-type

#wordpress #выделить #пользовательский тип записи

Вопрос:

Я использую это:

 <ul>
    <?php wp_list_pages("amp;post_type=projectsamp;child_of=$parent_pageamp;title_li="); ?>
</ul>
  

Чтобы получить это:

 <ul>
    <li class="page_item page-item-588"><a href="#" title="One">One</a></li>
    <li class="page_item page-item-592"><a href="#" title="Two">Two</a></li>
    <li class="page_item page-item-599"><a href="#" title="Three">Three</a></li>
</ul>
  

Первый код должен отображать список дочерних страниц.
Все в порядке, но я столкнулся с некоторой проблемой. Если я использовал пользовательский тип записи (как projects в примере), WordPress 3.2.1 не может добавить «текущий» класс <LI> , и я не могу выделить случайно открытую текущую страницу.

functions.php

 add_action( 'init', 'register_cpt_projects' );
    function register_cpt_projects() {
    $labels = array(
    'name' => _x( 'Проекты', 'projects' ),
    'singular_name' => _x( 'Проект', 'projects' ),
    'add_new' => _x( 'Добавить', 'projects' ),
    'add_new_item' => _x( 'Добавить проект', 'projects' ),
    'edit_item' => _x( 'Изменить', 'projects' ),
    'new_item' => _x( 'Новый Проект', 'projects' ),
    'view_item' => _x( 'Просмотреть', 'projects' ),
    'search_items' => _x( 'Поиск проектов', 'projects' ),
    'not_found' => _x( 'Ничего не найдено', 'projects' ),
    'not_found_in_trash' => _x( 'Ничего не найдень в корзине', 'projects' ),
    'parent_item_colon' => _x( 'Родительский Проект:', 'projects' ),
    'menu_name' => _x( 'Проекты', 'projects' ),
    );
    $args = array(
    'labels' => $labels,
    'hierarchical' => true,
    'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields', 'post-formats', 'page-attributes' ),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_position' => 5,
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => false,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'page'
    );
    register_post_type( 'projects', $args );
};
  

переменная
$parent_page:

    // get_top_parent_page_id
    function get_top_parent_page_id($id) {
        global $post;
        if ($post->ancestors) {
            return end($post->ancestors);
        } else {
            return $post->ID;
        }
    };
  

Пожалуйста, помогите!

Ответ №1:

wp_list_pages() сравнит текущую страницу с пунктами меню и добавит класс «current_page_item» в li, содержащий ссылку на текущую страницу.

Все, что вам нужно сделать, это добавить

 li.current_page_item{
/*your specific mark up here */
}
  

в ваш файл style.css в папке темы. Нет необходимости изменять functions.php

Источник: http://codex.wordpress.org/Template_Tags/wp_list_pages#Markup_and_styling_of_page_items

Ответ №2:

Я думаю, что лучшим способом будет рассмотреть возможность использования wp_nav_menu вместо wp_list_pages — это гораздо более гибкое решение и может делать то, что вы хотите. Вам придется синхронизировать меню со списком ваших страниц, но это можно сделать автоматически с помощью действий.

Ответ №3:

в functions.php добавьте это

 add_filter('nav_menu_css_class', 'current_type_nav_class', 10, 2 );
function current_type_nav_class($classes, $item) {
    $post_type = get_post_type();
    if ($item->attr_title != '' amp;amp; $item->attr_title == $post_type) {
        array_push($classes, 'current-menu-item');
    };
    return $classes;
}
  

Источник: https://wordpress.stackexchange.com/a/12292/11610

Ответ №4:

Решите это без боли и просто класс тела 🙂

В functions.php:

 function get_id_outside_loop() {
    global $wp_query;
    $thePostID = $wp_query->post->ID;
    return $thePostID;
}
  

В header.php:

 <body class="<?php echo get_id_outside_loop(); ?>">
  

В <head> разделах или в footer.php:

 <STYLE>
<!--
body.<?php echo get_id_outside_loop(); ?> .project_pages ul li.page-item-<?php echo get_id_outside_loop(); ?> 
{
  background: #0096f4; /* Highlight */
}
-->
</STYLE> 
  

Хорошего дня!

Ответ №5:

Вам нужно добавить это в свой functions.php:

 function kct_page_css_class( $css_class, $page, $depth, $args, $current_page ) {
  if ( !isset($args['post_type']) || !is_singular($args['post_type']) )
    return $css_class;

  global $post;
  $current_page  = $post->ID;
  $_current_page = $post;
  _get_post_ancestors($_current_page);

  if ( isset($_current_page->ancestors) amp;amp; in_array($page->ID, (array) $_current_page->ancestors) )
    $css_class[] = 'current_page_ancestor';
  if ( $page->ID == $current_page )
    $css_class[] = 'current_page_item';
  elseif ( $_current_page amp;amp; $page->ID == $_current_page->post_parent )
    $css_class[] = 'current_page_parent';

  return $css_class;
}
add_filter( 'page_css_class', 'kct_page_css_class', 10, 5 );
  

Через http://kucrut.org/wp_list_pages-for-custom-post-types /