К основному контенту

GET параметр для постоянных ссылок в Wordpress

Создавая функционал разбиения на страницы для плагина Wordpress столкнулся с небольшой проблемой. Для адресов страниц я использую постоянные ссылки, т.е. вместо http://mysite.com/index.php?cat=34&id=117 в строке браузера я вижу http://mysite.com/category/bigcargo. Это хорошо для SEO да и читабельность лучше, чем смотреть на вереницу непонятных параметров.
Реализуя вывод товаров в категории, очень захотелось разбить их на страницы, ибо не приятно выводить полотенце из тысяч товаров на одну страницу. Варианта решения я видел 2 - GET параметр в строке адреса и вывод данных через AJAX. Второй вариант интересный, но придется писать JavaScript. Второй вариант казался достаточно простым, его я и выбрал.
Трудности начались буквально сразу - при попытке передать номер страницы через GET параметр я получал очередной адрес с читабельной ссылкой, но никак не вторую страницу. Переменная $_GET была пустая.

Решение

На просторах интернета наверняка есть решения, просто я их не смог найти :)
Все делается за хука. Единственное - придется пожертвовать читабельной ссылкой, но для начала сойдет.
Первый хук - это объявление нашего параметра, а второй - правило перезаписи для него.
В главный класс плагина добавляем следующее:
add_filter('query_vars', array(&$this, 'AddQueryVars'));
add_filter('rewrite_rules_array', array(&$this, 'AddRewriteRules'));
Эти 2 фильтра дадут возможность добавить наш параметр и добавить к ему правило перезаписи.
Теперь реализация
public function AddQueryVars($aVars)
{
    // Добавим имя параметра, который должен отображаться в URL
    $aVars[] = 'ls_page';
    return $aVars;
}
 
public function AddRewriteRules($aRules)
{
    // Правила для перезаписи URL, что бы наш параметр не менялся
    $aNewRules = array('ls_page/([^/]+)/?$' => 'index.php?ls_page=$matches[1]');
    $aRules = $aNewRules + $aRules;
    return $aRules;
}
В нашем случае, мы не будем перезаписывать параметр, а просто выведем его как GET параметр строки запроса.

В итоге, мы получим строку вида http://mysite.com/category/?ls_page=2.

Почему параметр ls_page, а не просто page? Я не разбирался, но параметр с именем page не выводится, т.е. правило перезаписи его не обрабатывает. Наверняка, дело в имени и у самого Wordpress есть такой параметр и, конечно, его правило перезаписи важнее пользовательского.

Комментарии

Популярные сообщения из этого блога

Прямые ссылки на файлы Google диска

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл - это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

События для ведения таблиц

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно - придумали алгоритм, сделали табличку. Дело осталось за малым - нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

OOP ALV GRID с HTML шапкой

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.