Как использовать div-идентификаторы в URL для перехода к конкретной записи... Является ли слеш в конце проблемой?
Некоторые ссылки на моем сайте перенаправляют пользователя к определенной записи в контексте страницы категории.
На сайтах без WordPress это легко достигается путем добавления #example-div-id
в URL, например так:
http://www.example.com#example-div-id
Но в среде WordPress этот URL не работает:
http://www.example.com/?cat=15#post-170
Это (неправильно) прокручивает окно браузера в конец страницы.
Но это работает... при ручном удалении завершающего слеша после загрузки страницы и её перезагрузки. Окно браузера переходит к соответствующему div или записи.
http://www.example.com?cat=15#post-170
.
Кто-нибудь знает, почему это происходит? Или как заставить WordPress убрать завершающий слеш? Безопасно ли удалять завершающий слеш?
Обновление
Я попробовал использовать решение EAMann ниже, реализуя красивые постоянные ссылки для облегчения перехода по якорю. Полученные результаты полностью нарушили порядок моих записей и исключение дочерних категорий. Моя навигация основана на категориях. Я не использую страницы, а использую названия категорий в навигации. Каждая 'страница' на самом деле является архивом категории, показывающим записи из категории. То, что я прочитал о постоянных ссылках, начинающихся с %category%, привело меня к полному отказу от постоянных ссылок. Я определенно не хочу начинать постоянную ссылку с года или ID записи. Это не имеет смысла на моем сайте.
http://www.example.com/category/my-category
выглядит более профессионально и "нормально", чем http://www.example.com/2009/my-category
, когда предполагаемая иллюзия заключается в том, что названия категорий на самом деле являются страницами на этом бизнес-сайте.
Поэтому я был бы признателен за любые другие объяснения, почему не работает переход по якорю.
Обновление #2
(в ответ на комментарий EAMann непосредственно к вопросу)
Мой сайт - это бизнес-сайт, который в основном отображает статический контент. В некоторых областях есть избранные работы портфолио и есть раздел блога. Сайт использует навигацию на основе категорий. Весь контент сайта написан как записи. Каждая запись связана с категорией, которая определяет, где запись отображается. Меню навигации сайта создается с помощью wp_list_categories()
. При клике на категорию открывается архив категории, который представляет все записи из категории.
В настоящее время я использую структуру постоянных ссылок по умолчанию.
http://www.example.com/?cat=15
показывает страницу категории.
Обновление #3
После дополнительного исследования выяснилось, что плагин jQuery "innerfade", который я использую для отображения слайдшоу в верхней части страницы, является причиной проблемы. Это не имеет ничего общего с завершающим слешем. Извините, что пошел по неверному пути.
Если я закомментирую php-код, который подключает js-файл плагина, переход по якорю работает отлично. Я предполагаю, что какая-то javascript-манипуляция с содержимым страницы нарушает переход. Я обошел проблему, используя $(window).scrollTo();
.
Спасибо всем за уделенное время.

Во-первых, я рекомендую использовать "человеко-понятные постоянные ссылки" вместо стандартной структуры с query-строками. Это устранит большинство ваших проблем сразу. Это превратит ваши URL вида http://www.example.com/?cat=15#post-170
в http://www.example.com/category/category-slug/#post-170
, и браузер будет корректно перемещаться к позиции поста на странице.
Тем не менее... Да, вы можете убрать завершающий слэш. Для этого нужно добавить правило в ваш файл .htaccess
:
#удаление завершающих слэшей
RewriteCond %{HTTP_HOST} ^(www.)?yourdomain\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
(Это взято из руководства по Drupal, где делается то же самое...)

спасибо, EAMann. У меня раньше были странности с красивыми постоянными ссылками, но по твоему совету я попробовал их реализовать. Они заработали нормально после того, как я выставил права 777 на .htaccess. Перед тем как полностью протестировать твоё решение (не часть с перезаписью), мне нужно доработать условный код, зависящий от категорий, чтобы правильно выбирались записи. Я дам тебе знать...

Спасибо за правила для .htaccess, но они не убрали слеш. Я перешёл по ссылке на руководство по Drupal, и там автор пишет, что предложенные тобой правила не работают, и рекомендует использовать второй набор правил, который он приводит. Я тоже попробовал их, но безрезультатно. Не знаю, проблема во мне или в WP.

Как я уже упоминал в обновлениях к своему вопросу... другой JavaScript на странице конфликтует с переходом по якорю. Я реализовал дополнительный JS, чтобы обойти этот конфликт. URL теперь выглядит почти так же, как раньше, но с добавлением имени параметра перед символом решётки:
http://www.example.com/?cat=15&hi=#post-170
Но я использую 'плагин' от jQuery-Howto для получения параметров URL.
$.extend({
getUrlVars: function(){
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
},
getUrlVar: function(name){
return $.getUrlVars()[name];
}
});
Я получаю номер поста, присвоенный параметру URL 'hi', и прокручиваю страницу на 20px выше элемента с тем же ID.
//переменная 'hi' используется для перехода к якорю
var hi = $.getUrlVar('hi');
if ( hi ) {
//прокрутить к ссылке или результатам поиска, если присутствует переменная URL 'hi'
$(window).scrollTop($(hi).position().top-20);
Код плагина jQuery и мой пользовательский код выше размещаются в моём JavaScript-файле, который подключается в header.php
