Как заменить пробелы на дефис и обратно?
Есть страница с определенным щаблоном.
На этой странице, в зависимости от get параметров, по api приходят такие данные:
vendor = "MERCEDES BENZ"
model = "C CLASS ALL-TERRAIN"
Т.е. урл выглядит так:
/auc-online/?vendor=MERCEDES BENZ&model=C CLASS ALL-TERRAIN
Чтоб сделать нормальный урл, я через add_rewrite_rule, делаю нужную мне струткуру, в итоге получается:
add_rewrite_rule('^(auc-online)/([^/]+)/([^/]+)/?', 'index.php?pagename=$matches[1]&vendor=$matches[2]&model=$matches[3]', 'top'); |
add_rewrite_rule('^(auc-online)/([^/]+)/([^/]+)/?', 'index.php?pagename=$matches[1]&vendor=$matches[2]&model=$matches[3]', 'top');
/auc-online/mercedes benz/c class all-terrain/
Теперь нужно избавиться от пробелов, чтоб урл выглядел так:
/auc-online/mercedes-benz/c-class-all-terrain/
Я делаю как-то так:
str_replace(' ', '- ', $string)
Всё работает, но тогда менются get параметры, а они мне нужны для запроса к api. Т.е. мне нужно преобразовать всё в обратном порядке, заменить дефисы на пробелы. Но если я заменю все дефисы, то производители и модели которые имели изначально дефис в своем имени я не смогу получить. Т.е. мне нужно заменить только те дефисы которых небыло изначально.
Я сделал немного по другому. Сначала меняю пробелы на ‐ Вот так:
str_replace(' ', '‐', $string);
Затем делаю всё наоборот:
str_replace('%E2%80%90', ' ', $string);
И в целом это работает, в браузере урл отображается как положено. Но если скопировать такой урл, то выглядит он естественно со всеми этими символами:
/auc-online/mercedes%E2%80%90benz/c%E2%80%90class%E2%80%90all-terrain/
Можно что-то с этим сделать?
Дополнительно:
Я делаю как-то так:
str_replace(' ', '- ', $string)
а нужно просто обработать функцией urlencode
Вот я пропустил get параметры через urlencode. Получил:
/auc-online/mercedes+benz/c+class+all-terrain/
Но мне ведь нужно чтоб были дефисы вмест плюсов.
Ответы:
Заменяйте пробел на плюс
Причем лучше это делать не косолапыми ручками, а через urlencode() каждого отдельного параметра
- Мне нужно что урл выглядел именно так:
/auc-online/mercedes-benz/c-class-all-terrain/ - С капризами - это в ресторан, или там в сауну с девочками.
А здесь веб, и вместо капризов у нас стандарты.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В URL лучше не делать ручную замену пробелов через простой
str_replace(). Для WordPress есть готовая функцияsanitize_title(): она приводит строку к безопасному slug, заменяет пробелы на дефисы, убирает лишние символы и нормально работает с кириллицей/латиницей. Для обратного преобразования “slug → человекочитаемое значение” нужно хранить исходное значение или искать по нормализованному варианту в списке данных.Для Вашего случая логика такая: входные значения от API приводите к slug для URL, а при обработке rewrite обратно сопоставляете slug с оригинальным vendor/model из справочника. Не пытайтесь гарантированно восстановить
MERCEDES BENZизmercedes-benzтолько заменой дефисов на пробелы: в реальных данных бывают дефисы, двойные пробелы, спецсимволы и разные написания.$vendor = 'MERCEDES BENZ'; $model = 'C CLASS ALL-TERRAIN'; $vendor_slug = sanitize_title($vendor); // mercedes-benz $model_slug = sanitize_title($model); // c-class-all-terrain $url = home_url('/auc-online/' . $vendor_slug . '/' . $model_slug . '/');
Rewrite-правило можно оставить примерно таким:
add_action('init', function () { add_rewrite_rule( '^auc-online/([^/]+)/([^/]+)/?$', 'index.php?pagename=auc-online&vendor=$matches[1]&model=$matches[2]', 'top' ); });
Дальше в шаблоне берёте query var и ищете нужную запись в массиве/таблице API. Для “обратно” можно использовать
str_replace('-', ' ', $slug)только как запасной вариант для вывода, но не как точную бизнес-логику. Надёжнее хранить паруoriginal_nameиslugв кэше или таблице.