Πώς να εξαιρέσετε εντελώς ένα συγκεκριμένο αναγνωριστικό ανάρτησης από το WordPress και να το συγχρονίσετε με το Meilisearch (Πρόσθετο αναζήτησης Scry στην πράξη)

Πρόσφατα δούλευα σε έναν ιστότοπο WordPress και ήθελα να προσθέσω μια μηχανή αναζήτησης υψηλής απόδοσης σε ολόκληρο τον ιστότοπο. Μετά από πολύ ψάξιμο, επέλεξα το Meilisearch και το συνδύασα με ένα πρόσθετο που ονομάζεται Scry Search.

Στην αρχή όλα πήγαν ομαλά. Εγκατέστησα το πρόσθετο, το ρύθμισα και το ευρετήριο δημιουργήθηκε αυτόματα. Η ταχύτητα αναζήτησης ήταν αστραπιαία και η εμπειρία ήταν πράγματι εξαιρετική.

Αλλά εδώ έρχεται το πρόβλημα.

Υπάρχουν αρκετά ασυνήθιστα άρθρα στον ιστότοπο. Μερικά προορίζονται για εσωτερικές δοκιμές, μερικά είναι σελίδες προορισμού αφιερωμένες σε συγκεκριμένους πελάτες και άλλα είναι ημιτελές περιεχόμενο που δεν θέλουμε να διαγράψουμε. Χρειάζομαι αυτά τα αναγνωριστικά άρθρων να εξαφανιστούν εντελώς από τα αποτελέσματα αναζήτησης.

Δεν αρκεί που δεν μπορεί να βρεθεί· είναι ότι δεν μπορεί καν να βρίσκεται στο ευρετήριο του Meilisearch.

Πώς να εξαιρέσετε εντελώς ένα συγκεκριμένο αναγνωριστικό ανάρτησης από το WordPress και να το συγχρονίσετε με το Meilisearch (Πρόσθετο αναζήτησης Scry στην πράξη)

Νόμιζα ότι αυτό ήταν απλό. Είναι απλώς θέμα εξαίρεσης μερικών ID. Η τεκμηρίωση του πρόσθετου πρέπει να έχει τα αντίστοιχα hooks. Απλώς προσθέστε ένα φίλτρο και είναι έτοιμο.

Όπως αποδείχθηκε, έκανα λάθος.

Γιατί αποτυγχάνουν οι συμβατικές μέθοδοι αναχαίτισης;

Αρχικά δοκίμασα το φίλτρων που αναφέρεται στην επίσημη τεκμηρίωση. Πρόσθεσα μερικές γραμμές κώδικα στο functions.php, το αποθήκευσα, ανανέωσα το backend και το επανίδρυσα σε ευρετήριο.

Στη συνέχεια, έλεγξα το backend του Meilisearch.

Αυτά τα άρθρα υπάρχουν ακόμα.

Έμεινα άναυδος.

Νόμιζα ότι είχα γράψει λάθος κώδικα, οπότε τον έλεγξα αρκετές φορές, αλλά δεν υπήρχε τίποτα κακό. Έπειτα, έψαξα στα προβλήματα GitHub του πρόσθετου και διαπίστωσα ότι αρκετοί άλλοι είχαν αντιμετωπίσει παρόμοια προβλήματα.

Αποδεικνύεται ότι το πρόσθετο Scry Search χρησιμοποιεί έναν ασύγχρονο μηχανισμό ουράς εργασιών για να αποφύγει την επιβράδυνση της διαδικασίας αποθήκευσης στο παρασκήνιο. Αυτό σημαίνει ότι όταν κάνετε κλικ στην επιλογή "Αποθήκευση άρθρου" στο παρασκήνιο, τα δεδομένα ενδέχεται να μεταφερθούν αμέσως σε έναν προσαρμοσμένο πίνακα εργασιών, παρακάμπτοντας το κανονικό φιλτράρισμα μεμονωμένων άρθρων.

Ακόμα πιο ύπουλο είναι ότι όταν κάνετε κλικ στο "Ευρετήριο Δημοσιεύσεων" στο παρασκήνιο για να αναδημιουργήσετε το καθολικό ευρετήριο, το πρόσθετο εκτελεί απευθείας ένα ερωτηματολόγιο βάσης δεδομένων παρτίδας στο υποκείμενο επίπεδο. Σε αυτό το σημείο, το φίλτρo hook που προσθέσατε νωρίτερα δεν έχει ποτέ την ευκαιρία να εκτελεστεί.

