Я создал веб-сайт wordpress, который динамически отображает один из примерно 400 тысяч продуктов, передавая 2 переменных запроса на страницу WP, на которой есть мой собственный шаблон php. Я использую WPML для перевода своих страниц, и я включил опцию сохранения URL-переменных _brand и _sku. Все отлично работает с этой настройкой (отображает страницы и заголовок состояния 200 ok). Переключатель языка также сохраняет переменные моих запросов.
URL-адрес выглядит так: domain.com/en/products/?_brand=JCB&_sku=01%2F117903
однако, поскольку я хочу, чтобы URL-адрес отображался как domain.com/en/products/a-brand/a-sku, я добавил следующие правила перезаписи в файл functions.php моего ребенка.
function rewrite_products()
{
//en
add_rewrite_rule('^products/([^&]+)/([^&]+)', 'index.php?page_id=93837&_brand=$matches[1]&_sku=$matches[2]', 'top');
//nl
add_rewrite_rule('^producten/([^&]+)/([^&]+)', 'index.php?page_id=93871&_brand=$matches[1]&_sku=$matches[2]', 'top');
//fr
add_rewrite_rule('^produits/([^&]+)/([^&]+)', 'index.php?page_id=93875&_brand=$matches[1]&_sku=$matches[2]', 'top');
//de
add_rewrite_rule('^produkte/([^&]+)/([^&]+)', 'index.php?page_id=93876&_brand=$matches[1]&_sku=$matches[2]', 'top');
//es
add_rewrite_rule('^productos/([^&]+)/([^&]+)', 'index.php?page_id=93877&_brand=$matches[1]&_sku=$matches[2]', 'top');
}
add_action('init', 'rewrite_products');
function rewrite_product_tags()
{
add_rewrite_tag('%_brand%', '([^&]+)');
add_rewrite_tag('%_sku%', '([^&]+)');
}
add_action('init', 'rewrite_product_tags', 10, 0);
Теперь я могу перейти по нужному URL-адресу и получить ту же страницу с правильным продуктом, однако заголовок теперь показывает 404 в качестве статуса.
Переключатель языка WPML также отбрасывает переменные моего запроса и просто перенаправляет /products/a-brand/a-sku, например, на /producten (перевод /products).
но самое главное, статус заголовка 404 не позволяет мне индексировать мои страницы, которые я выгрузил в карту сайта (около 2 миллионов URL-адресов), поскольку Google считает, что URL-адреса являются 404-ми, и не индексирует их. Напротив, это огромная проблема.
Я свел это к следующей проблеме:
настройка заголовка в шаблоне не работает. Мое регулярное выражение неверно? любая помощь приветствуется!
Я предполагаю, что ошибка была связана с ядром WordPress или где-то в моей родительской теме. В любом случае, я так и не нашел решения, только обходной путь для замены %2F на !2F при кодировании строк.
//Custom encoding en decoding to stop %2F 404 headers
function url_decode($encoded)
{
$encoded = str_replace('!2F', '%2F', $encoded);
$part_url = urldecode($encoded);
return $part_url;
}
function url_encode($part_url)
{
$encoded = rawurlencode($part_url);
$encoded = str_replace('%2F', '!2F', $encoded);
return $encoded;
}