M-am lovit azi de două probleme destul de aiurea cu Wordpress-ul unui client. Se cereau următoarele: afișarea unui număr de caractere în excerpt în funcție de lungimea titlului.
Prima problemă
Prima problemă a fost detectarea corectă a numărului de caractere dintr-un titlu. Cum un titlu putea avea — în el (care este afișat ca „—”) sau alte caractere HTML, un simplu strlen nu ar fi fost prea exact. Prin urmare, a trebuit să fac următoarea chestie:
$lungimeTitlu = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', get_the_title()));
Cum regex nu sunt pasiunea mea cea mai mare, codul l-am furat de aici.
A doua problemă
A doua problemă a fost cu the_content_limit() (care este o versiune ușor modificată a acestui script). Long story short, această funcție îți permite ceea ce the_excerpt() din Wordpress ar fi trebuit să știe implicit: să limiteze numărul de caractere fără prea mari bătăi de cap.
Eh, dar există o bătaie de cap. Și încă una care m-a bătut rău de tot: unele posturi aveau și imagini atașate (attachments). Iar această funcție se cam bâlbâia în momentul în care făcea strip_tags: îmi insera în excerpt și textul de la imaginea din attachment. Mi-am dat seama de asta deoarece avea imaginea avea fix același text care era și în titlu. Și după vreo zece minute de wtf și scărpinat în cap mi-am dat seama care era problema.
Prin urmare, am pornit RegexBuddy (btw, e super tare aplicația!) și am început să mă joc cu singurul selector pe care îl știu : (.*?)
. Până am reușit să fac match la div-ul buclucaș. După un preg_replace aplicat strategic, totul a mers ca pe roate.
function the_content_limit($max_char, $more_link_text = ' …', $stripteaser = 0, $more_file = '') {
$pattern = '!<div(.*?)class="wp-caption(.*?)"(.*?)</div>!';
$content = get_the_content($more_link_text, $stripteaser, $more_file);
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
$content = preg_replace($pattern,'', $content);
$content = strip_tags($content);
if (strlen($_GET['p']) > 0) {
echo "<p>" . $content ."</p>";
} else if ((strlen($content)>$max_char) && ($espacio = strpos($content, " ", $max_char ))) {
$content = substr($content, 0, $espacio);
$content = $content;
echo "<p>" . $content . $more_link_text ."</p>";
} else {
echo "<p>" . $content ."</p>";
}
}
- Posted in:
- Tips & Tricks,
- Wordpress
