Почему правило перезаписи работает для страницы, а не для записи пользовательского типа записи?


Обновление: Я прочитал, что пользовательское правило перезаписи может быть переопределено и удалить любые переменные параметров, когда пользовательское правило перезаписи используется на дочерней/родительской странице/публикации. Сообщение, для которого предназначено мое пользовательское правило перезаписи, не является дочерним/родительским, но является частью пользовательского типа записи. Может ли это быть причиной аналогичных проблем с перезаписью (удаленные переменные параметров)?

Обновление 2 (Проблема решена): Как упоминалось в обновлении выше, тот факт, что он касается правила перезаписи для записи пользовательского типа записи, действительно вызвавшего проблему. Пожалуйста, смотрите мой ответ для решения.

Мой вопрос

При использовании приведенного ниже кода фактическая перезапись записи, похоже, работает, так как она правильно приводит к записи с идентификатором 160. И он делает это даже при использовании красивого URL-адреса параметров. Но как только URL-адрес симпатичного параметра перенаправляется на сообщение с идентификатором 160, все значения параметров исчезают.

Как я могу заставить WP не удалите пользовательский параметр при использовании красивого URL-адреса параметра?

Таким образом, URL-адрес, подобный:

site.com/post/parameter-value/

Следует перенаправить (на сообщение с идентификатором 160) следующим образом:

site.com/custom-post-type-slug/post-title-of-160/parameter-value/ ( значение параметра не сбрасывается)

Код, который я использую

function add_custom_query_vars($vars) {
    $vars[] = 'member_view';
    return $vars;
}
add_filter('query_vars', 'add_custom_query_vars');

function add_rewrite_rules($rules) {
$newrules = array('page/([^/]+)/?$' => 'index.php?page_id=158&member_view=$matches[1]',
                  'post/([^/]+)/?$' => 'index.php?p=160&member_view=$matches[1]');
$rules = $newrules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Подробности

Я использую приведенный выше код для переписывания URL-адресов на красивые URL-адреса, заканчивающиеся красивыми пользовательскими значениями параметров. Вот что работает, а что нет работа:

Для страниц (это работает)

Правило перезаписи для страниц работает. URL-адрес, например:

site.com/page/parameter-value/

Перенаправляет (на страницу с идентификатором 158) следующим образом:

site.com/page-title-of-158/parameter-value/

И get_query_var('member_view') возвращает parameter-value.

Для сообщений (с использованием некрасивого URL-адреса) (это работает)

Для сообщений параметры сохраняются только при использовании "некрасивых" URL-адресов:

site.com/?p=160&member_view=parameter-value

Или:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

Оба перенаправляют (на сообщение с идентификатором 160) следующим образом:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

И значение member_view может быть извлечено.

Для сообщений (с использованием красивого URL-адреса) (это не работает)

При использовании URL-адреса с красивым параметром пользовательский параметр удаляется после завершения процесса перенаправления canonical.php. Итак, URL-адрес, который выглядит следующим образом:

site.com/post/parameter-value/

Перенаправляет (на сообщение с идентификатором 160) следующим образом:

site.com/custom-post-type-slug/post-title-of-160/ ( значение параметра исчезло)

И оба get_query_var('member_view') и $_GET['member_view'] ничего не возвращайте.

Author: Community, 2014-11-27

2 answers

Что ж, я нашел решение. Похоже, что при применении правила перезаписи к сообщению пользовательского типа записи необходимо указать WP имя пользовательского типа записи в самом правиле перезаписи.

Вот код, который НЕ работает (перенаправляет и удаляет переменные параметров вместо перезаписи):

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Вот код, который ВЫПОЛНЯЕТ работу (переписывает и сохраняет переменные параметров):

function add_rewrite_rules($rules) {
    $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&post_type=cpt_name&member_view=$matches[2]');
    $rules = $newrules + $rules;
    return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

Переписывание сработало, как только &post_type=cpt_name было добавлено в его правило. Я поражен что это не указано/не было явно указано ни в одной информации, связанной с правилами перезаписи, которую я нашел и прочитал (и я искал 2 дня):)

URL-адрес, который выглядит следующим образом:

site.com/cpt-slug/INSERT-ID-OF-CPT-POST/INSERT-PARAMETER-VARIABLE/

Теперь будет переписано правильно, и переменные параметров не будут удалены. Переменную параметра теперь можно получить с помощью get_query_var('member_view').

 1
Author: Ralph, 2014-11-27 16:32:39

Найдите функцию add_rewrite_tag. Вы должны добавить тег, чтобы перехватить любую переменную при перезаписи; или она будет удалена

В вашем случае это должно сработать:

add_rewrite_tag( '%ps-cpt-parameter%', '([^/]+)');
add_rewrite_rule('post/([^/]+)/([^/]+)/?', 'index.php?p=$matches[1]&ps-cpt-parameter=$matches[2]', 'top' );

// And then you could get the variable with

get_query_var('ps-cpt-parameter');

Кстати, с помощью add_rewrite_rule вы можете установить, хотите ли вы, чтобы ваши пользовательские правила перезаписи были до или после любого другого правила

 0
Author: PotterSys, 2014-11-27 14:51:12