क्या एक प्लगइन के लिए खुद की टेबल बनाना बुरा अभ्यास है?


11

अगर मैं अपने प्लगइन के लिए सेटिंग्स को सहेजना चाहता हूं तो यह बहुत आसान और सीधे आगे है।

अब मैं डेटाबेस को थोड़ा और बचाना चाहूंगा।

एक फ़ाइल का नाम, और 3 अन्य मान जो केवल उस फ़ाइल पर लागू होते हैं। और उन मूल्यों के साथ कई फाइलें हैं। क्या डेटाबेस विधियों में निर्मित उपयोग करके इस तरह के सबरेज़ को बचाना संभव है? मैं उन्हें कैसे हटा सकता हूं और छाँट सकता हूं आदि?

जवाबों:


13

मैं शायद ही अन्यथा जानकार उपयोगकर्ताओं से असहमत हूं, लेकिन इस मामले में मैं इसकी मदद नहीं कर सकता। मेरी राय में गैर-मुख्य डेटाबेस तालिकाओं के उपयोग को प्रति सेहत के लिए बुरा अभ्यास कहना केवल गलत है।

कोर टेबलों के साथ जाने या अपना खुद का जोड़ने का विकल्प कई कारकों पर निर्भर करता है।

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

यदि आप इन विशिष्ट डेटा सेटों के साथ कई नियमित पोस्ट या CPT संग्रहीत करते हैं, wp_postsसाथ ही साथ wp_postmetaजल्दी से बढ़ सकते हैं।

मेरे लिए, यह विकल्प अंततः इस बात पर निर्भर करता है कि डेटा "पोस्टी" कैसे है। क्या यह एक लेखक, टिप्पणी, संशोधन, अंश या इस तरह का समर्थन करना चाहिए? यदि हां, तो मैं सीपीटी और / या कोर कार्यक्षमता के साथ जाऊंगा। यदि नहीं, तो मैं संसाधन उपयोग और दक्षता के लिए अलग-अलग तालिकाओं के साथ जाऊँगा।

यदि यूजीन की धारणा सही थी, तो मौजूदा अच्छी तरह से लिखे गए प्लगइन्स में से कोई भी अपनी टेबल नहीं जोड़ेगा, जो सौभाग्य से ऐसा नहीं है।


मैं इसे बढ़ा नहीं सकता। " आप जिस चीज के साथ सबसे अधिक सहज हैं " बिल्कुल वैध विचार नहीं है। अलग-अलग तालिकाओं का उपयोग करने के लिए वैध उपयोग के मामले हैं, लेकिन अधिकांश प्लगइन्स के लिए, कोर WP DB तालिकाओं का उपयोग करके सबसे अच्छा अभ्यास निर्धारित होता है।
चिप बेनेट

2
Fair enuff @ChipBennett - कि कंधा तर्क का हिस्सा नहीं है, या पहली जगह में "तर्क" नहीं है। संपादित और हटाया (फिर भी अपवोट की उम्मीद नहीं करना - प्रतिनिधि वैसे भी एकमात्र प्रेरणा नहीं है)।
जोहान्स पिल

1
+1। मुझे लगता है कि यह एक उचित, सुविचारित उत्तर है। :)
चिप बेनेट

5

WP कोर DB तालिकाओं का उपयोग करना सबसे अच्छा अभ्यास है

  1. कोर डीबी टेबल का उपयोग करना आपके डेटा को अधिक पोर्टेबल बनाता है , और बैकअप के लिए आसान है, क्योंकि यह कोर निर्यातक / आयातक द्वारा और साथ ही असंख्य बैकअप प्लगइन्स द्वारा नियंत्रित किया जाएगा।
  2. कोर डीबी टेबल का उपयोग करना आपके डेटा को आसान बनाता है और चालाकी से सुरक्षित करता है , क्योंकि आपके पास विशेष रूप से बहुत शक्तिशाली $wpdbवर्ग के माध्यम से डीबी डेटा को क्वेरी करने, जोड़ने, संशोधित करने, हटाने और स्वच्छता से संबंधित विभिन्न वर्डप्रेस कोर कार्यों के लिए अधिक सहज पहुंच होगी ।
  3. कोर डीबी तालिकाओं का उपयोग डेटा वर्गीकरण और भंडारण के लिए सर्वोत्तम प्रथाओं को प्रोत्साहित / सुविधाजनक करता है , जैसे कि एक पंक्ति में एक सरणी के रूप में प्लगइन विकल्प संग्रहीत करना wp_optionsऔर प्लगइन डेवलपर को ध्यान से विचार करने के लिए मजबूर करना कि किस प्रकार का डेटा बनाया / संग्रहीत किया जा रहा है - क्या यह एक प्रकार है सीपीटी? क्या यह एक वर्गीकरण है? क्या यह पोस्ट मेटा है?
  4. कोर डीबी तालिकाओं का उपयोग करते समय आपके प्लगिन को क्रॉफ्ट के पीछे छोड़ने की संभावना कम होती है

