Un plugin WP pentru feed-uri


Anul trecut vă propuneam să scrieţi primul plugin WordPress. Dat fiind că ultimele săptămâni au însemnat pentru mine scufundarea adânc în lumea pluginurilor WP m-am gândit să mai revin cu mici materiale. Vă invit să vedem astăzi cum putem programa împreună – eu scriu, Dvs vă gândiţi şi îmi şoptiţi – un plugin care să modifice fluxul RSS. Ne propunem ca feed-ul să se încheie cu indicarea categoriei de care aparţine respectivul articol, respectiv cu o notiţă de copyright. Dacă ne uităm la feed cu Internet Explorer 7 vedem că… nu vedem clar indicată categoria (chiar şi dacă ar fi captura mai mare… categoriile apar doar la filtru în boxa din dreapta).

img24

Alte cititoare RSS (precum FeedReader) afişează categoria ceva mai vizibil.

img26

Dar noi vrem să apară lângă text (sub text mai exact). OK. Să trecem la lucru! Trebuie să intervenim pe feed. Aici apare prima mare păcăleală. Ne uităm în la pagina Plugin API/Filter Reference şi vom găsi the_content_rss, filtrul asupra căruia ar trebui să acţionăm. Marea surpriză este că… nu face nimic. Explicaţia o găsim doar dacă săpăm printre paginile WordPress, unde vom vedea, în fişierul feed-rss2.php din directorul wp-includes, că – dintr-o greşeală – WP foloseşte the_content pentru afişarea feed-ului. Eroarea durează de ceva vreme dar cu siguranţă într-una din versiunile următoare va fi remediată. Am învăţat însă prima lecţie: WordPress nu este perfect, dar o soluţie se poate găsi aproape întotdeauna. OK. Deci vom folosi the_content. De fapt dacă ne uităm în fişierul feed-rss2.php vedem că WP foloseşte the_content pentru publicare atunci când feed-ul este integral, şi the_excerpt_rss când feed-ul este parţial (normal ar fi fost the_content_rss şi the_excerpt_rss). Bun. Presupunem că folosim feed integral. Trebuie deci să adăugăm o notiţă de copyright. Rezolvăm rapid cu următorul cod.

<?php
/**
  Plugin Name: schimbaFeed
  Author: Radu Capan
  Author URI: http://www.capan.ro/
  Plugin URI: http://www.cnet.ro/
  Description: Doar demonstrativ.
  Version: 0.1
*/

add_filter(’the_content’, ’schimbaContinut’);

function schimbaContinut($content){
  if(is_feed()){
    $content .= "<p>&copy; 2007 Acesta este feed-ul meu";
    $content .= " şi copierea informaţiilor este strict interzisă de mine!</p>";
  }
  return $content;
}
?>

O scurtă traducere. Cu funcţia add_filter spunem ca să aplice conţinutului (the_content) funcţia schimbaContinut. Aceasta din urmă verifică dacă respectivul conţinut este cerut pe feed (cu funcţia is_feed) şi dacă da îi adaugă la final notiţa de copyright. Vedem mai jos:

img27

Dar dacă feed-ul nu este integral? Atunci trebuie să intervenim pe the_excerpt_rss. Putem şti cum este configurat blogul? Dacă studiem documentaţia nu vom găsi. Am învăţat a doua lecţie: WordPress nu are o documentaţie exhaustivă (e mare, dar nu exhaustivă), ceea ce uneori poate fi trist. Dar nu acum! Ca să aflăm cum îi spune parametrului cu pricina mergem în back-end la secţiunea Opţiuni, Citire unde sunt opţiunile pentru feed (Tot textul sau Rezumatul). Dacă ne uităm în sursa paginii vom vedea că respectivul control radio are numele rss_use_excerpt (reţineţi metoda: astfel puteţi afla numele la alte opţiuni nedocumentate încă de WordPress!!!). Aţi ghicit deja:

get_option(’rss_use_excerpt’)

returnează 1 dacă se foloseşte doar un fragment, 0 dacă este articolul integral. Deja lucrurile se schimbă! Ştim când şi unde să intervenim. Redau doar partea de cod, fără comentariul de început şi tagurile de încadrare PHP.

define("TEXTDECOPYRIGHT","<p>&copy; 2007 Acesta este feed-ul meu, meu, meu!!!</p>");

add_filter(’the_excerpt_rss’, ’schimbaFlux’);
add_filter(’the_content’, ’schimbaContinut’);

