آموزش کار با wpdb در وردپرس

روش‌های مختلفی برای کار با دیتابیس در وردپرس داریم. اگر بخواهیم مستقیماً با دیتابیس در ارتباط باشیم و کوئری‌های خودمان را اجرا کنیم، کلاس wpdb وردپرس به کارمان می‌آید. در این آموزش با این روش آشنا می‌شویم و کاربردی‌ترین استفاده‌های آن را یاد می‌گیریم.

همانطور که احتمالاً می‌دانید، توابع و کلاس‌های مختلفی برای ثبت یا فراخوانی داده از دیتابیس در وردپرس در اختیار داریم. مثلاً از WP_Query برای گرفتن کوئری محتواها در وردپرس استفاده می‌کنیم.

اما گاهی لازم داریم کوئری‌های پیچیده‌تر یا اختصاصی را اجرا کنیم. مثلاً یک افزونه اختصاصی ایجاد کرده‌ایم تا در یک جدول اختصاصی داده‌های ما را ذخیره کنید. در اینصورت wpdb راهکار انتخابی ما خواهد بود.

کلاس wpdb در وردپرس

از این کلاس در هر جایی می‌توانیم استفاده کنیم. در سرتاسر کدهای وردپرس (قالب یا افزونه) به این شیء دسترسی داریم. فقط کافی است آن را با کلمه کلیدی global در محدوده کدمان تعریف کرده و از آن استفاده کنیم.

بنابراین قبل از هر کاری باید به شیء سراسری $wpdb دسترسی پیدا کنیم:

global $wpdb;

کلمه global برای دسترسی به مقادیر سراسری استفاده می‌شود؛ اگر با آن آشنا نیستید آموزش متغیر سراسری در PHP دیدگاه خوبی به شما می‌دهد.

پیشوند جداول پایگاه داده

در وردپرس به‌طور پیشفرض از پیشوند wp_ در نام‌گذاری جداول خود استفاده می‌کند. با این حال به دلیل افزایش امنیت وردپرس یا دلایل دیگر ممکن است این نام‌گذاری در سایت‌های مختلف متفاوت باشد.

بنابراین بهتر است در کوئری‌هایی که روی دیتابیس می‌نویسیم از این پیشوند مستقیماً استفاده نکنیم! (به‌اصطلاح hard code نباشد.)

یک ویژگی مهم در کلاس wpdb وردپرس به نام prefix داریم که پیشوند جداول دیتابیس را از فایل wp-config.php در اختیار ما می‌گذارد. بهتر است در دستورهای دیتابیس از این مقدار استفاده کنیم.

مثلاً برای دسترسی به جدول wp_my_table (که wp_ پیشوند است) به‌صورت زیر عمل می‌کنیم:

global $wpdb;
echo $wpdb->prefix . 'my_table';    // ~ wp_my_table

برای جدول‌های اصلی در ساختار دیتابیس وردپرس ویژگی‌های مخصوصی داریم که اگر مایل بودید می‌توانید از آن‌ها استفاده کنید. مثلاً دو خط زیر معادل هم هستند:

global $wpdb;
echo $wpdb->prefix . 'posts';    // ~ wp_posts
echo $wpdb->posts;    // ~ wp_posts

در ادامه با متدهای کاربردی این کلاس آشنا می‌شویم. اگر نمی‌دانید متد (method) چیست، جلسه تعریف کلاس در PHP از دوره رایگان را به شما پیشنهاد می‌کنم.

کار با دیتابیس wpdb وردپرس

برای کار با دیتابیس در هر سیستمی باید بتوانیم چهار عملیات مختلف را انجام دهیم. این عملیات‌ها اصطلاحاً CRUD نامیده می‌شود که حروف اول کلمات زیر هستند:

  • Create برای ایجاد یک سطر داده جدید
  • Read برای خواندن (فراخوانی) داده‌ها از دیتابیس
  • Update جهت به‌روزرسانی اطلاعات
  • Delete برای حذف رکوردهای داده

اگر با زبان MySQL آشنا باشید، می‌دانید که با کوئری‌های این زبان می‌توانیم همه این کارها را انجام دهیم.

با کلاس wpdb در وردپرس می‌توانیم هر کوئری دلخواهی به زبان MySQL را اجرا کنیم. اما ابتدا سه متد کاربردی و راحت‌تر برای ثبت، آپدیت و حذف رکوردها را بررسی می‌کنیم.

insert در وردپرس

مشابه دستور insert در SQL متدی به نام insert() در wpdb داریم که سه ورودی گرفته و داده‌ها را در جدول موردنظرمان ثبت می‌کند. این ورودی‌ها به ترتیب عبارت‌اند از:

  1. اسم جدول موردنظر

دو ورودی اول اجباری هستند اما می‌توانیم سومی را فقط در مواقع لزوم استفاده کنیم. در قطعه کد زیر یک سطر جدید با سه مقدار در جدول sabzdanesh اضافه کرده‌ام:

