«Правильная» система навигации

Привет всем.
Решил сделать систему навигации по такому принципу:

У активной страницы в меню удаляется ссылка и меняется подсветка, если перейти на подкатегорию или пост принадлежащий данной странице, ссылка остается, подсветка меняется.

Решил и сделал, но чувствую что реализация, мягко говоря, хромает:

<ul id="page-bar" class="left clearfloat">
    <li id="logo-li">
        <?php 
            if (is_home()) 
            echo '<div id="logo-link"></div>'; 
            else echo '<a id="logo-link" href="'.get_option('home').'/"></a>';
        ?>
    </li>
        <?php
            $pages = get_pages('sort_column=menu_order');
            if ( !is_page() && !is_home() ) {
                $category_the = get_the_category(); 
                $parent_cat = $category_the[0]->category_parent;
            }
            global $wpdb;
            foreach ($pages as $pagg) {
            $pageid_name = $wpdb->get_var("SELECT post_title FROM $wpdb->posts WHERE ID = '".$pagg->ID."'");
            if (is_page($pagg->ID)) {
                $option ='<li class="current_page_item">'.$pagg->post_title.' </li>';
            } else if ($pageid_name == get_cat_name($parent_cat)) {
                $option ='<li class="current_page_item"><a href="'.get_permalink($pagg->ID).'">'.$pagg->post_title.'</a></li>';    
            } else {
                $option = '<li><a href="'.get_permalink($pagg->ID).'">'.$pagg->post_title.'</a></li>';
            }
            echo $option;
            }
        ?>
</ul>

После этого чувствую себя извращенцем 🙂 Основная проблема в том, что у меня, к примеру, на странице «Блог» отображаются все записи принадлежащие рубрике с одноименным названием, но просто так проверить соответствие родителя поста (рубрики) и страницы не получается.

Плагины, думаю, существуют, но хочется сделать все «ручками». Буду очень благодарен ответившим.

После этого чувствую себя извращенцем :)

И не без оснований 🙂 "SELECT post_title FROM $wpdb->posts WHERE ID = ‘".$pagg->ID."‘" в этом контексте действительно является крутым извращением. get_pages возвращает массив объектов, но Вы, вместо того, чтобы использовть свойство объекта $pagg->post_title, почему-то делаете лишний запрос к базе.

Про "пост принадлежащий данной странице" я вообще промолчу.

Мой совет: попробуйте максимально четко и корректно сформулировать, чего хотите получить, тогда и решение нарисуется почти само собой.

PS Убирать ссылку (кликабельность) с активного пункта меню – лишний неблагодарный труд.

У активной страницы в меню удаляется ссылка и меняется подсветка, если перейти на подкатегорию или пост принадлежащий данной странице, ссылка остается, подсветка меняется.

wp_list_pages плюс немного css (для этого есть встроенные классы – см. исходный html код страницы) — это все, что нужно для счастья 🙂
а ссылку на текущую страницу можно так замаскировать. что мама родная не узнает 🙂

Спасибо Вам, Ю. Б., я новичок в ВП и в PHP вообще, поэтому пока такой ужасный код, но я исправлюсь :). По поводу удаления ссылки — это дизайнерская привычка, а «пост принадлежащий данной странице» — у меня просто логика такая, что у постов есть привязка к страницам.

а ссылку на текущую страницу можно так замаскировать. что мама родная не узнает :)

Да, можно конечно, но я стараюсь придерживаться семантическому коду, и все равно нужно будет писать проверку на принадлежность категории (поста) странице.

P.S. Оч нравиться Ваши статьи, они часто дублируются в рунете, многие мне помогли(помогают), поэтому выражаю Вам свою огромную благодарность :).

и все равно нужно будет писать проверку на принадлежность категории (поста) странице.

посты (записи) группируются в категории (рубрики), а страницы («статические страницы» в русском переводе) существуют сами по себе.
вот Ю.Б. тут как-то делится кодом для «подсветки» категории на странице поста, принадлежащей этой категории:
http://mywordpress.ru/support/viewtopic.php?pid=15731

P.S. Оч нравиться Ваши статьи, они часто дублируются в рунете, многие мне помогли(помогают), поэтому выражаю Вам свою огромную благодарность :).

🙂

По поводу удаления ссылки — это дизайнерская привычка

Плохая привычка 🙂 Ссылка – не ссылка отличаются не только подчеркиванием (которое, строго говоря, с наличием ссылки связано опосредованно), а еще и изменением объектной структуры документа. Проще и правильнее использовать специальный класс, присваиваемый ссылке или ее контейнеру, если этот пункт, так сказать, активный. А по классу можно и подчеркивание убрать, и курсор заменить, и кликабельность подавить. Причем единообразно для всех пунктов меню. Если хотите, покажу ближайшие грабли Вашей привычки. Грабли эти называются "раздвижные двери" – самый распространенный способ делать менюху в виде табов (закладок).

а «пост принадлежащий данной странице» — у меня просто логика такая, что у постов есть привязка к страницам.

Ничего не поделаешь, придется переходить на логику WordPress: страницы и посты/рубрики – две большие разницы. Иначе кастомизация превратится с сплошные мучения. Оно Вам надо? 😉

Плохая привычка :) Ссылка - не ссылка отличаются не только подчеркиванием (которое, строго говоря, с наличием ссылки связано опосредованно), а еще и изменением объектной структуры документа.

Вот об этом я и говорю, в спецификации HTML сказано, что тег <a> предназначен для определения ссылки на другую страницу (ресурс), в моем случае — это уже не ссылка, т. к. никуда не ведет, а значит наш документ не является «well-formed» (даже если он валидный) т. е. не соответствует спецификации. Понимаю, что я могу показаться занудным, но я стараюсь поддерживать стандарты, даже если это лишний гемор.

Если хотите, покажу ближайшие грабли Вашей привычки. Грабли эти называются "раздвижные двери" - самый распространенный способ делать менюху в виде табов (закладок).

Да, я знаю эту технику, но не сталкивался с проблемой, буду признателен, если поделитесь.

Вот неплохая статья про "двери" http://www.webmascon.com/topics/coding/36a.asp
Попробуйте прикрутить этот метод к своему коду, соответствующему "спецификации" 🙂

Есть два случая: а) когда при переходе на другой таб страница перегружается; б) соответственно не перегружается.
В обоих случаях не вижу никаких проблем.

а) Использовать span с теме же свойствами что и у а в активной li т. е.:

<li id="current"><a href="#">News</a></li> = <li id="current"><span>News</span></li>

На любом серверном языке, думаю, реализация по сложности отличаться не будет.

б) Я бы в этом случае вообще не использовал бы тег a, а сделал бы, к примеру, как Сергей Чикуенок — http://chikuyonok.ru/playground/tabs/ этот пример мне еще нравиться тем, что здесь присутствует семантическая связь между названием таба и его содержимым.

Та делайте что хотите. Можете даже WordPress не использовать. Или переписать его весь под свои спецификации. 😀

Ю. Б., Соня — спасибо вам за ответы, проблему можно считать решенной.

Anonymous
Отправить
Ответ на: