دیتابیس وردپرس: مقدمه ای بر کلاس wpdb

کلاس ها و توابع مختلفی برای کار با دیتابیس وردپرس وجود دارد، wp_query، wp_insert_post، update_post_meta و موارد دیگری که می توانید متناسب با نیاز پروژه از آنها استفاده کنید. اما گاهی اوقات روشهای فوق برایتان محدودیت ایجاد می کنند و می خواهید خارج از چهارچوب عمل کنید، به عنوان مثال جداول اختصاصی برای افزونه خود ایجاد نمائید، در چنین مواقعی وردپرس کلاس wpdb را در اختیارتان قرار می دهد.

wpdb چیست؟

کلاس wpdb ابزاری ساده اما قدرتمند برای ارتباط مستقیم با پایگاه داده وردپرس است که می توانید در هر جایی از آن استفاده کنید، wpdb امکان افزودن، بروزرسانی و حذف هرگونه اطلاعاتی را فراهم می کند، ساختار این کلاس را می توانید در فایل wp-db.php داخل دایرکتوری wp-includes مشاهده کنید.

برای استفاده از این کلاس ابتدا باید یک متغیر سراسری به صورت زیر تعریف نمائید.

global $wpdb

توجه داشته باشید که متدهای کلاس wpdb نباید به طور مستقیم فراخوانی شوند، چرا که وردپرس به صورت پیش فرض یک نمونه(Instance) از کلاس wpdb را از طریق متغیر wpdb$ در دسترس قرار داده است.

پیشوند جداول وردپرس

همانطور که می دانید وردپرس برای نامگذاری جداول خود از پیشوند “_wp” استفاده می کند که می توانید آنرا در فرآیند نصب یا از طریق فایل کانفیگ وردپرس تغییر دهید، پس عملا ممکن است پیشوند فوق به ازای هر نصب متفاوت باشد. اما برخی توسعه دهندگان اشتباه بزرگی مرتکب شده و از نام جداول به طور مستقیم در کوئری های خود استفاده می کنند.

global $wpdb;
$result = $wpdb->get_results( 'SELECT * FROM wp_posts WHERE  LENGTH( post_excerpt ) > 0' );

 

برای اینکه دچار این اشتباه نشوید می توانید متغیر prefix$ کلاس wpdb را بدین صورت فراخوانی کنید.

global $wpdb;
$result = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . 'posts WHERE LENGTH( post_excerpt ) > 0');

 

یا کار راحتری انجام دهید و از نام جداول بدون پیشوند استفاده نمائید.

global $wpdb;
$result = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->posts . ' WHERE LENGTH( post_excerpt ) > 0');

 

در ادامه متدهای مهم و کاربردی کلاس wpdb را معرفی خواهیم کرد، توجه داشته باشید در کلیه مثال ها نام جداول به روش بالا فراخوانی شده است.

۱- بازیابی داده ها از دیتابیس(Retrieving Data یا Fetching)

کلاس wpdb روش های مختلفی برای فراخوانی مقادیر و داده ها از دیتابیس وردپرس ارائه می دهد که هر کدام از آنها را با ذکر مثال توضیح می دهیم:

۱-۱- متد get_var

این متد یک پرس و جو یا Query را به عنوان ورودی دریافت کرده و یک مقدار بر می گرداند، به عنوان مثال تعداد پست های منتشر شده یا تعداد کاربرانی که دارای نقش نویسنده هستند. پس در مواقعی که خروجی کوئری فقط یک مقدار دارد بهتر است از get_var استفاه کنید.

$post_count = $wpdb->get_var( 'SELECT count(*) FROM ' . $wpdb->posts . ' WHERE post_status = "publish"' );
echo 'Published Posts = ' . $post_count;

 

۲-۱- متد get_row

گاهی مواقع نیاز است که فقط یک ردیف یا رکورد را از پایگاه داده بازیابی کنید، به عنوان مثال نوشته ای با شناسه ۱۰ یا آخرین رکورد یک جدول، در چنین مواقعی get_row بهترین انتخاب خواهد بود. پارامتر دوم این متد نوع خروجی را مشخص می کند، مقادیری که پارامتر فوق می پذیرد بدین صورت است:

  1. OBJECT: خروجی به صورت شی(مقدار پیش فرض)
  2. ARRAY_A: آرایه انجمنی (Associative Array)
  3. ARRAY_N: آرایه با ایندکس عددی(Numeric Indexed Array)
