Как заменить пробелы на дефис и обратно?

Ссылка скопирована
1 ответ

Есть страница с определенным щаблоном.

На этой странице, в зависимости от 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/
    • С капризами - это в ресторан, или там в сауну с девочками.
      А здесь веб, и вместо капризов у нас стандарты.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    В 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 . '/');

    $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'
        );
    });

    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 в кэше или таблице.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно