URL WordPress не работает?

Вопрос или проблема

Я использую 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. Совпадение. Используется $1, но на самом деле (посмотрите пример в документации), вам нужно работать с $matches.
  2. Ваш Query Var. Вы используете q, но это не wp native или объявленный в примере код. Вы можете использовать один из публичных или объявить свой query var и логику, стоящую за ним.
  3. Если вы знакомы с регулярными выражениями и уже внедрили первые два изменения, но это все равно не работает — я бы предложил использовать 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.

  1. Правила переписывания (Rewrite Rules). WordPress использует add_rewrite_rule для добавления кастомных правил переписывания, авль от правила обрабатывает определенную структуру URL.

  2. Переменные запроса (Query Vars). Если вы создаете кастомные URL, которые используют уникальные параметры, необходимо регистрировать их с помощью хука query_vars.

  3. Перезапись правил (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 на сервере, следует проанализировать несколько шагов и проверить настройки сервера:

  1. Проверьте конфигурацию 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
  2. Переменные запроса:

    • Полезно использовать инспекционные инструменты такие как Debug Bar и Debug Bar Rewrite Rules для того, чтобы получить информацию об активных правилах переписывания и убедиться, что все переменные доступны и правильно обрабатываются.
  3. Обработка запроса:

    • Измените настройку, чтобы, при необходимости, добавлять публичные query vars, если вы планируете их использовать в своих обработчиках.
  4. Обновление пермалинков:

    • После того как вы внесли изменения в файл functions.php, убедитесь, что вы обновили настройки пермалинков на странице /wp-admin/options-permalink.php. Просто пересохраните выбранные настройки, чтобы система заново перегенерировала правила.
  5. Логирование и отладка:

    • Используйте функции логирования на сервере или в WordPress для захвата возникших ошибок и инспектирования процесса.
  6. Тестирование:

    • Перед размещением на рабочем сервере протестируйте изменения в изолированной тестовой среде для выявления возможных проблем заранее.

Пройдя все указанные шаги и проверив конфигурацию, вы должны обеспечить работоспособность требуемого URL. Если проблема продолжает существовать, рекомендуется углубленная диагностика сетевой конфигурации и структуры вашего приложения.

Оцените материал
Добавить комментарий

Капча загружается...