การสร้างตารางของตัวเองสำหรับปลั๊กอินเป็นเรื่องที่ผิดหรือ


11

ถ้าฉันต้องการบันทึกการตั้งค่าสำหรับปลั๊กอินของฉันมันเป็นเรื่องง่ายและตรงไปตรงมา

ตอนนี้ฉันต้องการบันทึกลงในฐานข้อมูลอีกเล็กน้อย

ชื่อไฟล์และ 3 ค่าอื่น ๆ ที่ใช้กับไฟล์นั้นเท่านั้น และมีไฟล์จำนวนมากที่มีค่าเหล่านั้น เป็นไปได้หรือไม่ที่จะบันทึกชนิดย่อยของ subarrays โดยใช้วิธีการสร้างฐานข้อมูล? ฉันจะลบและเรียงลำดับ ฯลฯ ได้อย่างไร

คำตอบ:


13

ฉันไม่ค่อยเห็นด้วยกับผู้ใช้ที่มีความรู้เป็นอย่างอื่น แต่ในกรณีนี้ฉันไม่สามารถช่วยได้ ในความคิดของฉันเรียกการใช้ตารางฐานข้อมูลที่ไม่ใช่หลักปฏิบัติที่ไม่ถูกต้องต่อ se เป็นเพียงผิด

ตัวเลือกว่าจะไปกับตารางหลักหรือเพิ่มของคุณเองขึ้นอยู่กับปัจจัยหลายประการ

เวลาดำเนินการของแบบสอบถามขึ้นอยู่กับขนาดของตาราง ดังนั้นหากคุณวางแผนที่จะเก็บข้อมูลจำนวนมากตารางแยกต่างหากสำหรับชุดข้อมูลเฉพาะประเภทนี้ย่อมเป็นโซลูชันที่มีประสิทธิภาพมากขึ้นอย่างหลีกเลี่ยงไม่ได้

หากคุณเก็บโพสต์หรือ CPT ปกติจำนวนมากข้างชุดข้อมูลเฉพาะเหล่านี้wp_postsรวมทั้งwp_postmetaสามารถเติบโตได้อย่างรวดเร็ว

ในที่สุดตัวเลือกนี้ขึ้นอยู่กับว่า "posty" ข้อมูลเป็นอย่างไร มันควรสนับสนุนผู้เขียนความเห็นการแก้ไขข้อความที่ตัดตอนมาหรือไม่ชอบ? ถ้าเป็นเช่นนั้นฉันจะไปด้วย CPT และ / หรือฟังก์ชั่นหลัก ถ้าไม่ฉันจะไปกับตารางแยกเพื่อประโยชน์ในการใช้ทรัพยากรและประสิทธิภาพ

หากความคิดของยูจีนถูกต้องไม่มีปลั๊กอินที่เขียนดีอยู่แล้วจะเพิ่มตารางของตัวเองซึ่งโชคดีที่ไม่ใช่กรณีนี้


ฉันไม่สามารถลงคะแนนนี้ " สิ่งที่คุณสบายที่สุด " ไม่ใช่ข้อพิจารณาที่ถูกต้อง มีกรณีการใช้งานที่ถูกต้องสำหรับการใช้ตารางแยกต่างหาก แต่สำหรับปลั๊กอินส่วนใหญ่แนวปฏิบัติที่ดีที่สุดจะกำหนดโดยใช้ตาราง core WP DB
Chip Bennett

2
Fair enuff @ChipBennett - ไม่ควรเป็นส่วนหนึ่งของการให้เหตุผลหรือไม่ใช่ "การให้เหตุผล" ในตอนแรก แก้ไขและนำออกแล้ว (ยังไม่คาดหวังว่า upvote - ตัวแทนจะไม่เป็นแรงจูงใจ แต่เพียงผู้เดียว)
Johannes Pille

1
+1 ฉันคิดว่ามันเป็นคำตอบที่สมเหตุสมผลและคิดอย่างดี :)
Chip Bennett

5

