W PHP mamy funkcję, która jest w stanie przyciąć tekst do określonej ilości znaków (nie patrząc na wyrazy) i w razie potrzeby ozdobić trzema kropkami. W WordPressie mamy funkcję, która jest w stanie przyciąć tekst do określonej ilości wyrazów. Nie ma jednak funkcji, która jest w stanie przycinać wyrazy w oparciu o maksymalną ilość znaków – trzeba ją sobie napisać samemu.

Pierwsza rzecz – tworzymy funkcję przyjmującą after i maksimum, zamieniamy tytuł na tablicę wyrazów oraz przygotowujemy tytuł zwracany:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
}

Explode zamienia string na tablicę, tnąc po spacjach, get_the_title pobiera tytuł. Potrzebna nam jeszcze flaga, czy potrzebujemy aftera oraz cnt, ustawione na 0:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
    $cnt = 0;
    $need_after = false;
    //(...)
    return $output_title;
   }

Okej, pora na pętlę while:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
    $cnt = 0;
    $need_after = false;
    while(strlen($output_title) < $maxlength){
        
        $output_title .= $title[$cnt];
        $output_title .= " ";
        $cnt++;
    }
    
    return $output_title;
   }

Pętla funkcjonuje tak długo, jak w output_title nie została przekroczona maksymalna ilość znaków. Do output title dodajemy kolejno elementy tablicy title, spację i zwiększamy cnt.

Oczywiście musimy przygotować się na sytuację, w której maksimum znakowe nie zostało osiągnięte, ale tablica title już się wyczerpała:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
    $cnt = 0;
    $need_after = false;
    while(strlen($output_title) < $maxlength){
        if($cnt >= count($title)){
            break;
        }
        
        $output_title .= $title[$cnt];
        $output_title .= " ";
        $cnt++;
    }
    
    return $output_title;
   }

Jak widać, strlen zwraca długość tekstu, zaś count – długość tablicy. Jeżeli ilość znaków nie została przekroczona, ale po prostu tytuł już wyczerpał się z wyrazów, to kończymy pętlę.

Oczywiście, jest też inna sytuacja – jeszcze limitu nie przekroczyliśmy, ale dodanie kolejnego wyrazu spowoduje przekroczenie limitu:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
    $cnt = 0;
    $need_after = false;
    while(strlen($output_title) < $maxlength){
        if($cnt >= count($title)){
            break;
        }
        if(strlen($output_title . $title[$cnt]) > $maxlength){
            $need_after = true;
            break;
        }
        $output_title .= $title[$cnt];
        $output_title .= " ";
        $cnt++;
    }
    
    return $output_title;
   }

W takim wypadku kończymy pętlę, nie dodajemy wyrazu, który razem z już istniejącym tytułem przekroczy limit znaków. Mamy flagę, możemy zatem dodać aftera:

function shorten_title($after = '...', $maxlength) {
    $title = explode(' ', get_the_title());
    $output_title = '';
    $cnt = 0;
    $need_after = false;
    while(strlen($output_title) < $maxlength){
        if($cnt >= count($title)){
            break;
        }
        if(strlen($output_title . $title[$cnt]) > $maxlength){
            $need_after = true;
            break;
        }
        $output_title .= $title[$cnt];
        $output_title .= " ";
        $cnt++;
    }
    if($need_after) {
        return rtrim($output_title) . $after;
    }
    return $output_title;
   }

Użyliśmy rtrim, ponieważ w momencie, w którym zdecydowaliśmy się na przerwanie pętli (z uwagi na to, że dodanie jeszcze jednego wyrazu przekroczy nasz limit) mieliśmy tam jeszcze spację po poprzednim obrocie pętli.

Rtrim usuwa spację zaś do naszego tytułu doklejamy trzy kropki. W przypadku, gdy to nie jest potrzebne – po prostu zwracamy tytuł.