Привет всем.
Решил сделать систему навигации по такому принципу:
У активной страницы в меню удаляется ссылка и меняется подсветка, если перейти на подкатегорию или пост принадлежащий данной странице, ссылка остается, подсветка меняется.
Решил и сделал, но чувствую что реализация, мягко говоря, хромает:
<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
🙂
Плохая привычка 🙂 Ссылка – не ссылка отличаются не только подчеркиванием (которое, строго говоря, с наличием ссылки связано опосредованно), а еще и изменением объектной структуры документа. Проще и правильнее использовать специальный класс, присваиваемый ссылке или ее контейнеру, если этот пункт, так сказать, активный. А по классу можно и подчеркивание убрать, и курсор заменить, и кликабельность подавить. Причем единообразно для всех пунктов меню. Если хотите, покажу ближайшие грабли Вашей привычки. Грабли эти называются "раздвижные двери" – самый распространенный способ делать менюху в виде табов (закладок).
Ничего не поделаешь, придется переходить на логику WordPress: страницы и посты/рубрики – две большие разницы. Иначе кастомизация превратится с сплошные мучения. Оно Вам надо? 😉
Вот об этом я и говорю, в спецификации HTML сказано, что тег <a> предназначен для определения ссылки на другую страницу (ресурс), в моем случае — это уже не ссылка, т. к. никуда не ведет, а значит наш документ не является «well-formed» (даже если он валидный) т. е. не соответствует спецификации. Понимаю, что я могу показаться занудным, но я стараюсь поддерживать стандарты, даже если это лишний гемор.
Да, я знаю эту технику, но не сталкивался с проблемой, буду признателен, если поделитесь.
Вот неплохая статья про "двери" http://www.webmascon.com/topics/coding/36a.asp
Попробуйте прикрутить этот метод к своему коду, соответствующему "спецификации" 🙂
Есть два случая: а) когда при переходе на другой таб страница перегружается; б) соответственно не перегружается.
В обоих случаях не вижу никаких проблем.
а) Использовать span с теме же свойствами что и у а в активной li т. е.:
На любом серверном языке, думаю, реализация по сложности отличаться не будет.
б) Я бы в этом случае вообще не использовал бы тег a, а сделал бы, к примеру, как Сергей Чикуенок — http://chikuyonok.ru/playground/tabs/ этот пример мне еще нравиться тем, что здесь присутствует семантическая связь между названием таба и его содержимым.
Та делайте что хотите. Можете даже WordPress не использовать. Или переписать его весь под свои спецификации. 😀
Ю. Б., Соня — спасибо вам за ответы, проблему можно считать решенной.