Nowy dzień, nowe problemy. Jeden z klientów pomimo faktu, że miał w podpowiedzi instrukcję, że powinien uzupełnić linki używając pełnej deklaracji czyli zaczynając od http:// lub https://, postanowił stanowczo ją zignorować. Powstał w ten sposób problem przy wyświetlaniu linków na stronie. Jedne działały a drugie nie. Co gorsza nie było reguły, który z nich ma http a który nie. Ręczna edycja linków na poprawne nie wchodziła w grę. Trzeba było coś dopisać. Dla potomności zostawiam zatem skrypt na blogu:
function add_http($url) { if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { $url = "http://" . $url; } return $url; }
A w js mamy taką przydatną funkcję, gdyby obróbka zmiennej w php była zbyt czasochłonna.
function formatUrl(url) { var httpString = "http://"; var httpsString = "https://"; if (url.substr(0, httpString.length).toLowerCase() !== httpString && url.substr(0, httpsString.length).toLowerCase() !== httpsString) url = httpString + url; return url; }
Przy okazji załatwiliśmy jeszcze jedną rzecz aby klient nie musiał osobno podawać anhor tekstu a był pobierany z linka z jednoczesnym usunięciem http lub https
function remove_http($url) { $disallowed = array('http://', 'https://'); foreach($disallowed as $d) { if(strpos($url, $d) === 0) { return str_replace($d, '', $url); } } return $url; }
A finalnie w kodzie wygląda to tak:
<?php if($website_address = get_field('company__website')) : ?> <li class="web--list"> <?php if($website_icon = get_field('website__icon', 'options')) { echo $website_icon; } echo '<a href="' . add_http($website_address) . '" target="_blank" rel="nofollow">' . remove_http($website_address) . '</a>'; ?> </li> <?php endif; ?>