Με άλλα λόγια, οι συμβατικές μέθοδοι αποκλεισμού τίθενται σε ισχύ μόνο τη στιγμή που αποθηκεύετε χειροκίνητα το άρθρο. Αλλά η λογική συγχρονισμού του Scry Search είναι πολύ πιο περίπλοκη από ό,τι μπορείτε να φανταστείτε.

Βασικός κώδικας αναχαίτισης διπλής ασφάλισης

Αφού το σκέφτηκα, συνειδητοποίησα ότι το θέμα δεν μπορούσε να μείνει έτσι.

Δεδομένου ότι το συμβατικό άγκιστρο ελέγχει μόνο το σημείο εισόδου "αποθήκευσης ενός άρθρου", πρέπει να βρω έναν τρόπο να το μπλοκάρω και από άλλα σημεία.

Έχω καταλήξει σε δύο δρόμους.

Το πρώτο ζήτημα είναι η μετάδοση μέσω δικτύου. Είτε πρόκειται για συγχρονισμό μεμονωμένου άρθρου είτε για συγχρονισμό παρτίδας, τα τελικά δεδομένα πρέπει να αποσταλούν στον διακομιστή Meilisearch μέσω αιτημάτων HTTP, σωστά; Επομένως, πριν στείλω το αίτημα HTTP, θα πρέπει να ελέγξω αν το σώμα του αιτήματος περιέχει τα αναγνωριστικά αυτών των εξαιρούμενων άρθρων. Εάν ναι, θα πρέπει να αποκλείσω απευθείας την αποστολή του αιτήματος.

Το δεύτερο σημείο αφορά το ερώτημα βάσης δεδομένων. Δεδομένου ότι το πρόσθετο ανακτά τη λίστα άρθρων απευθείας από τη βάση δεδομένων κατά τη μαζική δημιουργία ευρετηρίου, θα αφαιρέσω αυτά τα συγκεκριμένα αναγνωριστικά από τα αποτελέσματα του ερωτήματος πριν εκτελέσω το ερώτημα βάσης δεδομένων. Από την οπτική γωνία του πρόσθετου, αυτά τα άρθρα δεν υπάρχουν καθόλου, επομένως δεν θα ανακτηθούν.

Δύο μονοπάτια, διπλή ασφάλεια. Αν ένα μονοπάτι δεν μπορεί να αποκλειστεί, υπάρχει ένα άλλο ως εφεδρικό.

Αφού το κατάλαβα, άρχισα να γράφω κώδικα.

Για τον πρώτο αναχαιτιστή, χρησιμοποίησα τον εγγενή του WordPress.pre_http_requestΤο φίλτρο. Αυτό το άγκιστρο ενεργοποιείται πριν το WordPress κάνει οποιαδήποτε αιτήματα HTTP. Η λογική μου είναι ότι θα ανιχνεύσει εάν η ζητούμενη διεύθυνση URL περιέχει...meilisearchΕάν το σώμα του αιτήματος περιέχει τα αναγνωριστικά των εξαιρούμενων άρθρων, το αίτημα θα αποκλειστεί.

Για να αποτρέψω την αναφορά σφαλμάτων από το πρόσθετο, πρέπει επίσης να προσποιηθώ μια επιτυχημένη απάντηση. Η τυπική μορφή απάντησης για το Meilisearch είναι...{"taskUid":0,"status":"enqueued"}Απλώς το επέστρεψα αυτό, κάνοντας το πρόσθετο να νομίζει ότι ο συγχρονισμός ήταν επιτυχής.

Το δεύτερο αναχαιτιστικό που χρησιμοποίησαpre_get_postsΤο άγκιστρο. Αυτό το άγκιστρο ενεργοποιείται πριν το WordPress εκτελέσει ένα ερώτημα βάσης δεδομένων. Η λογική μου είναι ότι κάθε φορά που ένας διαχειριστής εκτελεί μια λειτουργία στο backend ή όταν ένα πρόσθετο εκτελεί ασύγχρονες/σύγχρονες λειτουργίες, τα εξαιρούμενα αναγνωριστικά θα πρέπει να συγχωνευθούν στο...post__not_inΣτις παραμέτρους.

Αφού τελείωσα τη συγγραφή, το δοκίμασα.