function schimbaFlux($content){
  if(get_option(’rss_use_excerpt’))
    $content .= TEXTDECOPYRIGHT;
  return $content;
}

function schimbaContinut($content){
  if(is_feed() && !get_option(’rss_use_excerpt’))
    $content .= TEXTDECOPYRIGHT;
  return $content;
}

Ce am făcut? Am scris practic un cod mai solid, care va funcţiona fie că respectivul blog foloseşte fluxul integral, fie că foloseşte doar fragmente. Atunci când WP va corecta eroarea, luând conţinutul integral de pe the_content_rss, cele două funcţii vor putea fi practic identice (adică una singură în loc de două). Buuuun. Da, v-aţi amintit de categorii. Aici problema se complică puţin. WordPress nu pune la dispoziţie o funcţie pentru a afla ID-ul articolului curent, dar evident că există o soluţie dintr-un pas. Vom folosi wp_query pus la dispoziţie de WP. Dar să vedem codul integral:

<?php
/**
  Plugin Name: schimbaFeed
  Author: Radu Capan
  Author URI: http://www.capan.ro/
  Plugin URI: http://www.cnet.ro/
  Description: Doar demonstrativ.
  Version: 0.3
*/

define("TEXTDECOPYRIGHT","<p>&copy; 2007 Acesta este feed-ul meu, meu, meu!!!</p>");

add_filter(’the_excerpt_rss’, ’schimbaFlux’);
add_filter(’the_content’, ’schimbaContinut’);

function schimbaGeneric($content){
  global $wp_query, $wpdb;
  $id = $wp_query->post->ID;
  $rezs = $wpdb->get_results("SELECT cat_id,cat_name 
    FROM wp_posts,wp_post2cat,wp_categories
    WHERE (id=’".$id."’) AND (id=post_id) AND (category_id=cat_id)");
  $cate = count($rezs);
  if($cate == 1)
    foreach ($rezs as $rez)
      $content .= "<p>La categoria: <a href=".get_category_link($rez->cat_id).">".$rez->cat_name."</a></p>";
  else {
    $content .= "<p>La categoriile: ";
    $i = 0;
    foreach ($rezs as $rez){
      $content .= "<a href=".get_category_link($rez->cat_id).">".$rez->cat_name."</a>";
      $i++;
      if($i < $cate)
        $content .= ", ";
    }
    $content .= "</p>";
  }
  $content .= TEXTDECOPYRIGHT;
  return $content;
}

function schimbaFlux($content){
  if(get_option(’rss_use_excerpt’))
    $content = schimbaGeneric($content);
  return $content;
}

function schimbaContinut($content){
  if(is_feed() && !get_option(’rss_use_excerpt’))
    $content = schimbaGeneric($content);
  return $content;
}
?>

Am declarat două variabile globale. Prima ne ajută să obţinem ID-ul articolului curent. A doua ne permite interogări MySQL. Codul pare complicat dar în fapt: interoghez baza de date pentru a afla de ce categorii aparţine articolul $id. Apoi număr rezultatele în $cate. Dacă este un rezultat, scriu "La categoria" şi apoi afişez link-ul categoriei din id-ul categoriei pe numele categoriei. Dacă avem mai mult de un rezultat atunci am grijă să scriu "La categoriile" şi în plus să afişez categoriile una câte una, cu virgulă şi spaţiu între ele, mai puţin după ultima. Atât!

img28

Tocmai am obţinut un plugin generic ce ne permite să afişăm după articol (fie el integral sau pe scurt) categoriile de care ţine, plus o notiţă de copyright (vezi mai sus). A fost o ocazie să vedem cum se scrie un plugin mai complex, să conştientizăm că documentaţia WP nu este nici perfectă şi nici completă, dar soluţii se găsesc. Dacă aveţi de gând să lansaţi pentru publicul larg un (astfel de) plugin reţineţi: la fiecare nouă versiune WordPress trebuie să verificaţi dacă mai este funcţional. Codul pe care l-am scri mai sus va trebui modificat atunci când autorii WP vor pune capăt confuziei the_content / the_content_rss. A treia şi ultima lecţie deci: dacă daţi publicului un plugin WP aveţi datoria să îl monitorizaţi şi actualizaţi. Din fericire upgrade-urile WP nu sunt întotdeauna radicale, astfel că un plugin poate rămâne luni, ori chiar ani, valabil. Succes!


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (Neevaluat încă)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *