WordPress-ээс тодорхой нийтлэлийн ID-г хэрхэн бүрэн хасаж, Meilisearch-тэй хэрхэн синк хийх вэ (Scry Search залгаас практик дээр)

Би сүүлийн үед нэг зүйл дээр ажиллаж байна.WordPressБи вэбсайтдаа өндөр гүйцэтгэлтэй сайтын хэмжээний хайлт нэмэхийг хүссэн. Удаан хайлтын дараа би Meilisearch-ийг сонгоод Scry Search нэртэй залгаастай хослуулсан.

Эхэндээ бүх зүйл жигд явагдсан. Би залгаасыг суулгаж, тохируулсан бөгөөд индекс автоматаар үүссэн. Хайлтын хурд маш хурдан байсан бөгөөд туршлага үнэхээр гайхалтай байсан.

Гэхдээ энд асуудал гарч ирдэг.

Вэбсайт дээр хэд хэдэн ер бусын нийтлэлүүд байдаг. Зарим нь дотоод туршилтад зориулагдсан, зарим нь тодорхой үйлчлүүлэгчдэд зориулсан тусгай буух хуудас, зарим нь бидний устгахыг хүсэхгүй байгаа дуусаагүй контент юм. Эдгээр нийтлэлийн ID-г хайлтын үр дүнгээс бүрмөсөн алга болгохыг би хүсэж байна.

Олдохгүй байгаа нь хангалтгүй; харин Meilisearch-ийн индекст ч байхгүй байгаа нь л чухал юм.

WordPress-ээс тодорхой нийтлэлийн ID-г хэрхэн бүрэн хасаж, Meilisearch-тэй хэрхэн синк хийх вэ (Scry Search залгаас практик дээр)

Энэ нь энгийн гэж би бодсон; энэ нь зүгээр л хэдэн ID-г хасах асуудал юм. Залгаасны баримт бичигт харгалзах дэгээнүүд байх ёстой; зүгээр л шүүлтүүр нэмээд л болоо.

Гэвч эцэст нь би буруу бодож байсан нь тодорхой болсон.

Уламжлалт гагнуурын аргууд яагаад үр дүнгүй байдаг вэ?

Би эхлээд албан ёсны баримт бичигт дурдсан шүүлтүүрийн дэгээг туршиж үзсэн. Би functions.php файлд хэдэн мөр код нэмж, хадгалж, backend-ийг шинэчилж, дахин индексжүүлсэн.

Дараа нь би Meilisearch-ийн арын хэсгийг шалгасан.

Тэр нийтлэлүүд одоо хүртэл байгаа.

Би цочирдсон байсан.

Би буруу код бичсэн гэж бодсон тул хэд хэдэн удаа шалгасан боловч ямар ч асуудал гараагүй. Дараа нь би залгаасын GitHub асуудлуудаас хайлт хийж, өөр хэд хэдэн хүн үүнтэй төстэй асуудалтай тулгарсан болохыг олж мэдсэн.

Scry Search залгаас нь дэвсгэр дээр хадгалах үйл явцыг удаашруулахаас зайлсхийхийн тулд асинхрон даалгаврын дарааллын механизмыг ашигладаг болох нь тогтоогджээ. Энэ нь та дэвсгэр дээр "Нийтлэлийг хадгалах" дээр дарахад өгөгдлийг ердийн ганц өгүүллийн шүүлтүүрийг алгасаж, өөрчлөн тохируулсан даалгаврын хүснэгт рүү шууд оруулж болно гэсэн үг юм.

Бүр илүү аюултай нь та дэлхийн индексийг дахин үүсгэхийн тулд ард нь "Индексийн бичлэгүүд" дээр дарахад залгаас нь үндсэн түвшинд багц мэдээллийн сангийн асуулга шууд гүйцэтгэдэг. Энэ үед таны өмнө нь нэмсэн шүүлтүүрийн дэгээ хэзээ ч ажиллах боломжгүй болдог.

Өөрөөр хэлбэл, уламжлалт хаах аргууд нь та нийтлэлийг гараар хадгалах мөчөөс л хүчин төгөлдөр болно. Гэхдээ Scry Search-ийн синхрончлолын логик нь таны төсөөлж байснаас хамаагүй илүү төвөгтэй юм.

Давхар даатгалын интерпретаторын үндсэн код

Үүнийг бодсоны дараа би энэ асуудлыг ингээд орхиж болохгүй гэдгийг ойлгосон.