WordPress अपने डेटाबेस में तालिकाओं को जोड़ने के लिए प्लगइन्स के लिए एक साधन प्रदान करता है

हालांकि, उन उपयोग मामलों के लिए जहां एक अलग डीबी टेबल की आवश्यकता होती है, वर्डप्रेस डेटाबेस में अपनी कस्टम टेबल को जोड़ने के लिए वर्डप्रेस द्वारा प्रदान की जाने वाली विधि का उपयोग करना सुनिश्चित करें , खासकर ताकि आप शक्तिशाली $wpdbवर्ग का लाभ उठा सकें । इस कोडेक्स प्रविष्टि सूचियों की जानकारी / जानकारी पर ध्यान दें:

  • सेटअप जानकारी - उपयोगकर्ता की पसंद, जो तब दर्ज की जाती है जब उपयोगकर्ता आपके प्लगइन को पहली बार सेट करता है, और इससे बहुत आगे नहीं बढ़ता है (उदाहरण के लिए, टैग से संबंधित प्लगइन में, उपयोगकर्ता के विकल्पों के टैग क्लाउड के प्रारूप के बारे में साइडबार)। सेटअप जानकारी आम तौर पर वर्डप्रेस विकल्प तंत्र का उपयोग करके संग्रहीत की जाएगी।

  • डेटा - उपयोगकर्ता के रूप में जोड़ी जाने वाली जानकारी आपके प्लगइन का उपयोग करना जारी रखती है, जो आम तौर पर पोस्ट, श्रेणियों, अपलोड और अन्य वर्डप्रेस घटकों से संबंधित जानकारी का विस्तार किया जाता है (उदाहरण के लिए, आंकड़े से संबंधित प्लगइन में, विभिन्न पृष्ठ दृश्य, संदर्भकर्ता , और आपकी साइट पर प्रत्येक पोस्ट से जुड़े अन्य आँकड़े)। डेटा को एक अलग MySQL टेबल में स्टोर किया जा सकता है, जिसे बनाना होगा। हालांकि, एक पूरी नई तालिका के साथ कूदने से पहले, इस पर विचार करें कि क्या वर्डप्रेस पोस्ट मेटा (उर्फ कस्टम फील्ड्स) में आपके प्लगइन का डेटा संग्रहीत होगा। पोस्ट मेटा पसंदीदा तरीका है; जब संभव हो इसका उपयोग करें / व्यावहारिक।

इस प्रकार, हम निम्नलिखित निष्कर्ष निकाल सकते हैं:

  1. कोर WP टेबल में डेटा (सेटअप, या उपयोगकर्ता-जनित) को स्टोर करना सबसे अच्छा अभ्यास है
  2. कस्टम DB टेबल बनाने के लिए मान्य उपयोग-मामले हैं; इसलिए, कस्टम DB टेबल बनाने को एक अंतर्निहित बुरा अभ्यास नहीं माना जा सकता है
  3. कस्टम डीबी टेबल बनाते समय, वर्डप्रेस एक सर्वोत्तम-अभ्यास कार्यान्वयन प्रदान करता है

मैं इसे उभार सकता हूं। ;-) +1 स्पष्ट रूप से उल्लेख करने के लिए $wpdb(इसका उपयोग गैर-कोर तालिकाओं के साथ करना मेरे जवाब में निहित था, उस वर्ग को याद नहीं करना होगा)
जोहान्स पिल

2
मैंने मूल रूप से यह मान लिया था कि WP डेटाबेस के बाहर "खुद के डीबी टेबल" निहित टेबल हैं ; एक बार जब मैंने उस गलत धारणा को खत्म कर दिया, तो सवाल (और उत्तर / टिप्पणी) अधिक स्पष्ट हो गए। :)
चिप बेनेट

1

यदि आपके डेटा वर्डप्रेस पोस्ट मॉडल की तुलना में अधिक जटिल है, तो गैर-कोर डेटाबेस टेबल एक होना चाहिए, यह बहुत बड़ा होने वाला है, और इसमें बहुत सारे मेटा विवरण हैं जो खोजे जाएंगे।

ईएवी प्रारूप वर्डप्रेस अपने पोस्ट मेटा के लिए उपयोग करता है खुद को बहु-मानदंड खोज के लिए अच्छी तरह से उधार नहीं देता है।

यदि आप अपनी मेटा को कई प्रविष्टियों में विभाजित करते हैं, तो आपके पास पोस्ट मेटा टेबल में प्रति पोस्ट की कई प्रविष्टियाँ होंगी, और किसी भी पोस्ट को मेटा के माध्यम से खोजना बहुत धीमा होगा।