Αρχικά, πήγα στο backend, άνοιξα ένα από τα εξαιρούμενα άρθρα, έκανα μερικές μικρές αλλαγές και πάτησα την ενημέρωση. Αποθηκεύτηκε με επιτυχία χωρίς σφάλματα. Στη συνέχεια, έλεγξα το backend του Meilisearch και ο δείκτης του άρθρου παρέμεινε αμετάβλητος. Δεν είχε εμφανιστεί τίποτα νέο.

Πάτησα ξανά το κουμπί "Ευρετήριο αναρτήσεων" και δημιούργησα ξανά ολόκληρο το ευρετήριο. Αφού περίμενα λίγο, έλεγξα το backend του Meilisearch. Αυτά τα εξαιρούμενα άρθρα ήταν ακόμα εκεί.

Τελείωσε.

Εμπεριστατωμένη ανάλυση: Πώς λειτουργεί ο μηχανισμός διπλής ασφάλισης;

Για να είμαι ειλικρινής, αυτή η διαδικασία μου θύμισε κάτι αρκετά ενδιαφέρον.

Ξέρετε, τη δεκαετία του 1880, όταν ο ηλεκτρισμός μόλις είχε αρχίσει να γίνεται ευρέως διαδεδομένος στις Ηνωμένες Πολιτείες, πολλοί ιδιοκτήτες εργοστασίων ξόδεψαν πολλά χρήματα για να αγοράσουν γεννήτριες και ηλεκτροκινητήρες και να τα εγκαταστήσουν στα εργοστάσιά τους. Ωστόσο, μετά την εγκατάσταση, πολλοί άνθρωποι διαπίστωσαν ότι η αποδοτικότητα της παραγωγής δεν βελτιώθηκε σημαντικά.

为什么;

Επειδή απλώς αντικατέστησαν την ατμομηχανή με έναν ηλεκτροκινητήρα, αλλά η συνολική διάταξη, οι διαδικασίες και οι μέθοδοι διαχείρισης του εργοστασίου παρέμειναν αμετάβλητες. Ο ηλεκτρισμός ήταν καινούργιος, αλλά η νοοτροπία για τη χρήση του ήταν παλιά.

Όσοι πραγματικά επωφελήθηκαν από την άνθηση της ηλεκτρικής ενέργειας ήταν στην πραγματικότητα η πρώτη ομάδα που κατάλαβε «τι σημαίνει πραγματικά η ηλεκτρική ενέργεια». Δεν άλλαξαν απλώς την πηγή ενέργειας, αλλά επανασχεδίασαν ολόκληρη την παραγωγική τους διαδικασία.

Το ίδιο ισχύει και για την εποχή της Τεχνητής Νοημοσύνης . Πολλοί άνθρωποι χρησιμοποιούν την Τεχνητή Νοημοσύνη ως εργαλείο, αλλά λίγοι σκέφτονται ποια υποκείμενη λογική αλλάζει. Το ίδιο το εργαλείο είναι καινούργιο, αλλά η νοοτροπία που χρησιμοποιείται για τη χρήση του μπορεί να παραμένει ξεπερασμένη.

Για παράδειγμα, όταν ρύθμιζα το μπλοκάρισμα αναζήτησης στο WordPress, πιθανότατα δεν θα μπορούσα να το κάνω να λειτουργήσει αν απλώς ακολουθούσα τις τυπικές μεθόδους στην τεκμηρίωση του πρόσθετου. Αυτό συμβαίνει επειδή η λογική συγχρονισμού του Scry Search δεν είναι πλέον η παραδοσιακή προσέγγιση "αποθήκευση ενός άρθρου, συγχρονισμός ενός άρθρου". Έχει ασύγχρονες ουρές, μαζική επεξεργασία και το δικό της σύνολο μηχανισμών.

Πρέπει να καταλάβετε πώς λειτουργεί αυτός ο μηχανισμός προτού μπορέσετε να βρείτε μια πραγματική ανακάλυψη.

Περιορισμοί και προφυλάξεις του σχεδίου

Ωστόσο, πρέπει να πω ειλικρινά ότι ούτε αυτό το σχέδιο είναι τέλειο.

Έχει έναν σημαντικό περιορισμό: μπορεί να διαχειριστεί μόνο μελλοντικούς συγχρονισμούς και δεν μπορεί να διαγράψει αυτόματα υπάρχοντα ιστορικά αρχεία στο Meilisearch. Με ​​άλλα λόγια, εάν έχετε ήδη συγχρονίσει αυτά τα άρθρα, θα πρέπει να διαγράψετε χειροκίνητα τα παλιά δεδομένα στον πίνακα ελέγχου του Meilisearch ή χρησιμοποιώντας εντολές API.

