⬜️
Как я победил 404 в WordPress, когда CPT и страницы живут в одной url вложенности ⬜️
Недавно столкнулся с довольно интересной ситуацией у букмекеров:
нужно было, чтобы существовали URL вида
/bookmaker-rating/1xbet/ ← страница букмекера (CPT)
/bookmaker-rating/about-rating/ ← обычная страница
А WordPress, конечно, говорит: «нет».
Потому что у кастомного пост-типа bookmaker стоит rewrite['slug'] = 'bookmaker-rating',
и он считает, что всё под этим путём — это букмекеры.
Страницы просто не доходят до роута и отлетают 404.
❌ Суть бага:
WP не умеет на одном уровне различать CPT и page.
Если слаг у пост-типа совпадает с директорией страниц, одна из сущностей «съедается».
✅ Решение:
Добавил фильтр request, который проверяет, существует ли букмекер с таким slug.
Если да — отдаёт его.
Если нет — считает, что это страница.
Плюс добавил собственное правило для /bookmaker-rating/.
Вот код:
add_filter('request', function ($query_vars) {
if (isset($query_vars['pagename']) && strpos($query_vars['pagename'], 'bookmaker-rating/') === 0) {
$slug = explode('/', $query_vars['pagename'])[1] ?? null;
if ($slug && get_page_by_path($slug, OBJECT, 'bookmaker')) {
$query_vars = [
'post_type' => 'bookmaker',
'name' => $slug,
];
} else {
$query_vars['pagename'] = 'bookmaker-rating/' . $slug;
}
}
return $query_vars;
});
add_action('init', function () {
add_rewrite_rule(
'^bookmaker-rating/([^/]+)/?$',
'index.php?pagename=bookmaker-rating/$matches[1]',
'top'
);
});📌 Если статья была полезна, то буду рад, если вы поделитесь ей с друзьями разработчиками.
➡️ Ставьте реакции, если было полезно. Тогда я пойму, что такие темы интересны и посты будут выходить чаще.
OlegTix | #wordpress #php