Redirect::handle() в includes/class-redirect.php (master @ v1.0.1) триггерится только на условии $post->ID === $page_unic[i]['page_new']. Это значит — редирект клон-страницы на канонический /<city>/<orig-slug>/ отрабатывает только в edge-кейсе, когда admin вручную опубликовал клон под собственным URL.
В production-модели washanyanya (для которой плагин и задумывался) клоны хранятся со статусом private, собственного публичного URL не имеют. На таких сайтах текущий handler не срабатывает никогда.
Текущий код
includes/class-redirect.php:38-69 — фильтр по (int)($row['page_new']) === $current_page_id.
Дальше матчит $candidate->ID против page_new в page_unic, находит соответствующий town, формирует canonical URL и делает wp_safe_redirect().
Возможные решения
A. Переписать Redirect::handle() на washanyanya-style:
зацепиться на template_redirect или wp после resolve query
внутри проверять is_404()
если 404 — pull last URL segment, get_posts(name=$slug, status=[private,publish]), lookup в page_unic
переписать tests/Integration/RedirectTest.php под новую семантику
B. Зафиксировать текущий scope в README:
Redirect handles только published clones с собственным slug. Для private-clones (washanyanya-style) — out of scope MVP.
Сопутствующее
beads cp-ifg (discovered from cp-83m) — внутренний tracker.
Тесты RedirectTest.php фиксируют текущую (page_new) семантику — менять одновременно с handler'ом.
## Симптом
`Redirect::handle()` в `includes/class-redirect.php` (master @ v1.0.1) триггерится **только** на условии `$post->ID === $page_unic[i]['page_new']`. Это значит — редирект клон-страницы на канонический `/<city>/<orig-slug>/` отрабатывает **только** в edge-кейсе, когда admin вручную опубликовал клон под собственным URL.
В production-модели washanyanya (для которой плагин и задумывался) клоны хранятся со статусом `private`, собственного публичного URL не имеют. На таких сайтах текущий handler не срабатывает никогда.
## Текущий код
`includes/class-redirect.php:38-69` — фильтр по `(int)($row['page_new']) === $current_page_id`.
## Что делает washanyanya вместо этого
На `is_404()` ищет private-пост по slug через:
```php
$candidates = get_posts([
'name' => $slug,
'post_status' => ['private', 'publish'],
'post_type' => 'page',
]);
```
Дальше матчит `$candidate->ID` против `page_new` в page_unic, находит соответствующий `town`, формирует canonical URL и делает `wp_safe_redirect()`.
## Возможные решения
**A.** Переписать `Redirect::handle()` на washanyanya-style:
- зацепиться на `template_redirect` или `wp` после resolve query
- внутри проверять `is_404()`
- если 404 — pull last URL segment, `get_posts(name=$slug, status=[private,publish])`, lookup в page_unic
- переписать `tests/Integration/RedirectTest.php` под новую семантику
**B.** Зафиксировать текущий scope в README:
> Redirect handles только published clones с собственным slug. Для private-clones (washanyanya-style) — out of scope MVP.
## Сопутствующее
- beads cp-ifg (discovered from cp-83m) — внутренний tracker.
- Тесты `RedirectTest.php` фиксируют текущую (page_new) семантику — менять одновременно с handler'ом.
Fixed in v1.1.0. Redirect::handle() переписан на washanyanya-style: template_redirect@1 + is_404 + reverse-slug lookup через get_posts(name=slug, post_type=page, status=[private,publish]) → match в page_unic → 301 на /{city}/{orig-canonical-path}/.
Fixed in v1.1.0. Redirect::handle() переписан на washanyanya-style: template_redirect@1 + is_404 + reverse-slug lookup через get_posts(name=slug, post_type=page, status=[private,publish]) → match в page_unic → 301 на /{city}/{orig-canonical-path}/.
Release: https://git.netranking.ru/bryzgalov/wp-multi-city/releases/tag/v1.1.0
Commit: 07ed170
Tests: 118 green / 218 assertions.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Симптом
Redirect::handle()вincludes/class-redirect.php(master @ v1.0.1) триггерится только на условии$post->ID === $page_unic[i]['page_new']. Это значит — редирект клон-страницы на канонический/<city>/<orig-slug>/отрабатывает только в edge-кейсе, когда admin вручную опубликовал клон под собственным URL.В production-модели washanyanya (для которой плагин и задумывался) клоны хранятся со статусом
private, собственного публичного URL не имеют. На таких сайтах текущий handler не срабатывает никогда.Текущий код
includes/class-redirect.php:38-69— фильтр по(int)($row['page_new']) === $current_page_id.Что делает washanyanya вместо этого
На
is_404()ищет private-пост по slug через:Дальше матчит
$candidate->IDпротивpage_newв page_unic, находит соответствующийtown, формирует canonical URL и делаетwp_safe_redirect().Возможные решения
A. Переписать
Redirect::handle()на washanyanya-style:template_redirectилиwpпосле resolve queryis_404()get_posts(name=$slug, status=[private,publish]), lookup в page_unictests/Integration/RedirectTest.phpпод новую семантикуB. Зафиксировать текущий scope в README:
Сопутствующее
RedirectTest.phpфиксируют текущую (page_new) семантику — менять одновременно с handler'ом.Fixed in v1.1.0. Redirect::handle() переписан на washanyanya-style: template_redirect@1 + is_404 + reverse-slug lookup через get_posts(name=slug, post_type=page, status=[private,publish]) → match в page_unic → 301 на /{city}/{orig-canonical-path}/.
Release: https://git.netranking.ru/bryzgalov/wp-multi-city/releases/tag/v1.1.0
Commit:
07ed170Tests: 118 green / 218 assertions.