Αυτή είναι μια εφάπαξ εργασία. Μόλις ολοκληρωθεί, δεν χρειάζεται πλέον να ανησυχείτε γι' αυτήν. Αλλά πρέπει να το ξεκαθαρίσω αυτό εκ των προτέρων, έτσι ώστε μετά την ανάπτυξη του κώδικα, να μην βρίσκετε ακόμα αυτά τα άρθρα στα αποτελέσματα αναζήτησης και να υποθέτετε ότι ο κώδικας δεν έχει τεθεί σε ισχύ.

Ένα άλλο σημείο που πρέπει να σημειωθεί είναι ότι αυτή η προσέγγιση βασίζεται στην υποκείμενη αρχιτεκτονική δικτύου και βάσης δεδομένων του WordPress. Όσο οι μελλοντικές εκδόσεις του πρόσθετου Scry Search συνεχίζουν να λειτουργούν με βάση αυτήν την αρχιτεκτονική, αυτός ο αναχαιτιστής θα παραμείνει αποτελεσματικός. Ωστόσο, εάν ποτέ μεταβεί σε έναν εντελώς διαφορετικό μηχανισμό συγχρονισμού, τότε ενδέχεται να είναι απαραίτητη η εκ νέου προσαρμογή.

Για να είμαστε ειλικρινείς, ωστόσο, αυτό είναι απίθανο. Ολόκληρο το οικοσύστημα του WordPress βασίζεται σε αυτήν την αρχιτεκτονική και είναι σχεδόν αδύνατο για τα πρόσθετα (plugins) να το παρακάμψουν εντελώς.

Οδηγός τριών βημάτων για την εφαρμογή

/**
 * Scry Search 双保险拦截器:彻底排除指定文章 ID 同步到 Meilisearch
 */
// ==========================================
// 【配置】请在这里填写你想要排除的文章或页面 ID
// ==========================================
define('MEILI_EXCLUDED_IDS', array(1067, 1014, 1474, 34020));


/**
 * 保险一:拦截单篇保存/更新时的网络推送 (方案 A 优化版)
 * 原理:当 WordPress 发送网络请求时,如果发现是发往 meilisearch 且带有排除的 ID,直接掐断
 */
add_filter('pre_http_request', function($preempt, $parsed_args, $url) {
    // 1. 检查是不是发往 Meilisearch 的请求
    if (strpos($url, 'meilisearch') !== false && isset($parsed_args['body'])) {
        $body_content = $parsed_args['body'];

        // 2. 检查请求体里是否包含任何一个被排除的文章 ID
        foreach (MEILI_EXCLUDED_IDS as $id) {
            // 匹配格式如 "id":1067 或 字符串中的 ID
            if (strpos($body_content, (string)$id) !== false) {
                // 找到匹配,直接拦截网络请求,并向插件伪造一个标准的成功响应
                return array(
                    'response' => array('code' => 200, 'message' => 'OK'), 
                    'body'     => '{"taskUid":0,"status":"enqueued"}'
                );
            }
        }
    }
    return $preempt;
}, 10, 3);


/**
 * 保险二:拦截后台全量索引时的数据库查询 (方案 B)
 * 原理:在插件试图从数据库捞取文章列表时,直接将这几个 ID 从查询结果中剔除
 */
add_action('pre_get_posts', function($query) {
    // 仅在后台管理员操作,或者插件执行异步同步时生效
    if (is_admin() || (defined('DOING_ASYNC') && DOING_ASYNC)) {

        // 获取当前查询已经存在的排除 ID(如果有的话)
        $current_excluded = $query->get('post__not_in');
        if (!is_array($current_excluded)) {
            $current_excluded = array();
        }

        // 将我们的专属排除 ID 合并进去
        $query->set('post__not_in', array_merge($current_excluded, MEILI_EXCLUDED_IDS));
    }
});

Τέλος, ας συνοψίσουμε τα βήματα της λειτουργίας.

Αρχικά, αντιγράψτε τον κώδικα στο κάτω μέρος του αρχείου functions.php ή προσθέστε τον χρησιμοποιώντας το πρόσθετο Code Snippets. Στη συνέχεια, στην κορυφή...defineΣτον πίνακα, εισαγάγετε το αναγνωριστικό του άρθρου ή της σελίδας που θέλετε να εξαιρέσετε.

