Переписывание URL через Wordpress Rewrite или .htaccess

ПОДТВЕРЖДЕНИЕ, ЧТОБЫ ИЗМЕНИТЬ, ЧТО Я РЕШЕН ЭТО


Скажем, у меня есть блог Wordpress: www.animals.com. У меня есть определенный PHP файл в моем каталоге тем: www.animals.com/wp-content/themes/mytheme/db.php. Кроме того, у меня есть настраиваемый шаблон для этой страницы, поэтому я создаю новую страницу на панели администрирования Wordpress, чтобы показать db.php: www.animals.com/database.

Итак, если я хочу что-то прочитать о львах, я просто перехожу к: www.animals.com/database/?animal=lion (потому что так я решил написать PHP, вставив в запрос значение из $_GET ['animal'], используя PDO и др.).

Теперь я хотел бы получить доступ к www.animals.com/database/?animal=lion как www.animals.com/lion.

Должен ли я использовать .htaccess или Wordpress Rewrite? Где я должен разместить свой .htaccess в корневой папке Wordpress (с wp-config.php и этими файлами) или в моем каталоге тем?

Один из корня имеет RewriteBase / и материал из Wordpress по умолчанию. Что я должен писать, чтобы добиться того, чего хочу? Должен ли я помещать его перед или после существующего кода?

EDIT: это мой public_html.htaccess, и это то, что я хочу действительно: У меня есть веб-сайт: www.domain.com, и когда вы вводите этот http://www.domain.com/dios/?dios=agni, он показывает вам информацию о бога Агни. Я хотел бы ввести www.domain.com/dioses/agni для доступа к информации о бога Агни. Файл PHP находится в www.domain.com/wp-content/themes/smitespain/dios.php Он не работает x_x

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^dioses/(\w*)$ dios/?dios=$1 [NC,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

EDIT2: я использую multisite (проверьте EDIT4), и снова, /database//dios/and/dioses/are not фактические папки, которые я создал, это имя для страницы, которую я создал в Wordpress. Дело в том, что теперь оно показывает имя бога в заголовке вкладки: S означает, что установлена ​​переменная $_GET ['dios'], но она не загружает файл (dios.php) =/

EDIT3. Мне нужно напрямую обратиться к domain.com/dios/?dios=agni, потому что это URL-адрес, который позволит файлу PHP (dios.php) загрузить get_header() из wordpress, поэтому я не могу получить доступ к файлу напрямую

EDIT4: я решил удалить многопозиционную вещь

EDIT5: это страницы Wordpress, которые у меня есть: domain.com/dioses/ для (www.domain.com/wp-content/themes/smitespain/dioses.php)
domain.com/dios/?dios=thor для (www.domain.com/wp-content/themes/smitespain/dios.php)

EDIT6: я читал что-то в wordpress codex..и понял, что если я хочу пойти в domain.com/dioses, я могу получить к нему доступ, перейдя в domain.com/index.php?pagename=dioses или domain.com/?pagename=dioses
Итак, я добавил это между RewriteBase / и следующим правилом: RewriteRule example/test ?pagename=dioses и domain.com/example/test перенаправляет меня на domain.com/dioses, но также изменяет URL-адрес в адресной строке:(
Дело в том, что если я попробую: RewriteRule example/test ?pagename=dios&dios=thor он отправит меня на страницу 'dios' без '? Dios = thor'

EDIT7: я начал использовать wordpress rewrite, я добавил это в свою тему functions.php:

function my_rewrite_rules() {  
    add_rewrite_rule(  
        'blah',
        'index.php?pagename=dios&dios=agni',  
        'top'  
    );  
}  
add_action( 'init', 'my_rewrite_rules' );

и снова.. он загружает страницу dios, без? dios = agni

EDIT8: и, наконец, мне удалось заставить его работать =)
первое, что мне нужно знать, новый ?dios=XXXX больше не будет доступен для $_GET['dios'], вам нужно позвонить $wp_query->query_vars['dios'], поэтому я добавил это в свою тему functions.php

function add_query_vars($new_var) {
$new_var[] = "dios";
return $new_var;
}
add_filter('query_vars', 'add_query_vars');

function add_rewrite_rules($rules) {
$new_rules = array('([^/]+)' => 'index.php?pagename=dios&dios=$matches[1]');
$rules = $new_rules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

i убедитесь, что $wp_query->query_vars['dios'] действительно установлен то я просто добавляю регулярное правило

Ответ 1

Есть другой способ решить эту проблему, не касаясь WordPress.

Добавить в .htaccess

RewriteRule ^lion /indexw.php?pagename=db&dios=$1 [L,E=URI:/detail/]

Создать файл indexw.php:

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");

Как это работает? mod_rewrite устанавливает REDIRECT_URI, как указано в E = URI: аргумент значения. indexw.php просто перезаписывает REQUEST_URI с правильным значением (спасибо Ravi Thapliyal за понимание этого)

Ответ 2

WordPress ставит глобальную переадресацию на root для всего неидентифицированного i.e, а не существующего файла или папки для своего /index.php. С другой стороны, теперь вы хотите перенаправить их на ?animal=unidentified. Таким образом, если список ключевых слов для животных не установлен, любое предлагаемое решение может испортить ваш WordPress.

Если вам понравилось 10-ти странных животных, вы можете добавить их, как показано ниже, в ваш .htaccess(у root/)

RewriteEngine on
RewriteBase /

RewriteRule ^(lion|leopard|tiger|dog|cat)/?$ database/?animal=$1 [NC,L]

# WordPress rules come here

Для 40 с лишних животных я предлагаю вам иметь префикс каталога (не обязательно) для ваших животных.

RewriteRule ^a/(.+?)/?$ database/?animal=$1 [NC,L]

Это перенаправит любые /a/critter в database/?animal=critter, и вам больше не придется добавлять их в свой .htaccess. Вы могли бы также иметь оба правила сосуществовать, чтобы, если вы не изменили .htaccess для /panther, но вы все равно можете получить к нему доступ в /a/panther.

РЕДАКТИРОВАТЬ:
Хорошо, я просмотрел его, и это невозможно без написания PHP script, чтобы перехватить этот запрос и переслать его на index.php. Здесь, как работает mutisite: поскольку ни один из ваших переписывающих файлов не соответствует этому значению, он переходит в index.php; точка входа для PHP-кода WordPress. Где-то глубоко, код проверяет заголовок REQUEST_URI, чтобы увидеть, соответствует ли он одному из ваших мультисайтов (/dios), и если это произойдет, пересылает запрос на настроенную страницу (dios.php).

Когда мы выполняем перенаправление .htaccess для /dioses/agni, мы можем нажать index.php (удалив [L]), но заголовок REQUEST_URI по-прежнему остается тем же (/dioses/agni), и у него нет мулисайта настроен для него. Следовательно, перенаправление не выполняется.

Ответ 3

RewriteEngine On
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]

Просто используйте этот код. Я надеюсь, что это сработает.

Ответ 4

add_filter('rewrite_rules_array', function() {}) URL не будет работать для меня ни вызовом add_filter('rewrite_rules_array', function() {}), ни вызовом add_rewrite_rule(). Очевидно, это произошло потому, что фильтр 'rewrite_rules_array' никогда не срабатывал при открытии страниц веб-сайта 'rewrite_rules_array' интерфейса, поэтому перезаписи не создавались.

Решением было перейти в админку и просто открыть страницу Настройки → Постоянные ссылки. Мне нужно делать это каждый раз, когда я хочу изменить свое переписывание.

Я не знаю, работает ли ванильный Wordpress таким образом, это, вероятно, вызвано тем, что плагин/тема уже установлены.