Вопрос или проблема
Я использую WordPress, у меня есть проблема с URL.
Мой текущий URL — это IP-адрес на сервере: http://www.192.10.1.22/states/?q=ohio
Я хочу URL: http://www.192.10.1.22/states/ohio
Я использовал следующий код в файле functions.php
, и он работает на моем локальном сервере, но когда я загружаю его в Cpanel, то он не работает, выдает ошибку «страница не найдена».
function custom_rewrite_rule() {
add_rewrite_rule(
'states/([^/]*)/?',
'index.php/states/?q=$1',
'top' );
}
add_action('init', 'custom_rewrite_rule', 10, 0);
Я также обновил постоянные ссылки, и apache mode_rewrite включен. Как мне решить эту проблему?
Это не то, как работает rewrite_rules
в WordPress.
Вы упустили две вещи.
- Совпадение. Используется
$1
, но на самом деле (посмотрите пример в документации), вам нужно работать с$matches
. - Ваш Query Var. Вы используете
q
, но это не wp native или объявленный в примере код. Вы можете использовать один из публичных или объявить свой query var и логику, стоящую за ним. - Если вы знакомы с регулярными выражениями и уже внедрили первые два изменения, но это все равно не работает — я бы предложил использовать debug bar и мой плагин debug bar rewrite rules
Добавьте следующий код в functions.php
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state_names';
return $vars;
}
function custom_rewrite_rule() {
add_rewrite_rule('^states/([^/]*)/?','index.php?post_type=page&pagename=states&state_names=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
flush_rewrite_rules();
Ответ или решение
Вопрос о том, почему URL на WordPress не работает должным образом после настройки, является довольно распространенной проблемой. Чтобы дать профессиональный и детализированный ответ на этот вопрос, необходимо разобрать несколько аспектов работы WordPress и Apache, а также рассмотреть предложенный вами код. На основе этого можно предложить оптимальное решение.
Теория
WordPress использует систему ЧПУ (человеко-понятные URL) для улучшения совместимости URL с поисковыми системами и удобства пользователей. Это достигается за счет использования переписывания URL с помощью внутренних правил, которые обрабатываются через WordPress и веб-сервер (например, Apache).
Система переписывания URL WordPress основывается на регулярных выражениях и требует декларации "переменных запроса" (query vars) для обработки нестандартных частей URL. Эти переменные позволяют WordPress "понимать", что искать в базе данных на основании структуры URL.
-
Правила переписывания (Rewrite Rules). WordPress использует add_rewrite_rule для добавления кастомных правил переписывания, авль от правила обрабатывает определенную структуру URL.
-
Переменные запроса (Query Vars). Если вы создаете кастомные URL, которые используют уникальные параметры, необходимо регистрировать их с помощью хука
query_vars
. -
Перезапись правил (Flush Rewrite Rules). Любое изменение в правилах переписывания требует перезаписи существующих правил, что может быть выполнено вручную на панели управления WordPress, либо программно.
Пример
Ваше начальное решение использует следующую структуру кода в functions.php
:
add_filter('query_vars', 'add_state_var', 0, 1);
function add_state_var($vars){
$vars[] = 'state_names';
return $vars;
}
function custom_rewrite_rule() {
add_rewrite_rule('^states/([^/]*)/?','index.php?post_type=page&pagename=states&state_names=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
flush_rewrite_rules();
Применение
Чтобы устранить вашу проблему и обеспечить корректное переписывание URL на сервере, следует проанализировать несколько шагов и проверить настройки сервера:
-
Проверьте конфигурацию Apache:
-
Убедитесь, что модуль
mod_rewrite
включен. Это можно сделать через файл.htaccess
. Он должен содержать следующие строки:# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
-
-
Переменные запроса:
- Полезно использовать инспекционные инструменты такие как Debug Bar и Debug Bar Rewrite Rules для того, чтобы получить информацию об активных правилах переписывания и убедиться, что все переменные доступны и правильно обрабатываются.
-
Обработка запроса:
- Измените настройку, чтобы, при необходимости, добавлять публичные query vars, если вы планируете их использовать в своих обработчиках.
-
Обновление пермалинков:
- После того как вы внесли изменения в файл
functions.php
, убедитесь, что вы обновили настройки пермалинков на странице/wp-admin/options-permalink.php
. Просто пересохраните выбранные настройки, чтобы система заново перегенерировала правила.
- После того как вы внесли изменения в файл
-
Логирование и отладка:
- Используйте функции логирования на сервере или в WordPress для захвата возникших ошибок и инспектирования процесса.
-
Тестирование:
- Перед размещением на рабочем сервере протестируйте изменения в изолированной тестовой среде для выявления возможных проблем заранее.
Пройдя все указанные шаги и проверив конфигурацию, вы должны обеспечить работоспособность требуемого URL. Если проблема продолжает существовать, рекомендуется углубленная диагностика сетевой конфигурации и структуры вашего приложения.