htaccess или редирект для скрытия части ссылки?
У меня установлен плагин для ротации рекламы, который отображает несколько объявлений на моем сайте, но плагин запрограммирован так, что использует полный путь в ссылке для подсчета показов. Я хотел бы знать, есть ли простой способ скрыть часть ссылки через htaccess. Например:
http://mysite.com/wp-content/plugins/ad-rotating-plugin/rotate.php?trackerid=1
должно выглядеть как:
http://mysite.com/rotate.php?trackerid=1 (или любой другой вариант, главное чтобы не отображался полный путь wp-content/plugins/ в ссылке).
Я пробовал несколько плагинов, но не получил желаемого результата. Подводя итог: мне нужно чтобы ссылка ОТОБРАЖАЛАСЬ как вторая, но при нажатии перенаправляла на первую, при этом параметр trackerid=# должен сохранять сгенерированный ID. Можно ли это сделать через htaccess?
Спасибо!
Что вам нужно сделать - это настроить пользовательский rewrite. Это позволит преобразовывать URL вида http://site.com/rotate/1 в http://site.com/wp-content/plugins/ad-rotating-plugin/rotate.php?trackerid=1
Вот непроверенный код, который может помочь:
<?php
/*
Plugin Name: Ваш плагин
Plugin URI:
Description:
Version: 0.1
Author:
Author URI:
*/
// Добавляем правило rewrite и сбрасываем правила при активации плагина
register_activation_hook( __FILE__, 'ad_rotate_activate' );
function ad_rotate_activate() {
ad_rotate_rewrite();
flush_rewrite_rules();
}
// Сбрасываем правила при деактивации плагина
register_deactivation_hook( __FILE__, 'ad_rotate_deactivate' );
function ad_rotate_deactivate() {
flush_rewrite_rules();
}
// Создаем новое правило rewrite
add_action( 'init', 'ad_rotate_rewrite' );
function ad_rotate_rewrite() {
add_rewrite_rule( 'rotate/([^/]+)','/wp-content/plugins/ad-rotating-plugin/rotate.php?trackerid=$matches[1]','top' );
}
Я попробовал добавить это в свой файл functions.php, но, кажется, ничего не произошло. Нужно ли мне сбросить постоянные ссылки? Или это должно быть отдельным файлом плагина?
RodeoRamsey
Код, который я написал выше, был написан как плагин... а не как код для вставки в файл functions.php... поскольку вы изначально работаете с плагином, я предполагал, что вы хотите включить код перезаписи в плагин. Но вам нужно хотя бы выполнить вызов add_rewrite_rule(), а затем сбросить правила перезаписи.
EAMann
@EAMann: Добавляет ли это правило в элемент rewrite_rules в wp_options? Я посмотрел код в wp-includes/rewrite.php и, будь я проклят, если смогу сказать точно, так это или нет. Если оно сохраняется, что предотвращает многократное сохранение этого правила? Любопытные умы хотят знать!
Peter Rowell
@Peter add_rewrite_rule() добавляет правило в массив, который индексируется на основе регулярного выражения, определенного выше (rotate/([^/]+)). Поэтому его нельзя добавить несколько раз. Взгляните на метод add_rule() класса WP_Rewrite (/wp-includes/rewrite.php около строки 1797).
EAMann
@EAMann, спасибо за разъяснение. Так это будет работать как отдельный плагин, или мне нужно поместить это прямо в файлы используемого плагина? Я попробовал добавить его как отдельный плагин, но исходные ссылки не изменились. Я в основном фронтенд-дизайнер, поэтому все это для меня немного непривычно. Спасибо! :)
RodeoRamsey
Это не предназначено для изменения каких-либо ссылок. То, что делает перезаписыватель URL в WordPress, это сопоставляет запросы с одного URL на другой. Таким образом, запрос к http://site.com/rotate/1 фактически будет отображать контент с http://site.com/wp-content/plugins/ad-rotating-plugin/rotate.php?trackerid=1. Также у вас должны быть включены "человекопонятные" постоянные ссылки, иначе все это бессмысленно.
EAMann
@EAMann: Так что массив, в который он добавляется, никогда не записывается в базу данных, верно?
Peter Rowell
@EAMann, да, у меня включены красивые постоянные ссылки, но мне нужно, чтобы URL-адреса перезаписывались при загрузке страницы или как-то маскировались, чтобы при загрузке страницы пользователи не ВИДЕЛИ длинную ссылку, а фактически видели короткую ссылку. Извините, если я был неясен.
RodeoRamsey
@eamann Мне нужно что-то похожее на это. Запрос перенаправляется на rotate.php, но я получаю $_GET['tracker']=$matches[1] вместо $_GET['tracker']=1. Сталкивались ли вы с такой проблемой? Есть какие-то предложения?
a_fan