$row = $wpdb->get_row( 'SELECT * FROM ' . $wpdb->posts .
                        ' WHERE post_type="post" and post_status="publish" 
                            ORDER BY ID DESC', ARRAY_A );
echo $row[ 'post_title' ];

۳-۱- متد get_col

به کمک get_col می توانید یک ستون یا فیلد مشخص را برگردانید، خروجی متد فوق آرایه ای یک بعدی می باشد.

$user_emails = $wpdb->get_col( 'SELECT user_email FROM ' . $wpdb->users );
foreach ( $user_emails as $email ) {
    echo $email . "<br>";
}

 

۴-۱- متد get_results

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

$results = $wpdb->get_results( 'SELECT p.post_title, u.user_login 
                                  FROM ' . $wpdb->posts . ' p JOIN ' . $wpdb->users . ' u 
                                   ON p.post_author=u.id
                                   WHERE p.post_type="post" AND p.post_status="publish"' );
foreach ( $results as $result ) {
    echo $result->post_title . ' = ' . $result->user_login . '<br>';
}

۲- افزودن ردیف(Insert Row)

متد Insert کلاس wpdb به شما اجازه می دهد اطلاعات موردنیازتان را به جداول وردپرس اضافه کنید، تابع فوق سه آرگومان به ترتیب زیر دریافت می کند:

  1. عنوان جدول
  2. آرایه ای از مقادیر
  3. آرایه ای از فرمت و نوع مقادیر
$wpdb->insert( $wpdb->postmeta, 
    array(
    'post_id' => 1,
    'meta_key' => 'quantity',
    'meta_value' => '500'),
    array(
        '%d', '%s', '%s'
    ));

۳- بروزرسانی ردیف(Update Row)

آپدیت و بروزرسانی اطلاعات یکی از معمول ترین عملیاتی است که بر روی دیتابیس انجام می شود، کلاس wpdb برای اینکار متد update را ارائه می دهد، متد فوق سه آرگومان به صورت زیر دریافت می کند:

  1. عنوان جدول
  2. آرایه ای از مقادیر که باید تغییر کنند
  3. آرایه ای از شرط ها یا Where
$wpdb->update( $wpdb->postmeta, 
    array(
    'meta_value' => '450'
    ),
    array(
        'post_id' => 1,
        'meta_key' => 'quantity'
    ));

۴- حذف ردیف(Delete Row)

برای حذف ردیف های موردنظر خود می توانید از متد delete استفاده کنید.

$wpdb->delete( $wpdb->postmeta, array( 'post_id' => 1 ) );

 

۵- متد Query

گاهی اوقات ممکن است کوئری شما آنقدر پیچیدگی داشته باشد که موارد بالا برای آن مناسب نباشد، در چنین شرایطی می توانید از متد Query استفاده کنید.

$wpdb->query( 'DELETE p FROM '. $wpdb->posts .' p 
               INNER JOIN '. $wpdb->users .' u on u.ID = p.post_author
               INNER JOIN '. $wpdb->usermeta .' um on um.user_id = u.ID
             where p.post_status= "publish" AND 
                 um.meta_key = "last_name" AND
                 um.meta_value ="yavarnia"' );

 

یا طریقه افزودن در دیتابیس را اینگونه انجام دهید.

$post_id = $_POST[ 'post_id' ];
$meta_key = $_POST[ 'meta_key' ];
$meta_value = $_POST[ 'meta_value' ];

$wpdb->query( 'INSERT INTO '. $wpdb->postmeta .'
                ( post_id, meta_key, meta_value )
                VALUES ( $post_id, $meta_key, $meta_value )' );

 

۶- متد prepare

برای اینکه کوئری های خود را در برابر حملات SQL Injection مقاوم کنید کلاس wpdb متد prepare را در اختیارتان قرار می دهد، نمونه کد Insert که در مثال قبلی توسط تابع query اجرا کردیم مستعد حمله Injection خواهد بود. این متد دو ورودی دریافت می کند، اولی رشته کوئری و دومی مقادیر متغیرهای.

پس مثال قبلی را اینبار با prepare بازنویسی می کنیم.

$post_id = $_POST[ 'post_id' ];
$meta_key = $_POST[ 'meta_key' ];
$meta_value = $_POST[ 'meta_value' ];

$wpdb->query( $wpdb->prepare( 'INSERT INTO ' . $wpdb->postmeta .'
                    ( post_id, meta_key, meta_value ) 
                     VALUES ( %d, %s, %s )',
                    $post_id,
                    $meta_key,
                    $meta_value));

 

در مثال بالا که به صورت sprintf نوشته شده است نوع متغیر را اینگونه تعریف می کنیم:

  1. s% متغیر رشته ای یا String
  2. d% متغیر صحیح یا Integer
  3. f% متغیر اعشاری یا Float

می توانید متغیرها را به صورت vsprintf نیز ارسال نمائید که در آن از array استفاده شده است.

$wpdb->query( $wpdb->prepare( 'INSERT INTO ' . $wpdb->postmeta .'
                    ( post_id, meta_key, meta_value ) 
                     VALUES ( %d, %s, %s )',
   array($post_id,
    $meta_key,
    $meta_value)));

جمع بندی

کلاس wpdb قابلیتی مفید و کاربردی برای کسانی است که می خواهند از زاویه ای نزدیکتر با وردپرس تعامل داشته باشند. اما توجه داشته باشد هر گونه استفاده نادرست از این کلاس می تواند مشکلات امنیتی برایتان بوجود بیاورد.

نظرات و سوالات کاربران

پاسخی بگذارید

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