การใช้ตาราง WP core DB เป็นแนวปฏิบัติที่เหมาะสมที่สุด

  1. การใช้ตารางฐานข้อมูลหลักทำให้ข้อมูลของคุณพกพาได้ง่ายขึ้นและสำรองข้อมูลได้ง่ายขึ้นเนื่องจากมันจะถูกจัดการโดยผู้ส่งออกหลัก / ผู้นำเข้าเช่นเดียวกับปลั๊กอินสำรองข้อมูลจำนวนมาก
  2. โดยใช้ตารางฐานข้อมูลหลักทำให้ข้อมูลของคุณง่ายขึ้นและปลอดภัยมากขึ้นในการจัดการตั้งแต่คุณจะสามารถเข้าถึงได้ง่ายขึ้นกับฟังก์ชั่นหลัก WordPress ต่างๆที่เกี่ยวข้องกับการสอบถามเพิ่มการปรับเปลี่ยนการลบและการฆ่าเชื้อข้อมูล DB โดยเฉพาะอย่างยิ่งผ่านที่มีประสิทธิภาพมากในชั้นเรียน$wpdb
  3. การใช้ตารางฐานข้อมูลหลักสนับสนุน / อำนวยความสะดวกแนวปฏิบัติที่ดีที่สุดสำหรับการจำแนกข้อมูลและการจัดเก็บข้อมูลเช่นการจัดเก็บตัวเลือกปลั๊กอินเป็นอาร์เรย์ในแถวเดียวในwp_optionsและโดยการบังคับให้ผู้พัฒนาปลั๊กอินพิจารณาประเภทของข้อมูลที่สร้าง / จัดเก็บอย่างรอบคอบ CPT? มันเป็นอนุกรมวิธานหรือไม่? มันโพสต์เมตาหรือไม่
  4. ปลั๊กอินของคุณมีโอกาสน้อยที่จะทิ้ง cruft ไว้เมื่อใช้ตาราง core DB

WordPress จัดให้มีวิธีสำหรับปลั๊กอินเพื่อเพิ่มตารางไปยังฐานข้อมูลของมัน

อย่างไรก็ตามสำหรับกรณีการใช้งานที่จำเป็นต้องใช้ตาราง DB แยกต่างหากให้แน่ใจว่าใช้วิธีที่ WordPress จัดเตรียมไว้สำหรับการเพิ่มตารางที่กำหนดเองของคุณไปยังฐานข้อมูล WordPressโดยเฉพาะเพื่อให้คุณสามารถใช้ประโยชน์จาก$wpdbคลาสที่ทรงพลัง บันทึกข้อมูล / คำเตือนรายการรายการ Codex นี้:

  • ข้อมูลการตั้งค่า - ตัวเลือกผู้ใช้ที่ป้อนเมื่อผู้ใช้ตั้งค่าปลั๊กอินของคุณเป็นครั้งแรกและไม่ได้มีแนวโน้มที่จะเติบโตมากไปกว่านั้น (ตัวอย่างเช่นในปลั๊กอินที่เกี่ยวข้องกับแท็กตัวเลือกของผู้ใช้เกี่ยวกับรูปแบบของแท็กคลาวด์ แถบด้านข้าง) โดยทั่วไปข้อมูลการตั้งค่าจะถูกเก็บไว้โดยใช้กลไกตัวเลือก WordPress

  • ข้อมูล - ข้อมูลที่ถูกเพิ่มเมื่อผู้ใช้ยังคงใช้ปลั๊กอินของคุณซึ่งโดยทั่วไปแล้วจะเป็นการขยายข้อมูลที่เกี่ยวข้องกับการโพสต์หมวดหมู่การอัปโหลดและส่วนประกอบ WordPress อื่น ๆ (ตัวอย่างเช่นในปลั๊กอินที่เกี่ยวข้องกับสถิติการดูหน้าเว็บต่างๆ และสถิติอื่น ๆ ที่เกี่ยวข้องกับแต่ละโพสต์ในเว็บไซต์ของคุณ) ข้อมูลสามารถจัดเก็บในตาราง MySQL แยกต่างหากซึ่งจะต้องมีการสร้าง อย่างไรก็ตามก่อนที่จะกระโดดเข้ามาพร้อมกับตารางใหม่ทั้งหมดให้พิจารณาว่าการจัดเก็บข้อมูลปลั๊กอินของคุณใน WordPress 'Post Meta (หรือฟิลด์ที่กำหนดเอง) จะทำงานได้หรือไม่ Post Meta เป็นวิธีการที่ต้องการ ใช้เมื่อเป็นไปได้ / ในทางปฏิบัติ

ดังนั้นเราสามารถสรุปได้ดังต่อไปนี้:

  1. การจัดเก็บข้อมูล (ตั้งค่าหรือสร้างโดยผู้ใช้) ในตาราง WP หลักเป็นวิธีปฏิบัติที่ดีที่สุด
  2. มีกรณีการใช้งานที่ถูกต้องสำหรับการสร้างตารางฐานข้อมูลที่กำหนดเอง; ดังนั้นตารางฐานข้อมูลการสร้างที่กำหนดเองไม่สามารถถือได้ว่าเป็นธรรมชาติปฏิบัติไม่ดี
  3. เมื่อสร้างตารางฐานข้อมูลที่กำหนดเอง WordPress ให้การใช้งานที่ดีที่สุด