Το δεύτερο βήμα είναι να καθαρίσετε τα ιστορικά ευρετήρια. Συνδεθείτε στον πίνακα ελέγχου του Meilisearch ή χρησιμοποιήστε εντολές API για να διαγράψετε χειροκίνητα τα παλιά δεδομένα ευρετηρίου για τα εξαιρούμενα άρθρα.

Το τρίτο βήμα είναι η δοκιμή. Μεταβείτε στο backend και κάντε τυχόν μικρές αλλαγές στο εξαιρούμενο άρθρο, κάντε κλικ στην επιλογή ενημέρωση και, στη συνέχεια, ελέγξτε το backend του Meilisearch. Εάν δεν εμφανιστεί νέο ευρετήριο, ο αποκλεισμός έχει τεθεί σε ισχύ.

Για να είμαι ειλικρινής, πάντα ένιωθα λίγο ένοχος που έγραφα τέτοιου είδους τεχνικά άρθρα κοινής χρήσης.

Αυτά που μοιράζομαι μπορεί να είναι χρήσιμα σε μερικούς ανθρώπους, αλλά για άλλους μπορεί να είναι απλώς βασικές λειτουργίες.

Αλλά η διαδικασία εφαρμογής του αποκλεισμού αναζήτησης στο WordPress αυτή τη φορά ήταν πραγματικά διορατική. Συχνά, τα προβλήματα που αντιμετωπίζουμε δεν οφείλονται στην έλλειψη λύσεων, αλλά μάλλον στο ότι η σκέψη μας περιορίζεται από τα υπάρχοντα πλαίσια.

Το πρόσθετο Scry Search παρέχει ένα άγκιστρο φιλτραρίσματος, γεγονός που μας οδηγεί στο συμπέρασμα ότι αυτή είναι η μόνη επιλογή. Ωστόσο, ολόκληρη η αρχιτεκτονική του WordPress προσφέρει πολύ περισσότερες δυνατότητες. Η υποκλοπή μπορεί να επιτευχθεί στο επίπεδο δικτύου και μπορεί επίσης να γίνει στο επίπεδο της βάσης δεδομένων. Αρκεί να είστε διατεθειμένοι να το σκεφτείτε, υπάρχει πάντα ένας τρόπος.

Γι' αυτό μου αρέσει να πειραματίζομαι με αυτά τα τεχνικά γκάτζετ. Δεν έχει σημασία η επίδειξη ή η προσπάθεια να φανώ εντυπωσιακός. Απλώς επειδή το συναίσθημα της πλήρους κατανόησης ενός προβλήματος είναι απίστευτα ικανοποιητικό.

Όπως ακριβώς και αυτή τη φορά, από την αρχική σύγχυση, μέχρι την αντανάκλαση στη μέση, μέχρι την τελική λύση, όλη η διαδικασία ήταν σαν να λύνω ένα παζλ.

Το μυστήριο λύθηκε, η απάντηση αποκαλύφθηκε, αποδείχθηκε ότι ήταν τόσο απλό.

Αλλά αν δεν έχεις περάσει από αυτή την περίπλοκη διαδικασία, δεν θα καταλάβεις ποτέ αυτή την απλή χαρά.

Τώρα που διαβάσατε μέχρι εδώ, αν το βρήκατε χρήσιμο, κάντε like και κοινοποιήστε το. Αν θέλετε να λαμβάνετε ενημερώσεις πρώτοι, μπορείτε επίσης να με ακολουθήσετε.

Σας ευχαριστώ που διαβάσατε το άρθρο μου. Τα λέμε την επόμενη φορά.

Ας ελπίσουμε ότι το άρθρο "Πώς να εξαιρέσετε πλήρως ένα συγκεκριμένο αναγνωριστικό ανάρτησης από τον συγχρονισμό με το Meilisearch στο WordPress (Scry Search Plugin in Practice)" που κοινοποιήθηκε στο ιστολόγιο του Chen Weiliang ( https://www.chenweiliang.com/ ) θα σας φανεί χρήσιμο.

Μη διστάσετε να κοινοποιήσετε τον σύνδεσμο αυτού του άρθρου: https://www.chenweiliang.com/cwl-34343.html

Για να ξεκλειδώσετε περισσότερα κρυμμένα κόλπα🔑, καλώς ήρθατε στο κανάλι μας στο Telegram!

Κάντε share και like αν σας αρέσει! Τα share και τα likes σας είναι το συνεχές μας κίνητρο!

 

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Μεταβείτε στην κορυφή