Уламжлалт дэгээ нь зөвхөн "ганц өгүүлэл хадгалах" оролтын цэгийг хянадаг тул би үүнийг бусад газраас хаах арга олох хэрэгтэй байна.

Би хоёр зам бодож олсон.

Эхний асуудал бол сүлжээний дамжуулалтын төгсгөл юм. Ганц өгүүллийн синхрончлол эсвэл багцын синхрончлол байсан ч эцсийн өгөгдлийг HTTP хүсэлтээр дамжуулан Meilisearch сервер рүү илгээх шаардлагатай хэвээр байна, тийм үү? Тиймээс HTTP хүсэлтийг илгээхээсээ өмнө хүсэлтийн биед хасагдсан нийтлэлүүдийн ID байгаа эсэхийг шалгах хэрэгтэй. Хэрэв тийм бол би хүсэлтийг илгээхийг шууд хаах хэрэгтэй.

Хоёр дахь зүйл нь мэдээллийн сангийн асуулгатай холбоотой. Залгаас нь багц индексжүүлэх явцад нийтлэлийн жагсаалтыг мэдээллийн сангаас шууд авдаг тул би мэдээллийн сангийн асуулга гүйцэтгэхийн өмнө асуулгын үр дүнгээс эдгээр тодорхой ID-г хасах болно. Залгаасны үүднээс авч үзвэл эдгээр нийтлэлүүд огт байхгүй тул тэдгээрийг авахгүй.

Хоёр зам, давхар даатгал. Хэрэв нэг замыг хааж чадахгүй бол нөөц зам болгон өөр нэгийг нь олоорой.

Үүнийг ойлгосны дараа би код бичиж эхэлсэн.

Эхний интерсепторын хувьд би WordPress-ийн уугуул хувилбарыг ашигласан.pre_http_requestШүүлтүүр. Энэ дэгээ нь WordPress ямар нэгэн HTTP хүсэлт гаргахаас өмнө идэвхждэг. Миний логикоор бол хүссэн URL нь ... агуулсан эсэхийг илрүүлэх болно.meilisearchХэрэв хүсэлтийн хэсэг нь хасагдсан нийтлэлүүдийн ID-г агуулж байвал хүсэлтийг хаах болно.

Залгаас алдаа мэдээлэхээс сэргийлэхийн тулд би амжилттай хариуг хуурамчаар бичих хэрэгтэй. Meilisearch-ийн стандарт хариу формат нь...{"taskUid":0,"status":"enqueued"}Би үүнийг буцааж өгсөн бөгөөд энэ нь залгаасыг синхрончлол амжилттай болсон гэж бодоход хүргэсэн.

Миний ашигласан хоёр дахь интерсепторpre_get_postsДэгээ. Энэ дэгээ нь WordPress мэдээллийн сангийн асуулгыг гүйцэтгэхээс өмнө идэвхждэг. Миний логик бол администратор backend дээр үйлдэл хийх эсвэл залгаас асинхрон/синхрон үйлдэл хийх үед хасагдсан ID-уудыг нэгтгэх ёстой...post__not_inПараметрүүдэд.

Бичиж дуусаад би туршиж үзсэн.

Эхлээд би backend руу орж, хасагдсан нийтлэлүүдийн нэгийг нээгээд, хэдэн жижиг өөрчлөлт оруулаад шинэчлэх товчийг дарсан. Энэ нь ямар ч алдаагүйгээр амжилттай хадгалагдсан. Дараа нь би Meilisearch backend-ийг шалгасан бөгөөд нийтлэлийн индекс өөрчлөгдөөгүй хэвээр байсан; шинэ зүйл гарч ирээгүй байв.

Би "Индексийн бичлэгүүд" дээр дахин дарж, индексийг бүхэлд нь дахин бүтээв. Хэсэг хүлээсний дараа Meilisearch-ийн backend-ийг шалгав. Хасагдсан нийтлэлүүд тэнд байсаар л байв.

Дуусчихлаа.

Гүнзгий дүн шинжилгээ: Давхар даатгалын механизм хэрхэн ажилладаг вэ?

Үнэнийг хэлэхэд энэ үйл явц надад нэлээд сонирхолтой зүйлийг санагдуулсан.

