سلام
چند وقت قبل یه پروژه داشتم که کارفرما میخواست پلاگینی براش بنویسم. خب طبق معمول پلاگین نیازمند ذخیره اطلاعات بود. طبق درخواست کارفرما جدول جدیدی توی دیتابیس وردپرس ساخته شد و اطلاعات وارد این جدول شد. در حالی که تقریبا همیشه از options و متا ها استفاده میکردم. برام این سوال پیش اومد که چرا کارفرما بخواد جدول جدید توی دیتابیسش ساخته بشه؟ چه تاثیری داره؟ امنیتش چطور میشه؟ اختلالی پیش نمیاد؟ و کلی سوال دیگه…
چرا باید جدول جدید ساخته بشه؟
نتیجه تستهایی که انجام دادم اینجور شد که سرعت دریافت اطلاعات از جدولی که ساختیم بالاتر بود. البته انتظار اینو هم داشتم. چون جدولهای wp_options و متاها به اندازه کافی شلوغ هست. البته سرعت به قدری نبود که حتی به چشم بیاد و با اختلاف خیلی خیلی اندک بود.
کدنویسیش چطور هست؟
وردپرس برای کار با دیتابیس از یه کلاس استفاده میکنه به نام wpdb این کلاس کلی متد و تابع داره که نوشتن دستورات SQL رو خیلی راحت میکنه. حالا چه برای گرفتن اطلاعات چه برای ثبت و آپدیت اطلاعات.
هر جدول وردپرس یه پیشوند(prefix) داره. همونطور که احتمالا میدونید این پیشوند رو موقع نصب وردپرس مشخص میکنیم.
نکته امنیتی: موقعی که دارید وردپرس رو نصب میکنید بهتره این پیشوند رو یه چیز دیگه به جز wp_ بزارید.
ثابت prefix ثابتی هست که این پیشوند توش ذخیره میشه و هر جا لازم بود میتونید ازش استفاده کنید.
<?php
global $wpdb;
$wpdb->prefix;
برای آشنایی کامل با کلاس wpdb بهتره که مقالاتی که دربارش هست و داکیومنت خودش رو بخونید. داکیومنت wpdb
ساخت یک مجموعه کد که حالت CRUD(Create, Read, Update, Delete) رو ایجاد کنه کمی زمانبر هست. حتی شاید لازم داشته باشید که بر اساس شرایطی که اونموقع توش هستید یکی از این حالتها رو دستکاری کنید. یعنی هربار باید متغییری، شرایط ویژهای یا هر چیز دیگه ای به این سیستمتون اضافه کنید. اینکار هم باعث میشه کد پیچیده بشه، هم حوصله سر بره هم ممکنه باعث ایجاد باگ بشه.
امنیت جدولی که ساختیم چطوره؟
خب از نظر امنیتی سطح خیلی پایینتری نسبت به جدولهای خود وردپرس داشت. باید امنیتش از طریق کدهایی که مینوشتم تامین میشد که یه موقع SQL Injection رخ نده. خوشبختانه کلاس wpdb وردپرس خودش متدی برای این کار داره. در حالی که ذخیره اطلاعات توی جدولهای وردپرس با استفاده از توابع خود وردپرس نیازمند هیچ کار خاصی نیست.
همچنین باید کد SQL رو به اندازه کافی هوشمندانه بنویسیم که خود کد SQL ما هم از نظر امنیتی مشکلی نداشته باشه.
متدی که کلاس wpdb برای جلوگیری از خطاهای مختلف موقع کار با جدولها داره متد prepare هست. با این متد شما لازم نیست موقعی که شرایط where رو مینویسید. مقادیر رو مستقیم به استرینگ SQL بدید و میتونید جداگانه بهش بدید که اول sanitize ها و تغییرات موردنیاز روی این مقدار انجام بشه که خطایی رخ نده:
<?php
$wpdb->prepare(
"SELECT * FROM {$wpdb->posts} WHERE `post_date` > %1$s AND `post_title` LIKE %2$s OR `post_content` LIKE %3$s",
$post_date,
$search_string,
$search_string
);
کد بالا پستهایی از سایت رو که تاریخشون از یه تاریخی به بعد هست و توی عنوان یا متنشون یه عبارت خاص هست رو بر میگردونه. اما همونطور که میبینید متغییرها مستقیم به دستور وارد نشدن.
تداخلی با بقیه جدولها نداره؟
بصورت کلی نه تداخلی نداره. خب اگه SQL کار کرده باشید میدونید که میشه بین جدولها ارتباط برقرار کرد و در صورتی که به این روابط نیاز داشته باشید دستتون به اندازه کافی باز هست که هر جور میخواید کدش رو بنویسید. و اگه تداخلی باشه فقط توی ممکنه توی اسم ستونها یا کدی که مینویسید باشه.
نتیجه گیری کلی
طبق چیزی که من تجربه کردم اینجور بود که خود پروژه بازدهی بهتری نسبت به استفاده از آپشنها و متاها داشت. اما به زحمتش نمی ارزید. اگه قرار باشه حق انتخاب داشته باشم که از کدوم روش استفاده کنم مطمئنا استفاده از آپشنها و متاها رو انتخاب میکنم. چون زمان خیلی کمتری میبره در عین حال بازدهی تقریبا یکسانی هم داره. از طرفی وردپرس هم جوری طراحی شده که بتونه با حجم زیادی از اطلاعات کار کنه و مشکلی نداشته باشه.
مائده استیری
۱۰ دی ۱۴۰۲ @ ۱۱:۲۴ ق٫ظ
سلام وقت بخیر من تازه وردپرس رو شروع کردم. یه پایگاه داده دارم و جدول هایی که نیاز دارم فروشنده، محصول، مشتری و خرید.
آیا باید خودم جدول بسازم یا از جدول های پیش فرض خود وردپرس استفاده کنم.
نکته: افزونه ووکامرس و دکان هم دارم اصن نیاز دوباره جدول محصول و مشتری بسازم؟
محمدجعفر خواجه
۱۳ دی ۱۴۰۲ @ ۷:۴۲ ب٫ظ
سلام. بسیار عالی. همین جواب رو برات ایمیل هم کردم:
وقتی ووکامرس نصب میشه، برای محصول و مشتری جدول جدید نمیسازه. بلکه محصولات به عنوان پست توی جدول posts ذخیره میشن و مشتری ها هم توی جدول users به عنوان یوزر معمولی هستن با نقش مشتری.
نیازی نمیبینم جدول جدید نیاز باشه