<?php
global $wpdb;
$wpdb->insert(
        $wpdb->prefix . 'sabzdanesh',
        array('name' => 'omid',
            'family' => 'rajaei',
            'score' => 18)
);

update ردیف جدول

برای به‌روزرسانی داده‌ها با wpdb از متد update() استفاده می‌کنیم. این متد 5 آرگومان ورودی دارد که ۳ تای اول آن اجباری است و معمولاً هم از همین سه‌تا استفاده می‌شود:

  1. نام جدول
  2. آرایه‌ای از مقادیر (برای آپدیت شدن)
  3. آرایه‌ای از شرط‌ها

در قطعه کد زیر، وضعیت پاسخگویی به یکی از پیام‌های پشتیبانی سایت را (در جدول tickets) تغییر داده‌ام:

<?php
global $wpdb;
$wpdb->update(
        $wpdb->prefix . 'tickets',
        array('status' => 'closed'),
        array('id' => 421)
);

دقت کنید که این آرایه‌های PHP از نوع انجمنی هستند؛ یعنی به‌صورت کلید-مقدار تعریف می‌شوند.

برای آرایه شرط‌ها می‌توانیم از چند مقدار استفاده کنیم. در اینصورت همه شرط‌ها با هم and می‌شوند؛ یعنی مقدار مورد نظر در سطری که مقادیر شرطی‌اش همزمان برابر با شرط‌هایمان باشد آپدیت می‌شود. (مثل مثال زیر)

همینطور می‌توانیم چند مقدار را در یک سطر آپدیت کنیم. (با تعریف چند مقدار در آرایه ورودی دوم)

افزودن سطر جدید با wpdb یا به‌روزرسانی آن در دیتابیس را می‌توانیم برای جداول اصلی وردپرس هم انجام دهیم. مثلاً در زیر، مقدار موجود در یکی از سطرهای جدول postmeta را تغییر داده‌ام.

$wpdb->update(
        $wpdb->postmeta,
        array('meta_value' => 550),
        array('post_id' => 421, 'meta_key' => 'quantity')
);

به این کد دقت کنید و سعی کنید متوجه شوید مقدار کدام meta برای کدام id تغییر که است؟!

delete رکوردهای پایگاه داده

برای حذف یک سطر از دیتابیس با wpdb در وردپرس از متد delete() استفاده می‌کنیم. این متد دو ورودی می‌گیرد. اولین ورودی نام جدول و ورودی دوم آرایه‌ای از شرط‌ها برای مشخص کردن سطر موردنظر است.

در قطعه کد زیر، دیدگاه وردپرسی با شماره 2547 را حذف می‌کنم:

<?php
global $wpdb;
$wpdb->delete(
        $wpdb->comments,
        array('comment_ID' => 2547)
);

اگر با اصول دیتابیس آشنا باشید، می‌دانید که معمولاً برای هر سطر یک مقدار یکتا (unique) در نظر می‌گیریم تا به‌راحتی شناسایی شود. در غیر اینصورت بهتر است مجموعه‌ای از مقادیر در یک سطر، آن سطر را یکتا کند. اگر اینطور نباشد، ممکن است با یک شرط خاص، چندین سطر حذف یا به‌روزرسانی شوند.

فراخوانی داده با wpdb وردپرس

برای خواندن مقادیر از دیتابیس، باید از دستور SELECT استفاده کنیم. ساختار این دستور و ترفندهای آن را می‌توانید در آموزش SELECT در SQL یاد بگیرید.

برای خواندن یک سطر از متد get_row() کمک می‌گیریم. این متد یک کوئری را اجرا کرده و فقط سطر اول از نتایج را به ما بازمی‌گرداند.

