Як видалити спеціальні символи з постійних посилань
Щоразу, коли ви працюєте з WordPress і сторонніми API, завжди є шанс, що ви зіткнетеся з проблемами, коли сторонній API не готовий обробляти певні символи, які існують у постійному посиланні.
Однак, залежно від налаштувань постійного посилання, це може бути чи ні. Наприклад, ви можете встановити постійні посилання на щось на зразок ?p=123 для кожної публікації. У такому випадку це не велика проблема.
Але якщо ви використовуєте «красиві постійні посилання», і ваше постійне посилання містить щось на кшталт символу торгової марки чи авторського права, це може спричинити проблеми щоразу, коли ви спілкуєтесь із зазначеним стороннім API.
По-перше, якщо ви використовуєте красиві постійні посилання, вони зазвичай створюються з заголовка публікації. Отже, якщо ви використовуєте щось на зразок All About The Acme Machine™, буде створено постійне посилання, яке містить щось подібне.
Наприклад, WordPress може автоматично генерувати щось на зразок цього: https://acme.com/all-about-the-acme®-machine/
І коли прийде час надіслати цю інформацію до стороннього API (або спробувати обробити її за допомогою чогось, що не підготовлено для таких символів), тоді ви зіткнетеся з проблемами.
На щастя, WordPress надає хук, який дозволяє нам обробляти постійні посилання до того, як вони будуть серіалізовані в базу даних. А саме, це хук wp_insert_post_data.
І в цьому випадку це працює так:
- Налаштуйте підключення на пізній етап процесу серіалізації,
- Шукайте символів, які можуть бути проблемними,
- Замініть їх порожнім рядком,
- Поверніть оновлену інформацію до WordPress для серіалізації.
Ось приклад видалення різних символів, таких як символи авторського права, символи торгових марок, символи реєстрації та інші їх варіанти як у закодованих форматах, так і в закодованих еквівалентах:
<?php
add_action('wp_insert_post_data', __NAMESPACE__. 'processPermalink');
/**
* Processes the permalink so we can remove any characters that may cause a problem when communicating
* with the API.
*
* @param array $data The array of information about the post.
* @return array $data The data without the malformed information in the post name for the URL.
*/
public function processPermalink($data)
{
if (!in_array($data['post_status'], array('draft', 'pending', 'auto-draft'))) {
$data['post_name'] =
preg_replace(
'/(%ef%b8%8f|™|®|©|™|®|©|™|®|©)/',
'',
$data['post_name']
);
}
return $data;
}
Зауважте, що функція приймає дані допису як аргумент, перевіряє, чи ви не працюєте з чернеткою, статтею, що очікує на розгляд, або автоматичною чернеткою, а потім видаляє вміст у назві допису за допомогою
Це може бути тонка проблема. Тобто, можливо, ви не зустрінете його у своїх зусиллях щодо розробки. З іншого боку, якщо ви це зробите, це надасть рішення, яке не тільки дозволить вам видалити певні символи з URL-адреси, але й дозволить вам зробити це в масштабованій.
Отже, коли ваші потреби зміняться, ви можете просто оновити виклик preg_replace символами, які потрібно видалити з вашої URL-адреси.