add_rewrite_rule() не работает

27 янв. 2015 г., 19:42:44
Просмотры: 22.8K
Голосов: 2

Мне нужно передать ссылку на объект недвижимости из последней части URL для поиска записи в базе данных, например,

http://example.com/cottage-details/G638/

Мне нужно передать G638 в массив для моего плагина. То, что у меня есть сейчас, вызывает страницу cottage-details, но удаляет последнюю часть URL и показывает пустую страницу вместо информации, которую я хочу получить с сервера. Если я использую

http://example.com/cottage-details/?propref=G638

это работает отлично.

/**
 * Теги перезаписи для плагина
 */
function dcc_rewrite_tags() {
    add_rewrite_tag('%propref%', '([^&]+)');
}

add_action('init', 'dcc_rewrite_tags', 10, 0);

/**
 * Правила перезаписи для плагина
 */
function dcc_rewrite_rules() {
    add_rewrite_rule('^[^/]*/([^/]*)/?','index.php?p=2&propref=$matches[1]','top');
}

add_action('init', 'dcc_rewrite_rules', 10, 0);

Что происходит?

0
Все ответы на вопрос 1
13

Ваше правило перезаписи довольно обширное и, скорее всего, вызовет множество конфликтов.

add_action('init', 'dcc_rewrite_tags');
function dcc_rewrite_tags() {
    add_rewrite_tag('%propref%', '([^&]+)');
}

add_action('init', 'dcc_rewrite_rules');
function dcc_rewrite_rules() {
    add_rewrite_rule('^cottage-details/(.+)/?$','index.php?page_id=2&propref=$matches[1]','top');
}

Затем вы можете получить доступ к переменной запроса propref следующим образом:

$propref = get_query_var( 'propref' );

И не забудьте сбросить правила перезаписи; вы можете сделать это, перейдя в Настройки -> Постоянные ссылки и нажав кнопку сохранения.

Примечание: изменена переменная запроса p на page_id, так как, согласно вашему комментарию, вы используете страницу, а не стандартную запись.

27 янв. 2015 г. 21:28:48
Комментарии

Да, это одна из многих комбинаций, которые я пробовал. Тоже не работает. Я скачал этот плагин: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/, и он показывает, что правило корректно и всё должно работать, но по какой-то причине не работает.

Badger Badger
28 янв. 2015 г. 11:51:13

У меня здесь работает. Можешь уточнить, что именно "не работает"? Получаешь HTTP ошибку? Не можешь получить query var propref? Какие-то другие проблемы?

cybmeta cybmeta
28 янв. 2015 г. 11:53:48

vardump() массива показывает, что он пустой viz: array(2) { ["propref"]=> string(0) "" ["brand"]=> string(2) "ZZ" }

Badger Badger
28 янв. 2015 г. 12:01:08

Думаю, я просто вызываю это неправильно. Я использую $values['propref'] = get_query_var( "propref" );

Badger Badger
28 янв. 2015 г. 12:02:37

Должен ли WordPress записывать правило в .htaccess? Потому что там нет никаких дополнительных правил, кроме стандартных. Я уверен, что rewrite правило корректное, но похоже, что Apache его на самом деле не применяет.

Badger Badger
28 янв. 2015 г. 12:21:30

.htaccess здесь не при чем. Я проверил ещё раз, и всё работает.

cybmeta cybmeta
28 янв. 2015 г. 13:00:30

Ну, у меня на установке это не работает!

Badger Badger
28 янв. 2015 г. 15:19:06

Что такое cottage-details? Страница или запись? Какой у неё ID?

cybmeta cybmeta
28 янв. 2015 г. 16:26:16

Извините, не заметил это. Это страница, ID — 2.

Badger Badger
30 янв. 2015 г. 19:31:18

Если это страница, правило перезаписи должно использовать page_id вместо p. Смотрите документацию WP Query. Я отредактировал ответ.

cybmeta cybmeta
14 февр. 2015 г. 14:33:06

Спасибо, мне удалось решить проблему, используя pagename вместо p.

Badger Badger
14 февр. 2015 г. 20:13:05

Отлично. page_id или pagename будут работать, главное — вам нужно запрашивать страницу, а не стандартную запись. Если этот ответ решил вашу проблему, пожалуйста, отметьте его как принятый.

cybmeta cybmeta
14 февр. 2015 г. 21:07:12

Не могу выразить достаточно благодарности, наконец-то это сработало для меня. Главный секрет - ВСЕГДА обновлять кеш постоянных ссылок

Mr Megamind Mr Megamind
22 февр. 2019 г. 18:15:01
Показать остальные 8 комментариев