Та мэдэж байгаачлан, 1880-аад онд АНУ-д цахилгаан эрчим хүч дөнгөж өргөн тархаж байх үед олон үйлдвэрийн эзэд генератор, цахилгаан мотор худалдаж аваад үйлдвэртээ суурилуулахад их хэмжээний мөнгө зарцуулдаг байжээ. Гэсэн хэдий ч суурилуулсны дараа олон хүн үйлдвэрлэлийн үр ашиг мэдэгдэхүйц сайжраагүй болохыг олж мэджээ.

яагаад?

Учир нь тэд зүгээр л уурын хөдөлгүүрийг цахилгаан мотороор сольсон боловч үйлдвэрийн ерөнхий зохион байгуулалт, үйл явц, удирдлагын арга барил өөрчлөгдөөгүй хэвээр байв. Цахилгаан шинэ байсан ч ашиглах сэтгэлгээ нь хуучирсан байв.

Цахилгаан эрчим хүчний огцом өсөлтөөс үнэхээр ашиг хүртсэн хүмүүс бол үнэндээ "цахилгаан гэдэг нь юу гэсэн үг болохыг" ойлгосон анхны бүлэг хүмүүс байв. Тэд зөвхөн эрчим хүчний эх үүсвэрээ өөрчлөөд зогсохгүй үйлдвэрлэлийн бүх үйл явцаа дахин зохион бүтээсэн.

саяханAIЭнэ нь цаг үетэй ч мөн адил хамаарна. Олон хүн хиймэл оюун ухааныг хэрэгсэл болгон ашигладаг ч цөөхөн хүн л үүний үндсэн логикийг үнэхээр юу өөрчилж байгааг боддог. Хэрэгсэл нь шинэ байж болох ч үүнийг ашиглахад ашигласан сэтгэлгээ хуучирсан хэвээр байж магадгүй юм.

Жишээлбэл, би WordPress хайлтын хаалтыг тохируулж байх үед залгаасын баримт бичигт байгаа стандарт аргуудыг л дагаж мөрдвөл үүнийг ажиллуулж чадахгүй байх байсан байх. Учир нь Scry Search-ийн синхрончлолын логик нь уламжлалт "нэг нийтлэл хадгалах, нэг нийтлэлийг синхрончлох" арга байхаа больсон; энэ нь асинхрон дараалал, багц боловсруулалт, өөрийн гэсэн механизмтай.

Жинхэнэ нээлтийг олохоосоо өмнө энэ механизм хэрхэн ажилладагийг олж мэдэх хэрэгтэй.

Төлөвлөгөөний хязгаарлалт ба урьдчилан сэргийлэх арга хэмжээ

Гэсэн хэдий ч энэ төлөвлөгөө төгс биш гэдгийг би шууд хэлэх ёстой.

Энэ нь мэдэгдэхүйц хязгаарлалттай: энэ нь зөвхөн ирээдүйн синхрончлолыг удирдах боломжтой бөгөөд Meilisearch дээрх одоо байгаа түүхэн бичлэгүүдийг автоматаар устгах боломжгүй. Өөрөөр хэлбэл, хэрэв та эдгээр нийтлэлийг аль хэдийн синхрончилсон бол Meilisearch хяналтын самбараас эсвэл API командуудыг ашиглан хуучин өгөгдлийг гараар устгах шаардлагатай хэвээр байна.

Энэ бол нэг удаагийн ажил; ​​дууссаны дараа та үүнд санаа зовох хэрэггүй болно. Гэхдээ кодыг байршуулсны дараа хайлтын үр дүнд эдгээр нийтлэлийг олохгүй, код хүчин төгөлдөр болоогүй гэж бодохгүйн тулд үүнийг урьдчилан тодорхой болгох хэрэгтэй байна.

Анхаарах өөр нэг зүйл бол энэ арга нь WordPress-ийн үндсэн сүлжээ болон мэдээллийн сангийн архитектурт тулгуурладаг явдал юм. Scry Search залгаасын ирээдүйн хувилбарууд энэ архитектур дээр үндэслэн ажилласаар байвал энэ интерсептор үр дүнтэй хэвээр байх болно. Гэсэн хэдий ч хэрэв энэ нь огт өөр синхрончлолын механизм руу шилжвэл дахин тохируулах шаардлагатай болж магадгүй юм.

Гэхдээ үнэнийг хэлэхэд энэ нь магадлал багатай юм. WordPress экосистем бүхэлдээ энэ архитектур дээр суурилдаг бөгөөд залгаасууд үүнийг бүрэн тойрч гарах нь бараг боломжгүй юм.