$row = $wpdb->get_row(
            "SELECT * FROM {$wpdb_prefix}tickets 
            WHERE last_update = '2022-03-10'" );

echo $row->title;

خروجی این تابع یک شیء است که مقادیر آن سطر در ویژگی‌هایی با نام ستون‌ها در دسترس است. اگر می‌خواهید نوع خروجی متفاوت باشد، می‌توانید به‌عنوان ورودی دوم این متد، یکی از مقادیر زیر را تعریف کنید:

  • OBJECT (شیء – پیشفرض)
  • ARRAY_A (آرایه انجمنی)
  • ARRAY_N (آرایه عددی)

قطعه کد زیر همان کار قبلی را انجام می‌دهد اما نتایج به‌صورت یک آرایه انجمنی در اختیارمان است:

$row = $wpdb->get_row(
            "SELECT * FROM {$wpdb_prefix}tickets 
            WHERE last_update = '2022-03-10'",
            ARRAY_A
            );

echo $row['title'];

سه متد دیگر برای فراخوانی داده داریم. همگی کوئری موردنظرمان را اجرا و نتیجه را برمی‌گردانند؛ با این تفاوت که هر کدام خروجی متفاوتی دارند. در جدول زیر این متدها و خروجی آن‌ها را می‌بینید:

نام متدکار و خروجی
get_var()مقدار عددی نتیجهٔ کوئری
مثلاً هنگام شمارش (COUNT) سطرها
get_col()آرایه‌ای از مقادیر یک ستون خاص از سطرها
get_result()گرفتن هر تعداد سطر و ستون (آرایه چندبعدی)

پیشنهاد می‌کنم برای یادگیری بهتر wpdb در وردپرس سعی کنید نوع خروجی این سه متد را خودتان بررسی کنید. بعد از آن، صفحه مستندات wpdb برای دیدن مثال‌های بیشتر بسیار مفید است.

اجرای کوئری با wpdb

در این بخش ۲ متد اصلی برای اجرای کوئری‌های MySQL در دیتابیس وردپرس را بررسی می‌کنیم. در بخش سوم چهار متد کاربردی برای کار با نتایج داده‌های فراخوانی‌شده معرفی می‌کنم.

متد query در wpdb وردپرس

گاهی نیاز داریم یک کوئری خاص را روی دیتابیس اجرا کنیم. متد query() یک ورودی به‌صورت رشته (string در php) می‌گیرد که همان دستور MySQL است.

این متد نتیجه اجرای کوئری را به‌عنوان خروجی به ما برمی‌گرداند.

در زیر، یک دستور ساده delete برای حذف تیکت‌های پشتیبانی قدیمی نوشته‌ام:

<?php
$wpdb->query( "DELTE * FROM " . $wpdb->prefix . "tickets 
            WHERE last_update < '2018-01-01'
               AND status = 'closed'" );

شما می‌توانید از دستورهای insert، update و select پیچیده‌تری با query() اجرا کنید.

معمولاً زمانی از این متد استفاده می‌کنیم که کوئری‌های ما پیچیده هستند و با متدهای بالا پیاده‌سازی نمی‌شوند. یک نمونه ساده، استفاده از JOIN برای اتصال جداول است.

روش prepare برای افزودن داده

اگر با روش mysqli در PHP یا PDO آشنا باشید، می‌دانید که روشی به نام prepare برای ایمن‌سازی کوئری‌ها در برابر حملات SQL Injection داریم.

اگر می‌خواهید در کوئری‌های مستقیم خود از مقادیر متغیر (مثلاً دریافتی از کاربر) استفاده کنید، بهتر است دستورتان را با متد prepare() ایمن‌سازی کنید.

در آرگومان ورودی اول prepare() کوئری را تعریف کرده و مقادیر نامعلوم را مشخص می‌کنیم. سپس مقادیرمان را در ورودی‌های بعدی می‌دهیم.

قطعه کد زیر مقداری را برای 'meta_key'='test' یک پست خاص ثبت می‌کند. اینجا دو متغیر استفاده شده است:

<?php
// use wpdb prepare example

$pid = $_POST['pid'];
$value = $_POST['value'];

global $wpdb;
$wpdb->query(
    $wpdb->prepare(
        "INSERT INTO {$wpdb->postmeta} 
        (post_id, meta_key, meta_value) 
        VALUES(%d, 'test', %s)"),
        $pid, $value
);

همچنین می‌توانیم متغیرها را به صورت یک آرایه (در ورودی دوم prepare) بدهید؛ مثل:

<?php
// wpdb prepare example with array

$pid = $_POST['pid'];
$value = $_POST['value'];

global $wpdb;
$wpdb->query(
    $wpdb->prepare(
        "INSERT INTO {$wpdb->postmeta} 
        (post_id, meta_key, meta_value) 
        VALUES(%d, 'test', %s)"),
        array( $pid, $value )
);

جایگزین‌هایی که برای متغیر در دستور MySQL استفاده می‌شوند، نوع داده موردنظر را مشخص می‌کنند:

  • %s برای داده رشته‌ای
  • %d عدد صحیح
  • %f عدد اعشاری

نکته wpdb وردپرس

توسعه‌دهندگان وردپرس همیشه استفاده از wpdb را آخرین راه‌حل خود برای اتصال به دیتابیس می‌دانند. البته شاید آخرین راه‌حل اتصال به دیتابیس با PHP باشد!!!

معمولاً توابع مختلفی برای فراخوانی و ثبت داده‌ها در جداول اصلی وردپرس وجود دارد. مثلاً برای آپدیت postmeta که در مثال‌ها آوردم، می‌توانیم از تابع update_post_meta() استفاده کنیم. یا برای دسترسی به پست‌ها از WP_Query کمک بگیریم.

در مجموع می‌توانیم از متد insert() برای ثبت داده، update() برای به‌روزرسانی سطر، delete() برای حذف و get_row() خواندن سطر در شئ $wpdb استفاده کنیم.

امیدوارم در انتها، آشنایی خیلی خوبی با کلاس wpdb وردپرس پیدا کرده باشید. اگر سؤال یا تجربه‌ای در کار با آن دارید، بخش نظرات این آموزش برای شماست. 🙂