डेटाबेस को संशोधित करने वाले वर्डप्रेस प्लगइन अपडेट को कैसे लागू किया जाए?


10

मैं एक वर्डप्रेस प्लगइन विकसित करता हूं, जिसमें स्वयं के कई डेटाबेस टेबल हैं। प्लगइन सक्रिय होने पर इन तालिकाओं को बनाता है, और हटाए जाने / अनइंस्टॉल होने पर उन्हें हटा देता है।

मुझे प्लगइन की एक अपडेट प्रक्रिया को लागू करना होगा जो प्लगइन के कोड के साथ-साथ टेबल संरचना को भी अपडेट करता है। सबसे सरल मामला तालिकाओं में से एक में एक नया कॉलम जोड़ना होगा। अधिक जटिल मामला एक नया टेबल संरचना बनाने और तदनुसार सामग्री को अपडेट करने का होगा।

आप इस समस्या को हल करने के लिए कैसे सुझाव देंगे? क्या कोई अंतर्निहित वर्डप्रेस फ़ंक्शन है जो मदद कर सकता है?

जवाबों:


4

इन दिनों ऐसा करने का सही तरीका यह है कि आप अपने स्कीमा को प्लगइन स्रोत में एक फ़ाइल के रूप में शामिल करें और उस योजना का उपयोग करके डेटाबेस को अपडेट करने के लिए इनबिल्ट वर्डप्रेस फ़ंक्शन dbDelta () का उपयोग करें। वास्तविक कोड बहुत सरल है:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );

यह आपके लिए आवश्यकतानुसार डेटाबेस का निर्माण और अद्यतन दोनों करेगा। जब मैंने पिछली बार जाँच की थी तो यह पुराने अप्रयुक्त स्तंभों को नहीं हटाता है, इसलिए आपको इसके लिए संस्करण जाँच के जरिए कोड करना होगा। यह वर्डप्रेस की एक सुंदर विशेषता और बहुत बड़ा समय है। जब आप mysql स्कीमा निर्यात में रिक्ति को कॉपी करते हैं तो स्कीमा.sql फ़ाइल बनाते समय सावधान रहें क्योंकि dbDelta () कोड रिक्ति के बारे में बहुत उधम मचाते हुए प्रतिष्ठित है। आपको डेटाबेस के संस्करण का भी परीक्षण करना चाहिए, और यदि यह नवीनतम नहीं है, तो डेटाबेस को अपडेट करने के लिए ऊपर कॉल करें। आपको उन परिवर्तनों को कवर करने के लिए विशिष्ट अपडेट करने की आवश्यकता हो सकती है जो dbDelta () सही नहीं मिलते हैं (जैसे स्तंभ हटाना)। यह देखना आसान है कि यदि संस्करण अपडेट हो गया है या नहीं और $ wpdb के माध्यम से ये मैनुअल अपडेट करने के लिए परीक्षण करें तो एक साधारण तार्किक लिखना आसान है। उदाहरण के लिए, आप एक स्तंभ को छोड़ सकते हैं जो अब अप्रयुक्त है।

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);

यह चल रहे कोड से सरलीकृत है, माफी अगर मैंने इसे प्रकाशन के लिए सरल बनाने की प्रक्रिया में इसे तोड़ दिया है।

यह भी ध्यान रखें कि वर्डप्रेस 3.9.2 के रूप में, वर्डप्रेस हमेशा प्लगइन को अपडेट करने पर सक्रियण हुक नहीं चलाता है (विशेषकर, यदि डैशबोर्ड अपडेट पेज से एक बड़े पैमाने पर अपडेट किया जाता है)।


इन दिनों मैंने moda.sql फ़ाइल के मॉड समय से DB का संस्करण लेना शुरू कर दिया है। इसका मतलब यह है कि सिर्फ स्कीम को अपडेट करना। एसक्यूएल फ़ाइल डेटाबेस अपग्रेड का कारण बनने के लिए पर्याप्त है; डेटाबेस संस्करण को संपादित करने के लिए याद रखने की आवश्यकता नहीं है। कुछ इस तरह: $ db_version = filemtime ("schema.sql");
ब्रायन सी।

1
तो, अगर फ़ाइल का समय कुछ बाहरी से बदलता है जैसे कि मूविंग सर्वर, माइम और डीबी संस्करण बदलते हैं?
वॉल्फ

फ़ाइल का समय हमेशा जीएमटी में होता है, और सर्वर शायद ही कभी कुछ सेकंड से भिन्न होते हैं, इसलिए यह लगभग असंभव है कि यह दो बार ट्रिगर हो जाएगा। हालांकि, भले ही यह फिर से ट्रिगर हो जाए, कोई नुकसान नहीं होता है क्योंकि यह एक बार चलता है और लाइव डीबी के खिलाफ तुलना करता है, जाहिर है कि कुछ भी बदलने से। यह dbDelta () के बारे में सुंदर बात है - यह समस्या के बिना कई बार चल सकता है। अच्छा सवाल, धन्यवाद।
ब्रायन सी

3

संक्षेप में, हाँ - $wpdbवर्ग। अधिक जानकारी के लिए कोडेक्स देखें

जब भी आप एक कस्टम टेबल (या किसी भी टेबल, वास्तव में) के साथ बातचीत करते हैं, तो आपको गुजरना चाहिए $wpdb- विशेष रूप से सुनिश्चित करें कि आप उस prepareविधि से परिचित हैं जो प्रश्नों से बचने और इंजेक्शन को रोकने में मदद कर सकती है।

आपको पहले से ही परिचित होना चाहिए, क्योंकि आपको तालिका बनाने के लिए इसका उपयोग करना चाहिए। अपने स्थापित हुक पर आपको कुछ इस तरह होना चाहिए:

$charset_collate = '';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);

यह कोड वास्तव में चलाया जाता है जब भी प्लग-इन सक्रिय होता है (यानी अभी स्थापित नहीं है)। तो यह तब चलेगा जब कोई प्लग-इन को अपने आप अपडेट कर देगानोट: यदि वे प्लग-इन को मैन्युअल रूप से बदलकर अपग्रेड करते हैं - तो यह नहीं होगा - इसलिए admin_initजब आपका प्लग-इन अपग्रेड किया जाएगा तो आपको उपरोक्त कोड को ट्रिगर करना होगा (विकल्प तालिका में स्टोर संस्करण संख्या, वर्तमान संस्करण के खिलाफ जांच करें) ।

अब आप सामान्य रूप से नहीं चाहेंगे कि CREATE TABLESQL कमांड हर बार जब आप प्लग-इन को अपडेट करते हैं तो यह चालू हो dBDelta()

उपरोक्त कमांड चलाने से पहले - यह जाँचता है कि क्या तालिका मौजूद है। क्या अधिक है, यह कॉलम प्रकारों की जांच करता है। इसलिए यदि तालिका मौजूद नहीं है, तो वह इसे बनाता है, यदि यह करता है, लेकिन कुछ स्तंभ प्रकारों ने इसे बदल दिया है, और यदि कोई स्तंभ मौजूद नहीं है - तो यह इसे जोड़ता है।

दुर्भाग्य से - यदि आप ऊपर से एक कॉलम निकालते हैं, तो यह कॉलम को स्वचालित रूप से नहीं हटाता है। स्तंभों / तालिकाओं को निकालने के लिए आपको विशेष रूप से DROPउन्हें (आपके द्वारा करने से पहले मौजूद होने की जाँच करना) चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.