यदि आप सभी मेट्रों को क्रम में संग्रहीत करते हैं और इसे पोस्ट मेटा में केवल एक प्रविष्टि के रूप में रखते हैं, तो इस बार आपको उस मेटा के अंदर केवल पाठ खोज करने के लिए मजबूर किया जाएगा, और आप अपने संकलक क्वेरी में सीधे तुलना ऑपरेटरों का उपयोग करने में सक्षम नहीं होंगे।

यदि आपका प्लगइन हजारों प्रविष्टियों और संबद्ध मेटा में नहीं जा रहा है तो कोई बड़ी समस्या नहीं है।

लेकिन एक बड़ी समस्या अगर आपका प्लगइन कुछ भी बड़ा करने जा रहा है।


आपकी स्थिति, स्वतंत्र प्रविष्टि के रूप में एक फ़ाइल नाम और उस प्रविष्टि से जुड़ी 3 मेटा डेटा प्रविष्टियाँ इतनी बड़ी नहीं लगती हैं। आप इसके लिए वर्डप्रेस पोस्ट टेबल और मेटा टेबल का उपयोग कर सकते हैं।

लेकिन, अगर लोग इन 3 मेटा के लिए बहुत खोज करने जा रहे हैं, ESPECIALLY संयोजन के रूप में, तो मैं आपको अलग टेबल सेट करने की सलाह दूंगा।

उस प्रारूप के साथ सिर्फ एक प्रविष्टि के साथ सिर्फ एक तालिका, जिसमें सभी मेटा भी शामिल हैं, ठीक होगा, और तेजी से क्वेरी करेगा।

संयोग से, यदि आप वर्डप्रेस तालिकाओं का उपयोग करते हैं और आप क्वेरी कैशिंग का उपयोग कर रहे हैं, तो आपके डेटा की खोज करने वाले को समय के साथ कैश हो जाएगा और कम भार उठाना पड़ेगा। लेकिन यह अलग तालिकाओं के रूप में इतना विवेकपूर्ण नहीं होगा।


0

आप अपनी फ़ाइलों को मीडिया लाइब्रेरी में अपलोड कर सकते हैं। मीडिया लाइब्रेरी में प्रत्येक आइटम को wp_postsतालिका में संग्रहीत किया जाता है। इसका मतलब है कि प्रत्येक फ़ाइल में मेटा डेटा हो सकता है। आप मेटाडाटा एपीआईwp_postmeta का उपयोग करके तालिका में प्रत्येक फ़ाइल के अनुसार जितनी जानकारी की आवश्यकता है, उसे बचा सकते हैं ।

क्या एक प्लगइन के लिए खुद की टेबल बनाना बुरा अभ्यास है?

हां, स्वयं की तालिका बनाने के लिए यह बुरा अभ्यास है, अगर आप इसके बजाय कोर कार्यक्षमता का उपयोग कर सकते हैं।


3
नहीं, यह एक बुरा अभ्यास नहीं है। जब तक आप धीमी क्वेरी और कसकर-युग्मित कोड को एक अच्छा अभ्यास नहीं मानते हैं।
onetrickpony

0
class TMM {

    public static $options;

    public static function register() {
        self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
    }

    public static function get_option($option) {
        return @self::$options[$option];
    }

    public static function update_option($option, $data) {
        self::$options[$option] = $data;
        update_option($prefix . 'theme_options', self::$options);
    }

    //ajax
    public static function change_options() {

        $action_type = $_REQUEST['type'];
        $data = array();
        parse_str($_REQUEST['values'], $data);
        $data = self::db_quotes_shield($data);

        if (!empty($data)) {
            foreach ($data as $option => $newvalue) {
                if (is_array($newvalue)) {
                    self::update_option($option, $newvalue);
                } else {
                    $newvalue = stripcslashes($newvalue);
                    $newvalue = str_replace('\"', '"', $newvalue);
                    $newvalue = str_replace("\'", "'", $newvalue);
                    self::update_option($option, $newvalue);
                }
            }
        }
        _e('Options have been updated.', TMM_THEME_FOLDER_NAME);
        exit;
    }

    public static function db_quotes_shield($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $data[$key] = self::db_quotes_shield($value);
                } else {
                    $value = stripslashes($value);
                    $value = str_replace('\"', '"', $value);
                    $value = str_replace("\'", "'", $value);
                    $data[$key] = $value;
                }
            }
        }

        return $data;
    }

}

  • कक्षा का नाम मूल है, जैसा आप चाहते हैं, उसका नाम बदलें।
  • फ़ंक्शंस में php add: add_action ('init', array ('TMM', 'register'), 1);
  • और ajax के लिए जोड़ें: add_action ('wp_ajax_change_options', array ('TMM', 'change_options'));
  • विकल्प प्राप्त करने के लिए जहां आपको इसका उपयोग करने की आवश्यकता है (उदाहरण के लिए): $ logo_img = TMM :: get_option ('logo_img');
  • देशी वर्डप्रेस विधियों द्वारा अपने विकल्पों को बचाने के लिए इसका उपयोग करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.