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, но, кажется, ничего не произошло. Нужно ли мне сбросить постоянные ссылки? Или это должно быть отдельным файлом плагина?

Код, который я написал выше, был написан как плагин... а не как код для вставки в файл functions.php
... поскольку вы изначально работаете с плагином, я предполагал, что вы хотите включить код перезаписи в плагин. Но вам нужно хотя бы выполнить вызов add_rewrite_rule()
, а затем сбросить правила перезаписи.

@EAMann: Добавляет ли это правило в элемент rewrite_rules
в wp_options
? Я посмотрел код в wp-includes/rewrite.php
и, будь я проклят, если смогу сказать точно, так это или нет. Если оно сохраняется, что предотвращает многократное сохранение этого правила? Любопытные умы хотят знать!

@Peter add_rewrite_rule()
добавляет правило в массив, который индексируется на основе регулярного выражения, определенного выше (rotate/([^/]+)
). Поэтому его нельзя добавить несколько раз. Взгляните на метод add_rule()
класса WP_Rewrite (/wp-includes/rewrite.php
около строки 1797).

@EAMann, спасибо за разъяснение. Так это будет работать как отдельный плагин, или мне нужно поместить это прямо в файлы используемого плагина? Я попробовал добавить его как отдельный плагин, но исходные ссылки не изменились. Я в основном фронтенд-дизайнер, поэтому все это для меня немного непривычно. Спасибо! :)

Это не предназначено для изменения каких-либо ссылок. То, что делает перезаписыватель URL в WordPress, это сопоставляет запросы с одного URL на другой. Таким образом, запрос к http://site.com/rotate/1
фактически будет отображать контент с http://site.com/wp-content/plugins/ad-rotating-plugin/rotate.php?trackerid=1
. Также у вас должны быть включены "человекопонятные" постоянные ссылки, иначе все это бессмысленно.

@EAMann: Так что массив, в который он добавляется, никогда не записывается в базу данных, верно?

@EAMann, да, у меня включены красивые постоянные ссылки, но мне нужно, чтобы URL-адреса перезаписывались при загрузке страницы или как-то маскировались, чтобы при загрузке страницы пользователи не ВИДЕЛИ длинную ссылку, а фактически видели короткую ссылку. Извините, если я был неясен.

@eamann Мне нужно что-то похожее на это. Запрос перенаправляется на rotate.php, но я получаю $_GET['tracker']=$matches[1]
вместо $_GET['tracker']=1
. Сталкивались ли вы с такой проблемой? Есть какие-то предложения?