Хэрэгжүүлэх гурван алхамт гарын авлага

/**
 * 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Массивт хасахыг хүссэн нийтлэл эсвэл хуудасныхаа ID-г оруулна уу.

Хоёр дахь алхам бол түүхэн индексүүдийг цэвэрлэх явдал юм. Meilisearch хяналтын самбартаа нэвтрэх эсвэл хасагдсан нийтлэлүүдийн хуучин индексийн өгөгдлийг гараар устгахын тулд API командуудыг ашиглана уу.

Гурав дахь алхам бол туршилт юм. Арын хэсэг рүү очоод хасагдсан нийтлэлд бага зэргийн өөрчлөлт оруулаад, шинэчлэх дээр дараад Meilisearch арын хэсгийг шалгана уу. Хэрэв шинэ индекс гарч ирэхгүй бол хаалт хүчин төгөлдөр болсон.

Үнэнийг хэлэхэд би иймэрхүү техникийн нийтлэл бичихдээ үргэлж бага зэрэг гэм буруутай мэт санагддаг байсан.

Миний хуваалцаж буй зүйлс зарим хүмүүст хэрэгтэй байж болох ч зарим хүмүүсийн хувьд зүгээр л энгийн үйлдлүүд байж магадгүй юм.

Гэхдээ энэ удаад WordPress хайлтын хаалтыг хэрэгжүүлэх үйл явц үнэхээр гүнзгий байсан. Бидний тулгардаг асуудлууд нь шийдэл дутмаг байгаагаас бус, харин бидний сэтгэлгээ одоо байгаа хүрээллээр хязгаарлагдмал байдагтай холбоотой байдаг.

Scry Search залгаас нь шүүлтүүрийн дэгээг өгдөг бөгөөд энэ нь цорын ганц сонголт гэдэгт биднийг итгүүлэхэд хүргэдэг. Гэсэн хэдий ч WordPress-ийн бүхэл бүтэн архитектур нь илүү олон боломжийг санал болгодог. Сүлжээний түвшинд болон мэдээллийн сангийн түвшинд мэдээлэл цуглуулах боломжтой. Хэрэв та бодож байгаа л бол үргэлж арга зам байдаг.

Тийм учраас би эдгээр техникийн хэрэгслүүдийг өөрчлөх дуртай. Энэ бол гайхуулах эсвэл гайхалтай харагдах гэж оролдох тухай биш. Зүгээр л асуудлыг бүрэн ойлгосон мэдрэмж үнэхээр сэтгэл ханамжтай байдаг учраас тэр юм.

Яг энэ удаагийнх шиг, анхны төөрөгдлөөс эхлээд голд нь тусгал, эцсийн шийдэл хүртэл бүх үйл явц нь тааврыг тайлахтай адил байв.

Нууцыг тайлж, хариултыг нь илчилсэн бөгөөд энэ нь маш энгийн байсан нь тодорхой боллоо.

Гэхдээ хэрэв та тэр төөрөгдүүлсэн үйл явцыг туулж үзээгүй бол энэ энгийн баяр баясгаланг хэзээ ч ойлгохгүй.

Та энэ хүртэл уншсан тул хэрэв танд тустай байсан бол лайк дарж, хуваалцана уу. Хэрэв та хамгийн түрүүнд шинэчлэлтүүдийг хүлээн авахыг хүсвэл намайг дагаж болно.

Миний нийтлэлийг уншсанд баярлалаа. Дараагийн удаа уулзъя.

Hope Chen Weiliang блог ( https://www.chenweiliang.com/ Энд хуваалцсан "WordPress дээр Meilisearch-тэй синхрончлол хийхээс тодорхой бичлэгийн ID-г хэрхэн бүрэн хасах вэ (Scry Search Plugin практикт)" нийтлэл танд тустай байж магадгүй юм.

Энэ нийтлэлийн холбоосыг хуваалцахад тавтай морилно уу:https://www.chenweiliang.com/cwl-34343.html

Илүү олон далд заль мэхийг нээхийн тулд манай Telegram сувагт нэгдэнэ үү!

Хэрэв танд таалагдвал лайк дарж, хуваалцаарай! Таны шэйр, лайк бол бидний байнгын урам зориг юм!

 

发表 评论

Таны имэйл хаягийг нийтлэхгүй. 必填 项 已 用 дээр ажиллаж байна * 标注

TOP хүртэл гүйлгэж