Zilele trecute am vrut sa cumulez numarul de comentarii de pe un blog cu cele de pe Facebook. Facebook pune la dispozitie utilizatorilor un plugin pentru oricine vrea o sectiune de comentarii pe site-ul lui. Prin intermediul acestui plugin pot lasa comentarii doar utilizatorii care au un cont pe Facebook si sunt autentificati in acel moment.
Acest plugin pus la dispozitie de Facebook este foarte usor de implementat. Pe blog-ul cu pricina sunt doua tipuri de comentarii, cele default de la WordPress si pluginul de la Facebook. Asa a vrut omul, asa i-am facut. Apoi am vrut sa cumulez numarul de comentarii pentru a-l afisa in diferite zone pe blog. Am cautat un plugin care sa-mi usureze munca, dar n-am gasit nimic simplu si concret. Unele plugin-uri de WordPress ma fortau sa creez o aplicatie pe Facebook la care se autentifica si extrag numarul de comentarii.. o chestiune destul de stupida si inutila.
Facebook pune la dispozitie mai multe modalitati de a extrage si afisa numarul de comentarii de pe o pagina. Solutia cea mai buna a fost sa citesc un fisier JSON care contine cateva informatii printre care si numarul de comentarii de la pagina cu pricina. In tabela wp-posts din baza de date am creat un camp nou fb_comment_count, am facut un script simplu in PHP pe care il rulez periodic (cronjob) si imi actualizeaza numarul de comentarii la fiecare post.
<?php
/**
* includ fisierul cu datele de autentificare la baza de date si ma conectez
*/
include $_SERVER['DOCUMENT_ROOT'] . '/wp-config.php';
$db_connect = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) OR die('Nu ma pot conecta la baza de date!');
$db = mysql_select_db(DB_NAME) OR die('Nu ma pot conecta la baza de date "'.DB_NAME.'"!');
mysql_query("SET NAMES 'utf8'") or die(mysql_error());
mysql_query("SET CHARACTER SET 'utf8'") or die(mysql_error());
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'") or die(mysql_error());
/**
* extrag un post care permite adaugarea de comentarii si este public
*/
$sql = mysql_query("SELECT ID, post_name
FROM wp_posts
WHERE post_status = 'publish'
AND comment_status = 'open'
AND post_type = 'post'
LIMIT 1");
$rand = mysql_fetch_object($sql);
/**
* parsez fisierul JSON de pe facebook si actualizez campul din tabela wp-posts cu numarul de comentarii
*/
$fb = json_decode(file_get_contents('https://graph.facebook.com/?ids=http://www.ddumi.ro/' . $rand->post_name));
$fb_comments = ($fb->comments) ? $fb->comments : 0;
mysql_query("UPDATE wp_posts
SET fb_comment_count = '$fb_comments'
WHERE ID = '$rand->ID'
LIMIT 1");
unset($fb);
Pentru afisarea numarului de comentarii pe blog adun valorile celor doua campuri din tabela wp-posts, respectiv comment_count si fb_comment_count.
<?php
/**
* numarul de comentarii
*/
global $wpdb;
$wpdb->query($wpdb->prepare("SELECT fb_comment_count
FROM $wpdb->posts
WHERE ID = '$post->ID'
LIMIT 1"));
$comment_count = get_comments_number() + $wpdb->last_result['0']->fb_comment_count;
Stiu ca sunt modalitati mai bune probabil si script-ul poate fi optimizat, dar este o solutie rapida si la indemana de a rezolva problema. Simplu, asa-i?
multumesc pentru tip-uri, degeaba n-am specificat ca nu este cea mai buna metoda la sfarsitul post-ului 😀
1. din obisnuinta pun ghilimelele, stiu ca puteam folosi functia sprintf
2. stiu ca nu este o scuza buna, dar tot din obisnuitan am folosit ghilimelele.. trebuie sa fac ceva in privinta asta :d
3. stiu ca pot folosi WordPress pentru cron-uri, asta a fost prima idee venita pe moment..
Două chestii:
1) $wpdb->query($wpdb->prepare(“SELECT fb_comment_count FROM $wpdb->posts WHERE ID=’$post->ID’ LIMIT 1”));
Prima chestie este că datele de tip INT nu au nevoie de ghilimele simple. A doua chestie este că poți folosi o formatare ceva mai smart, în genul sprintf. Astfel, codul devine:
$wpdb->query($wpdb->prepare(“SELECT fb_comment_count FROM $wpdb->posts WHERE ID=%d LIMIT 1”, $post->ID));
codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks
2) $comment_count = get_comments_number() + $wpdb->last_result[‘0’]->fb_comment_count;
Indexul unui array returnat de wpdb este de tip INT, nu string, deci iar nu ai nevoie de ghilimele.
3) (bonus): scriptul pentru cron îl puteai face ca plugin WP (evitând astfel mysql_query, folosind API din WP pentru a face interogări & request-uri remote). Bonus, WP are un fel de cron built in 🙂