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>";
	}
}

Rezolvare „ruby: no such file to load — ubygems (LoadError)”

Una din marile probleme ale lui E-texteditor este că are prea multe probleme. Iar problemele se înmulțesc cu fiecare versiune nouă :| Dar cum încă nu am găsit niciun editor comparabil la funcționalitate cu E-texteditor, încă am rămas cu el.

Eh, și una din problemele apărute la ultima versiune este eroarea ruby: no such file to load — ubygems (LoadError). Când apare? Când încerci să folosești bundles ceva mai complicate (cum ar fi „insert close tag” sau „Insert open/close tag”), îți trântește minunăția de eroare. Și evident, te enervezi. Și cauți o rezolvare…

Rezolvare

Întâi de toate, fă update la Cygwin (ultima versiune este 1.7.x)

Apoi apasă Win+R și scrie:

C:\cygwin\Cygwin.bat

Descarci și dezarhivezi ultima versiune de ruby gems după care te duci în directorul unde ai dezarhivat și scrii:

ruby setup.rb install

Se intalează gem și… cam asta e. Dă un restart la E (dacă e deschis) și ar trebui să meargă.

Editare FOARTE târzie

Dacă problema persistă, apasă win+pause -> advanced system settings -> Environment Variables -> New system variable -> și adaugă variabila CYGWIN și valoarea nodosfilewarning.

Wordpress + Video = Love

Un feature nou apărut în Wordpress 2.9 este suportul oEmbed. Long story short, poți adăuga filme de pe diverse platforme video (youtube, vimeo, blip etc) prin simpla scriere a url-ului pe un singur rând. Asta te scutește de multe bătăi de cap și, să-ți spun drept, cred că trebuia să fie introdus în WP 1.0. Pentru că, fără un plugin adecvat, un neștiutor n-ar fi avut șanse prea mari să publice un video (html view -> paste).

În fine, treaba e bună, implementarea la fel.

Problema

Problema mea este că filmele de pe youtube – fie cele „băgate” cu oEmebed, fie cele „băgate” cu codul de pe youtube – deschid o pagină nouă când faci click pe ele. O a doua problemă (de această dată doar la filmele introduse prin metoda clasică – copy/paste) este că filmele au anumite dimensiuni standard, iar o redimensionare (ex. cât tot blogul) înseamnă calcule. Și cum nimănui nu-i plac calculele (sau cel puțin mie nu-mi plac!), iată o soluție :)

O a doua problemă o reprezintă filmele self-hosted. Adică ai un fișier .flv și vrei să-l pui pe blog. Cum faci?

Soluția

Soluția la aceste probleme am găsit-o (de voie, de nevoie) la ultima temă de Wordpress codată și se numește JW Player. Cum se implementează?
Read the rest of this entry »