Κάθε νέο άρθρο γίνεται αυτόματα συζήτηση στο forum, και οι απαντήσεις των μελών εμφανίζονται κάτω από το άρθρο, μαζί με τα σχόλια των επισκεπτών. Χωρίς να “δέσουμε” τα δύο συστήματα μεταξύ τους.
Όσο λιγότερα δικαιώματα έχει το ένα σύστημα πάνω στο άλλο, τόσο μικρότερη η ζημιά αν παραβιαστεί κάποιο από τα δύο. Γι’ αυτό:
Χωρίς κοινούς λογαριασμούς (SSO): το DiscourseConnect θα έκανε τους χρήστες του WordPress λογαριασμούς του forum, δένοντας τις ταυτότητες. Τα μέλη του forum μένουν μόνο στο Discourse.
Το WordPress δεν κρατά κλειδί διαχειριστή: εκεί που θα χρειαστεί API key για τη δημοσίευση, θα χρησιμοποιήσουμε ένα κλειδί ενός χρήστη, με το ελάχιστο δικαίωμα που χρειάζεται.
Το forum δεν κρατά κανένα κλειδί του WordPress: θα διαβάζει μόνο τα δημόσια άρθρα σας.
Οι επιλογές σύνδεσης
Τρόπος
Τι κάνει
Κλειδιά
Embedding του Discourse
Το Discourse δημιουργεί μόνο του ένα θέμα για κάθε άρθρο, την πρώτη φορά που του ζητηθεί η συζήτησή του
Κανένα
Δημοσίευση μέσω API
Το WordPress δημιουργεί το θέμα τη στιγμή της δημοσίευσης του άρθρου
Ένα API key ενός χρήστη (single user), μόνο για θέματα
Επίσημο plugin WP Discourse
Δημοσίευση, σχόλια και SSO σε ένα πακέτο
API key στο WordPress
Το επίσημο plugin είναι η πιο γρήγορη λύση, με δύο παρατηρήσεις.
Πρώτον, στέλνει στο forum ολόκληρο το επεξεργασμένο HTML του άρθρου, οπότε στο θέμα μπορεί να καταλήξουν κουμπιά κοινοποίησης, διαφημίσεις και άλλα στοιχεία του θέματος.
Δεύτερον, μην ενεργοποιήσετε το DiscourseConnect αν θέλετε τα δύο συστήματα να μένουν ανεξάρτητα. Παρακάτω περιγράφουμε τη σύνδεση βήμα βήμα, όπως την εφαρμόσαμε εμείς.
Βήμα 1: Χρήστης για τα θέματα των άρθρων
Τα θέματα των άρθρων χρειάζονται έναν «συντάκτη» στο forum. Δημιουργήστε έναν απλό χρήστη (όχι διαχειριστή), για παράδειγμα iguru. Αν το email δεν λειτουργεί ακόμα, δημιουργήστε τον απευθείας από τον server:
Add host: το domain του site σας (π.χ. example.gr) και η κατηγορία όπου θα μπαίνουν τα θέματα των άρθρων.
Username for topic creation: ο χρήστης του βήματος 1.
Ενεργοποιήστε το Truncate the embedded posts: το θέμα δείχνει μόνο μια σύντομη περίληψη με σύνδεσμο προς το άρθρο, αποφεύγοντας το διπλό περιεχόμενο για το Google.
Πείτε στο Discourse ποιο μέρος της σελίδας είναι το άρθρο, ώστε να αγνοεί κουμπιά, διαφημίσεις και πλαίσια. Στο CSS selector for elements that are allowed βάλτε την κλάση του κειμένου του άρθρου στο θέμα σας (π.χ. .entry-content), και στα removed τις κλάσεις των στοιχείων που δεν θέλετε.
Βήμα 3: API key με το ελάχιστο δικαίωμα
Αν θέλετε το WordPress να δημοσιεύει το θέμα αμέσως στο forum με τη δημοσίευση του άρθρου, δημιουργήστε κλειδί στο Admin → API → New API Key με τις εξής ρυθμίσεις:
User Level:Single User, ο χρήστης του βήματος 1. Ποτέ “All Users” και ποτέ διαχειριστής.
Scope: Granular, μόνο topics → write και topics → read.
Έτσι, ακόμα κι αν το WordPress παραβιαστεί, το κλειδί δεν επιτρέπει τίποτα περισσότερο από τη δημιουργία θεμάτων σαν αυτός ο χρήστης.
Το θέμα δημιουργείται με ένα απλό αίτημα στο /posts.json.
Δύο λεπτομέρειες κάνουν τη διαφορά:
η παράμετρος embed_url συνδέει το θέμα με το άρθρο, και το external_id (π.χ. wp-12345) εγγυάται ότι μια επανάληψη δεν θα φτιάξει δεύτερο θέμα για το ίδιο άρθρο. Αν το forum απαντήσει “Category can’t be blank”, θα πρέπει να ορίσετε κατηγορία, γιατί το Discourse από προεπιλογή δεν δέχεται θέματα χωρίς κατηγορία. Μια καλή πρακτική είναι να αντιστοιχίζονται αυτόματα οι κατηγορίες του WordPress με τις ομώνυμες του forum, που διαβάζονται δημόσια από το /categories.json.
Βήμα 4: Οι απαντήσεις κάτω από το άρθρο
Οι απαντήσεις ενός θέματος είναι δημόσιες και διαβάζονται χωρίς κλειδί από το /t/ID.json. Το WordPress μπορεί να τις διαβάζει στον server, να τις αποθηκεύει προσωρινά και να τις εμφανίζει σαν κανονικό HTML κάτω από το άρθρο, μαζί με τα σχόλια των επισκεπτών.
Τα οφέλη:
Χωρίς JavaScript και χωρίς iframe: οι απαντήσεις είναι μέρος της σελίδας και το Google τις βλέπει μαζί με το άρθρο.
Οι επισκέπτες χωρίς λογαριασμό συνεχίζουν να σχολιάζουν από τη φόρμα του WordPress, ενώ τα μέλη απαντούν στο forum.
Ασφάλεια: το HTML του forum καθαρίζεται ξανά με το φίλτρο wp_kses_post του WordPress πριν εμφανιστεί, οπότε ακόμα και ένα παραβιασμένο forum δεν μπορεί να «περάσει» script στο site.
Βήμα 5: Webhook για άμεση ενημέρωση
Οι σελίδες των άρθρων είναι συνήθως cached (Wp-rocket, FlyingPress, Cloudflare), οπότε μια νέα απάντηση στο forum δεν θα φαινόταν για ώρες. Η λύση είναι ένα webhook: σε κάθε νέα απάντηση, το Discourse θα ειδοποιεί το WordPress, που ανανεώνει τις απαντήσεις και καθαρίζει την cache μόνο εκείνου του άρθρου.
Στο Admin → API → Webhooks → New Webhook ορίστε τη διεύθυνση του WordPress (διαβάστε το τέλος της δημοσίευσης), content type application/json, ένα μυστικό (secret), και ως συμβάντα το Post Event.
Το Discourse υπογράφει κάθε ειδοποίηση με HMAC-SHA256 στην κεφαλίδα X-Discourse-Event-Signature, και το WordPress πρέπει να την ελέγχει. Σε PHP, ο έλεγχος είναι μία γραμμή:
Μια ειδοποίηση χωρίς σωστή υπογραφή απορρίπτεται με 401. Και μια σωστή επιτρέπει μόνο το “ανανέωσε τις απαντήσεις αυτού του άρθρου”, τίποτα άλλο.
Αν το Cloudflare έχει ενεργό το Bot Fight Mode, μπορεί να μπλοκάρει την ειδοποίηση από τον server σας. Προσθέστε έναν κανόνα στο WAF που παρακάμπτει τους ελέγχους για τη διαδρομή του webhook ή για την IP του server σας.
Bonus: Τελευταία θέματα του forum στο sidebar
Το /latest.json του forum είναι δημόσιο. Ένα μικρό widget στο WordPress μπορεί να το διαβάζει στον server κάθε λίγα λεπτά και να δείχνει τα νεότερα θέματα, χωρίς JavaScript και χωρίς κλειδιά.
Αντιμετώπιση προβλημάτων
Σύμπτωμα
Αιτία και λύση
Το webhook επιστρέφει 401
Λάθος secret, ή κάποιο plugin (π.χ. Disable REST API) μπλοκάρει το REST API. Δείτε την απάντηση της παράδοσης στο Discourse για να ξεχωρίσετε τις δύο περιπτώσεις.
Category can’t be blank
Δεν ορίστηκε κατηγορία forum για το άρθρο.
Στο θέμα εμφανίζονται κουμπιά κοινοποίησης
Δημοσιεύτηκε όλο το HTML της σελίδας. Δημοσιεύστε περίληψη με σύνδεσμο, ή ορίστε τους CSS selectors του Embedding.
Δεν δημιουργείται θέμα
Ελέγξτε τα «Allowed hosts» του Embedding και ότι το Cloudflare δεν μπλοκάρει το Discourse όταν διαβάζει το άρθρο σας.
Οι απαντήσεις δεν εμφανίζονται
Η σελίδα είναι ακόμα στην cache, ή το forum απαιτεί σύνδεση (login required) και τα θέματα δεν είναι δημόσια.
Το αποτέλεσμα: το site και το forum λειτουργούν σαν ένα, με τις συζητήσεις κάτω από κάθε άρθρο, αλλά το καθένα μένει στον δικό του, απομονωμένο χώρο. Αν το ένα πάθει κάτι, το άλλο δεν κινδυνεύει.
Για να έχετε το URL για το Admin → API → Webhooks → New Webhook ορίστε:
• Payload URL: https://iguru.gr/wp-json/xxxx/v1/webhook
• Content type: application/json
• Secret: Ένα δικό σας ισχυρό μυστικό κλειδί (π.χ. μια τυχαία συμβολοσειρά)
• Event Actions: Επιλέξτε μόνο το Post Event (ώστε να ενεργοποιείται μόνο όταν γράφεται νέα απάντηση).
Η Έτοιμη Λύση: Το iGuRu Discourse Bridge Plugin
Για να μην μπλέκετε με την προσθήκη κώδικα στα αρχεία του θέματός σας (functions.php), δημιουργήσαμε ένα αυτόνομο, ελαφρύ και απόλυτα ασφαλές custom plugin. Το πρόσθετο αυτό αναλαμβάνει να ανοίξει την ασφαλή “πόρτα” επικοινωνίας στο WordPress, να ελέγχει τις ψηφιακές υπογραφές των webhooks και να καθαρίζει αυτόματα την cache των WP-Rocket, FlyingPress και LiteSpeed Cache μόλις εμφανίζεται νέα απάντηση στο forum.
Οδηγίες Εγκατάστασης & Ρύθμισης
1. Δημιουργία του αρχείου: Αντιγράψτε τον κώδικα του plugin που σας δίνεται παρακάτω και αποθηκεύστε τον σε ένα αρχείο με όνομα `iguru-discourse-bridge.php στον υπολογιστή σας. 2. Κάντε το ZIP: Συμπιέστε το αρχείο σε μορφή .zip (π.χ. iguru-discourse-bridge.zip). 3. Εγκατάσταση στο WordPress: Στο WordPress Admin μενού Πρόσθετα (Plugins) → Προσθήκη νέου πρόσθετου, ανεβάστε το αρχείο .zip (upload) και πατήστε Ενεργοποίηση. 4. Εισαγωγή Κλειδιών: Μέσα στο μενού Ρυθμίσεις (Settings) → Discourse Bridge, θα βρείτε τη σελίδα ρυθμίσεων του plugin:
• Στο πεδίο Discourse URL, συμπληρώστε τη διεύθυνση του forum σας (π.χ. https://example.gr).
• Στο πεδίο Webhook Secret, επικολλήστε το κρυφό κλειδί (Secret) που ορίσατε κατά τη δημιουργία του Webhook στο Discourse.
5. Αντιγραφή του Payload URL: Η σελίδα ρυθμίσεων θα σας εμφανίσει αυτόματα το ακριβές URL (π.χ. https://site.gr/wp-json/iguru/v1/discourse-webhook). Αντιγράψτε το και επικολλήστε το στο πεδίο Payload URL στις ρυθμίσεις Webhook του Discourse (Admin → API → Webhooks).
Αυτό ήταν! Πλέον το WordPress και το Discourse επικοινωνούν με απόλυτη ασφάλεια, χωρίς κοινούς λογαριασμούς, χωρίς iframe, και με ακαριαία ανανέωση των σχολίων κάτω από κάθε σας άρθρο.
Για να το υλοποιήσετε, προσθέστε τον παρακάτω κώδικα στο αρχείο functions.php του θέματός σας (ή απευθείας μέσα στο custom plugin που δημιουργήσαμε παραπάνω). Ο κώδικας αποθηκεύει τα θέματα στην cache (Transient) για 10 λεπτά, ώστε το site σας να παραμένει ταχύτατο χωρίς να κάνει συνεχόμενες κλήσεις στο forum:
1. Αντικατάστησε και στις δύο θέσεις το https://yourdomain.com με το πραγματικό URL του forum σου.
2. Πρόσθεσε τον κώδικα σε ένα μικρό custom plugin ή στο functions.php του child theme σου.
3. Βάλε το shortcode σε σελίδα, άρθρο ή συμβατό widget:
Πώς να το εμφανίσετε στο WordPress:
• Με Shortcode: Προσθέστε το block Shortcode στο sidebar ή στο widget area σας και γράψτε [discourse_latest_topics limit=”5″].
• Μέσω κώδικα (PHP): Αν επεξεργάζεστε απευθείας τα αρχεία του θέματός σας (π.χ. sidebar.php), μπορείτε να το καλέσετε με:
Έτσι, οι αναγνώστες σας βλέπουν live την κινητικότητα του forum χωρίς να φορτώνεται κανένα εξωτερικό script στον browser τους, διατηρώντας το 100/100 στο Google PageSpeed Insights!
0 σχόλια
iGuRu.gr