كيفية تخصيص فئة wpdb وإضافة طرق جديدة
نشرت: 2018-07-10طبقة تجريد قاعدة بيانات WordPress ، المعروفة بشكل أكثر شيوعًا باسم wpdb ، هي فئة تعتمد على ezSQL المسؤولة عن التفاعل مع قاعدة البيانات. فئة wpdb هي أيضًا فئة منسدلة - جزء من كود WP الأساسي يمكن استبداله بسهولة بقطعة أخرى من التعليمات البرمجية بوظائف مماثلة (تتوفر قائمة محدثة من الوظائف الإضافية في WP Code Reference).
تعديل فئة #wpdb الافتراضية ليس معقدًا. يمكنك بسهولة إضافة أو إزالة أو تعديل طرق قليلة فقط. لا حاجة لاستبدال الفصل بأكمله. # ووردبريس
انقر على تويترهذا هو المكان الذي تلعب فيه فكرة خاطئة كبيرة. ينظر الناس إلى "مستبدلة" كما في "اكتب فئة قاعدة البيانات الكاملة الخاصة بي". لحسن الحظ ، ليس عليك كتابة فئة قاعدة البيانات بأكملها. يمكنك أخذ الفصل الحالي وإضافة أو إزالة أو تعديل الوظائف التي تحتاجها فقط. وهذا ما سنفعله.
لماذا تعديل فئة wpdb؟
بالتأكيد ، يحتوي wpdb على كل ما تحتاجه !؟ تم بناء الفسفور الأبيض بأكمله فوقه. من الناحية الفنية هذا صحيح. باستخدام طريقة $wpdb->query()
يمكنك تنفيذ أي أمر SQL. ولكن مع تطبيق هذا المنطق ، لن يكون لدينا أو نحتاج إلى طرق مثل $wpdb->insert()
أو $wpdb->get_var()
. لكننا نفعل ذلك ، لأنهم يوفرون الوقت ، ويقللون من الأخطاء ويبعدون الاستفسارات السيئة. إذن ، ما هي الوظائف المفقودة؟ هذا يعتمد على المشروع الذي تعمل عليه. احتجنا إلى الدعم لهذين الاستفسارات:
INSERT IGNORE INTO tbl_name ...
INSERT INTO tbl_name ... ON DUPLICATE KEY UPDATE ...
الخطوة # 1 - إنشاء القائمة المنسدلة
عملية إنشاء قاعدة بيانات منسقة بسيطة ، والنتيجة النهائية تمتزج بسلاسة في WP.
قم بإنشاء ملف باسم db.php
وضعه في المجلد /wp-content/
. امنح الملف رأسًا قياسيًا للمكوِّن الإضافي وأنشئ فئة توسع ملف wpdb. شيء من هذا القبيل:
<?php /* Plugin Name: Extended wpdb Description: A few extra functions for wpdb Version: 1.0 Author: WebFactory Ltd */ class wpdb_extended extends wpdb { public function __construct(){ parent::__construct( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); } public function test() { echo 'Extended wpdb is running.'; } } global $wpdb; $wpdb = new wpdb_extended();
العنوان جميل لا يحتاج إلى شرح. تتأكد طريقة الإنشاء من إنشاء اتصال قاعدة بيانات جديد بمجرد إنشاء كائن ويستخدم مُنشئ wpdb الأصلي لذلك. يتم تعريف ثوابت قاعدة البيانات هذه في wp-config.php
. كما قلنا في البداية - نحن فقط نضيف بعض الوظائف ونعيد استخدام كل شيء آخر. الطريقة الثانية test()
هي فقط لمعرفة ما إذا كان كل شيء يعمل بشكل صحيح.
السطران الأخيران مهمان. نظرًا لأن هذه فئة مخصصة ، فلن يقوم WP بإنشاء كائن $wpdb
لنا تلقائيًا. علينا أن نفعل ذلك بأنفسنا. تذكر أن تستخدم الكلمة الأساسية global
وإلا فإنك ستنشئ متغيرًا محليًا.
الخطوة # 2 - اختبرها قبل الحفر بشكل أعمق
افتح لوحة معلومات WP وتوجه إلى الإضافات. إلى جانب علامات التبويب All و Active و Inactive (الإضافات) المعتادة ، سترى علامة تبويب Drop-ins وفيها ، ببعض السحر ، فئة قاعدة البيانات المخصصة الخاصة بنا.
نظرًا لأن المسؤول يعمل بشكل صحيح ، فنحن نعلم أننا قمنا بعمل جيد. فصلنا الجديد والمخصص والممتد موجود ولم يتغير شيء. عظيم! ولكن ، فقط من أجل إجراء جيد ، ضع هذه الأسطر الثلاثة من التعليمات البرمجية في functions.php
السمة .php (أو في مكان ما داخل المكون الإضافي حيث سيتم تشغيله على الفور):
global $wpdb; $wpdb->test(); die;
قم بتشغيل أي مسؤول أو صفحة نهاية أمامية وماذا ترى؟ " الموسعة wpdb قيد التشغيل. " ممتاز. الآن لوظائفنا في العالم الحقيقي.
الخطوة # 3 - إنشاء وظائف أو تعديلها أو استبدالها
يبدو من السهل جدًا تنفيذ استعلام INSERT IGNORE
. لدينا بالفعل $ wpdb-> insert () لذلك نحن نفتقد كلمة واحدة فقط. لسوء الحظ ، نظرًا لعدم وجود عوامل تصفية في الأماكن الصحيحة ، فلن يكون هناك سطرين من التعليمات البرمجية.
إذا فتحت wp-db.php وتوجهت لأسفل إلى طريقة insert()
في السطر رقم 2100 ، فسترى أنها تستخدم طريقة _insert_replace_helper()
من السطر رقم 2151. ولا تحتوي هذه الوظيفة على مرشح أو إجراء واحد. لا يمكننا التفاف الدالة إما لأنها تعرض نتيجة الاستعلام على الفور وليس الاستعلام نفسه الذي يمكننا تعديله. المشكله. سيتعين علينا تجاوز كل من أساليب insert()
و _insert_replace_helper()
. سنضيف معامل إضافي - $ignore
. قيمة منطقية بالقيمة الافتراضية false
.
public function insert( $table, $data, $format = null, $ignore = false ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT', $ignore = false ); }
في أي ظرف آخر ، فإن الوظيفة التي تحتوي على خمسة معلمات ستكون مرشحًا جيدًا لتحويلها إلى مصفوفة ترابطية. لكننا نريد التوافق مع الإصدارات السابقة ، لذلك نحن لا نفعل ذلك. التغييرات على الوظيفة الأخرى طفيفة أيضًا:
function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT', $ignore = false ) { $this->insert_id = 0; if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $formats = $values = array(); foreach ( $data as $value ) { if ( is_null( $value['value'] ) ) { $formats[] = 'NULL'; continue; } $formats[] = $value['format']; $values[] = $value['value']; } $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; $formats = implode( ', ', $formats ); // modification for IGNORE keyword if (true == $ignore && 'INSERT' == $type) { $type = 'INSERT IGNORE'; } $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); }
لماذا لا يفعل المطورون هذا كثيرًا؟
إذا كنت بحاجة إلى استعلام مخصص مرات قليلة فقط ، يمكنك بسهولة استخدام $wpdb->query()
. ليست هناك حاجة لاستبدال الفئة الافتراضية. يمكنك أيضًا كتابة فئة مخصصة تمتد للفئة الافتراضية ولكنها لا تتجاوز كائن wpdb. في هذه الحالة $mycustomclass->method()
ولكن هذه ليست نهاية العالم.
إلى جانب عامل البرودة الواضح ، فإن تمديد فئة wpdb الافتراضية هو شيء من المفترض القيام به في WP وليس اختراقًا ، لذلك لا تتردد في اللعب به. ضع في اعتبارك شيئين:
- عندما ترسل مشروعك إلى شخص ما ، لا تنس تضمين ملف
db.php
؛ لن يكون في أي سمة أو مجلد مكون إضافي - راقب التغييرات في
wp-db.php
لأنها قد تؤثر على فصلك المخصص (على الرغم من أن هذا غير مرجح للغاية)