WordPress : the_content_limit() v.2

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 : (.*?) :D . 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(']]>', ']]&gt;', $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>";
	}
}

5 Comentarii to “WordPress : the_content_limit() v.2”

  1. Dude, WTF? De ce nu-ntrebi, nu de-aia ai YM? :P
    Pentru PHP 5 ai htmlspecialchars_decode(), iar pentru PHP 4 ai html_entity_decode()

  2. Staicu Ionuț-Bogdan

    Dude, WTF? De ce nu-ntrebi, nu de-aia ai YM? :P

    Plm, nu erai online la momentul respectiv. Iar pe cine am întrebat, nu a știut să-mi zică. Deci… :D

  3. ca să fac pe deșteptul @Prima problemă: expresii regulate:))

  4. Staicu Ionuț-Bogdan

    @Rafael, și ce soluție ți se pare ție că am adoptat? Nu regex? :D

  5. Pentru PHP 5 ai htmlspecialchars_decode(), iar pentru PHP 4 ai html_entity_decode()

    Beleaua asta am avut-o si eu la un moment dat. Nu-mi lua queryul ca lumea pt db (aveam caractere speciale in query). L-am encodat / decodat dupa cum am avut nevoie si mi l-a vazut intr-un final glorios cum trebuia :)

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>

windows apple dropbox facebook twitter