ฉันสามารถลงคะแนนนี้ ;-) +1 สำหรับการกล่าวถึงอย่างชัดเจน$wpdb(การใช้ประโยชน์จากการใช้งานกับตารางที่ไม่ใช่แกนหลักมีนัยในคำตอบของฉันไม่อยากพลาดชั้นนั้น)
โยฮันเนสปิลล์

2
ฉันเคยคิดว่า "ตารางฐานข้อมูลตัวเอง" โดยนัยตารางนอกฐานข้อมูล WP ; เมื่อฉันผ่านจุดอับของข้อสันนิษฐานผิดไปคำถาม (และคำตอบ / ความคิดเห็น) ก็ชัดเจนยิ่งขึ้น :)
Chip Bennett

1

ตารางฐานข้อมูลที่ไม่ใช่แกนหลักเป็นสิ่งจำเป็นหากข้อมูลของคุณมีความซับซ้อนมากกว่ารุ่น WordPress โพสต์มันจะมีขนาดใหญ่มากและมีรายละเอียดเมตาจำนวนมากซึ่งจะทำการค้นหา

รูปแบบ EAV ที่ WordPress ใช้สำหรับโพสต์เมตาดาต้านั้นไม่ได้ให้ผลดีในการค้นหาแบบหลายเกณฑ์

หากคุณแบ่งเมตาของคุณออกเป็นหลาย ๆ รายการคุณจะมีหลายรายการต่อโพสต์ในตารางโพสต์เมตาและการค้นหาโพสต์ใด ๆ ผ่านเมตาจะช้ากว่ามาก

หากคุณเก็บเมตาทั้งหมดที่เรียงลำดับในอาร์เรย์และให้เป็นรายการเดียวในโพสต์เมตาคราวนี้คุณจะถูกบังคับให้ค้นหาเฉพาะข้อความภายในเมตานั้นและคุณจะไม่สามารถใช้ตัวดำเนินการเปรียบเทียบโดยตรงในแบบสอบถาม SQL ของคุณ

ไม่ใช่ปัญหาใหญ่ถ้าปลั๊กอินของคุณจะไม่มีรายการนับพันและเมตาที่เกี่ยวข้อง

แต่ปัญหาสำคัญถ้าปลั๊กอินของคุณกำลังจะทำสิ่งที่มีขนาดใหญ่


สถานการณ์ของคุณชื่อไฟล์เป็นรายการอิสระและรายการข้อมูลเมตา 3 รายการที่แนบมากับรายการนั้นดูไม่ใหญ่นัก คุณสามารถใช้ wordpress post table และ meta table ได้

แต่ถ้าผู้คนกำลังค้นหา metas ทั้ง 3 นี้มากโดยเฉพาะอย่างยิ่งร่วมกันดังนั้นฉันขอแนะนำให้คุณตั้งค่าตารางแยกต่างหาก

ด้วยรูปแบบนั้นมีเพียงหนึ่งตารางที่มีเพียงหนึ่งรายการซึ่งยังมีเมตาทั้งหมดจะตกลงและจะทำการค้นหาอย่างรวดเร็ว

อนึ่งหากคุณใช้ตาราง WordPress และคุณใช้การแคชแบบสอบถามผู้ใช้ค้นหาข้อมูลของคุณจะได้รับแคชเมื่อเวลาผ่านไปและมีภาระน้อยลง แต่นั่นคงไม่รอบคอบเท่าการทำตารางแยกกัน


0

คุณสามารถอัปโหลดไฟล์ของคุณลงในไลบรารีสื่อ แต่ละรายการในไลบรารีสื่อจะถูกเก็บไว้ในwp_postsตาราง หมายความว่าแต่ละไฟล์สามารถมีข้อมูลเมตา คุณสามารถบันทึกเป็นข้อมูลมากเท่าที่คุณต้องการต่อแต่ละไฟล์ในwp_postmetaตารางโดยใช้API ข้อมูลเมตา

การสร้างตารางของตัวเองสำหรับปลั๊กอินเป็นเรื่องที่ผิดหรือ

ใช่มันเป็นวิธีปฏิบัติที่ไม่ดีในการสร้างตารางของตัวเองหากคุณสามารถใช้ฟังก์ชันการทำงานหลักแทน


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_action ('init', อาร์เรย์ ('TMM', 'register'), 1);
  • และเพิ่มสำหรับ ajax: add_action ('wp_ajax_change_options', อาร์เรย์ ('TMM', 'change_options'));
  • ในการรับตัวเลือกที่คุณต้องการใช้สิ่งนี้ (ตัวอย่าง): $ logo_img = TMM :: get_option ('logo_img');
  • ใช้มันเพื่อบันทึกตัวเลือกของคุณด้วยวิธีการ WordPress พื้นเมือง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.