Redirect handler covers only published clones, не работает на private (washanyanya-style) #1

Closed
opened 2026-05-18 21:34:27 +05:00 by bryzgalov · 1 comment
Owner

Симптом

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 через:

$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'ом.
## Симптом `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'ом.
Author
Owner

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.

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.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bryzgalov/wp-multi-city#1