Skip to content

سلام

چند وقت قبل یه پروژه داشتم که کارفرما میخواست پلاگینی براش بنویسم. خب طبق معمول پلاگین نیازمند ذخیره اطلاعات بود. طبق درخواست کارفرما جدول جدیدی توی دیتابیس وردپرس ساخته شد و اطلاعات وارد این جدول شد. در حالی که تقریبا همیشه از 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 کار کرده باشید میدونید که میشه بین جدول‌ها ارتباط برقرار کرد و در صورتی که به این روابط نیاز داشته باشید دستتون به اندازه کافی باز هست که هر جور میخواید کدش رو بنویسید. و اگه تداخلی باشه فقط توی ممکنه توی اسم ستون‌ها یا کدی که مینویسید باشه.

نتیجه گیری کلی

طبق چیزی که من تجربه کردم اینجور بود که خود پروژه بازدهی بهتری نسبت به استفاده از آپشن‌ها و متاها داشت. اما به زحمتش نمی ارزید. اگه قرار باشه حق انتخاب داشته باشم که از کدوم روش استفاده کنم مطمئنا استفاده از آپشن‌ها و متاها رو انتخاب میکنم. چون زمان خیلی کمتری میبره در عین حال بازدهی تقریبا یکسانی هم داره. از طرفی وردپرس هم جوری طراحی شده که بتونه با حجم زیادی از اطلاعات کار کنه و مشکلی نداشته باشه.

بقیه مقالات مفید درباره wpdb

محمدجعفر خواجه

سال 93 شروع به یادگیری و برنامه نویسی وب کردم. دو سال بعد شروع به یادگیری برنامه نویسی وردپرس کردم. سال 97 برای دانشگاه قبول شدم و زندگی توی یه شهر دیگه هزینه‌هایی داشت. تصمیم گرفتم شروع به پروژه گرفتن کنم و از اونجا بود که برنامه نویسی وردپرس رو بصورت حرفه‌ای دنبال کردم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.