Ηθελε ένας συμφορουμίτης στο freestuff.gr που είμαι μέλος να προσθέσει ένα custom widget για να παίρνει κάποια στατιστικά από ένα άλλο plugin (GD Star Rating) που είχε εγκαταστήσει, και έψαχνε για κάποιον να του φτιάξει ένα νέο plugin που να μπορεί να διαβάσει τα στοιχεία από το υπάρχον και να τα εμφανίζει με κάποιον custom τρόπο που ήθελε.
Το να κάτσεις να κάνεις ένα νέο plugin που να βγαίνει στη sidebar του wordpress blog σαν widget είναι αρκετή δουλειά και έχει και αρκετή χαμαλοδουλειά πέρα από τις λίγες απαιτήσεις γνώσεων που έχει για php και mysql.
Ο πιο εύκολος τρόπος να γλυτώσεις τη χαμαλοδουλειά είναι να εκμεταλλευτείς έτοιμα plugins που έχουν φτιάξει άλλοι. Για μένα ένα από τα πιο χρήσιμα που υπάρχουν είναι το Exec-PHP plugin for WordPress που σου επιτρέπει να βάλεις ένα widget, και να εκτελέσεις php κώδικα. Οτι php κώδικα σου επιτρέπει ο server στον οποίο φιλοξενείς το site σου.
Το συγκεκριμένο πρόβλημα (που αναφέρεται στο βοήθεια στην δημιουργία δύσκολου widget), σε ένα δοκιμαστικό blog που έστησα στα πρόχειρα, λύθηκε ώς εξής:
Κατεβάζεις και εγκαθιστάς (αν δεν το έχεις φυσικά) το GD Star Rating plugin, εγκαθιστάς και το Exec-PHP plugin for WordPress, τα ενεργοποιείς και τα δύο, βάζεις το Text widget στη sidebar, του δίνεις ένα τίτλο και είναι σχεδόν έτοιμο. Το μόνο που του λείπει είναι ο κώδικας για να φέρνει τα δεδομένα που θα τον βάλουμε στο πλαίσιο για το κείμενο.
Για να φέρει τα δεδομένα πρέπει πρώτα να σκάψουμε λίγο στη mysql να δούμε ποιούς πίνακες χρειαζόμαστε. Στη βάση που δημιουργήθηκε κατά την εγκατάσταση του δοκιμαστικού μου blog υπάρχουν οι πίνακες wp_comments που κρατάει τα σχόλια και wp_gdsr_votes_log που κρατάει τις ψήφους. Οπότε το mysql query που θα μας φέρει τα δεδομένα γίνεται:
SELECT comment_author, SUM(vote) score FROM wp_comments INNER JOIN wp_gdsr_votes_log ON (wp_comments.comment_ID=wp_gdsr_votes_log.id) WHERE vote_type='cmmthumb' GROUP BY comment_author_email ORDER BY score DESC, comment_author ASC;
Αρκεί λοιπόν να γράψουμε λίγο κλασσικό php κώδικα που να εκτελεί στη mysql αυτό το query και να εμφανίζουμε τα δεδομένα. Ενα πολύ απλό παράδειγμα πως μπορεί να γίνει αυτό βρίσκεται στο manual της php για το mysql_fetch_row.
Λίγη html μορφοποίηση ώστε να εμφανίζονται τα αποτελέσματα τώρα σε έναν πίνακα είναι αρκετό για να έχουμε ένα αρχικό εμφανίσιμο αποτέλεσμα.
Για να μην είμαστε εκτός πνεύματος του wordpress, είναι πιο μουράτο να μην χρησιμοποιήσουμε απλή php αλλά να αξιοποιήσουμε τις functions που μας δίνει το ίδιο το wordpress. Χρησιμοποιούμε λοιπόν την get_results για να πάρουμε όλες τις εγγραφές σε έναν πίνακα.
Ο τελικός κώδικας θα γίνει τώρα ώς εξής:
<?php //Quick 'n' Dirty Votes Rating function QnD_votesRating($tbl1, $tbl2) { global $wpdb; $query = "SELECT comment_author, SUM(vote) score FROM $tbl1 INNER JOIN $tbl2 ON ($tbl1.comment_ID=$tbl2.id) WHERE vote_type='cmmthumb' GROUP BY comment_author_email ORDER BY score DESC, comment_author ASC;"; $rset = $wpdb->get_results($query); $recs = count($rset); $ret = ''; if ($recs > 0) { $ret .= '<table width='100%'><tr><th># </th>'. '<th align='left'>Name</th><th>Score</th></tr>'; for ($i = 0; $i < $recs; $i++ ) { $ret .= sprintf("<tr><td>%d</td><td>%s</td><td align='right'>%d</td></tr>", $i+1, htmlspecialchars($rset[$i]->comment_author, ENT_COMPAT), intval($rset[$i]->score) ); } $ret .= '</table>'; } return $ret; } global $table_prefix; echo QnD_votesRating( $table_prefix.'comments', //(wp_comments) Your comments table $table_prefix.'gdsr_votes_log' //(wp_gdsr_votes_log) Your votes table ); ?>
Πλέον το μόνο που μένει είναι να αντιγράψουμε τον κώδικα αυτό μέσα στο πλαίσιο για το κείμενο, αποθηκεύουμε την τροποποίηση και το απολαμβάνουμε.
Ο πρώτος έλεγχος που πρέπει να γίνει αν δεν δουλέψει αμέσως ο κώδικας είναι αν τα ονόματα των πινάκων είναι wp_comments και wp_gdsr_votes_log. Το πρόθεμα wp_ είναι το προεπιλεγμένο κατά την εγκατάσταση του wordpress, αλλά διάφορα άλλα plugins μπορούν να το αλλάξουν. Αν δεν χρησιμοποιείται κάποιο κακοφτιαγμένο plugin για τη μετονομασία, τότε θα έχουν γίνει όλες οι απαιτούμενες τροποποιήσεις αυτόματα. Αλλιώς πάμε στον φάκελο που έχει εγκατασταθεί το wordpress, βρίσκουμε στο αρχείο wp-config.php τη γραμμή:
$table_prefix = 'wp_';
η οποία μας δείχνει ποιό πρέπει να είναι το πρόθεμα των ονομάτων των πινάκων στη βάση μας και ελέγχουμε ότι είναι αυτό που χρησιμοποιείται και από τη βάση μας.
Μετά από μια πολύ σωστή παρατήρηση στο σχετικό forum, δεν θα εμφανίζεται το e-Mail αλλά το όνομα του χρήστη.