استفاده از SQL در وردپرس

در وردپرس تمامی تعاملات با پایگاه داده (دیتابیس) توسط کلاس wpdb پیاده سازی شده و انجام می پذیرد. به دو دلیل کاملا مشخص استفاده از توابع کلاس wpdb به جای توابع PHP برای اجرای درخواستهای پایگاه داده توصیه می گردد:

1) کلاس wpdb وردپرس امکانات لازم برای تامین امنیت اجرای دستورات در برابر حملات تزریق SQL را فراهم می آورد.

2) استفاده از کلاس wpdb امکان تغییر پایگاه داده از MySQL به پایگاه داده دیگر را بدون ایجاد اخلال در عملکرد سایت مهیا می سازد.

به منظور بکارگیری متدهای کلاس wpdb در پلاگین ها، همواره از شی $wpdb که به صورت سراسری در وردپرس در دسترس است استفاده می کنیم.

درج اطلاعات در جدول

برای درج اطلاعات (افزودن ستون) در جدول از متد insert استفاده می کنیم. این متد سه پارامتر ورودی می پذیرد: پارامتر اول نام جدول مورد نظر، پارامتر دوم آرایه ای شامل نام ستون ها و مقادیر متناظر با هر یک و پارامتر سوم که اختیاری است شامل آرایه ای از  placeholder های متناظر با نوع داده ستون ها است. در صورت اجرای موفق عملیات درج این تابع تعداد ستون اضافه شده و در غیر این صورت مقدار false را بر می گرداند.

< ?php
function  bmpt_test_insert(){
  global $wpdb;      
$values = array(
    'column1’ = >  'new string’,
    'column2' = >  44
);
        
$formats_values = array( '%s', '%d' );
        
$wpdb- > insert( $wpdb- > custom, $values, $formats_values );
}
? >  

با فراخوانی تابع بالا و اجرای کد فوق، در سطر جدید رشته new string و عدد 44 به ترتیب در ستونهای column1 و column2 جدول custom درج می شوند. توجه دارید که پیش از استفاده از شی $wpdb آن را به صورت global تعریف کردیم.

بروزرسانی اطلاعات جدول

متد update کلاس wpdb عملیات بروزرسانی داده ها در جدول را انجام می دهد. این متد پنج پارامتر ورودی می پذیرد که دو پارامتر آخر آن اختیاری: پارامتر اول نام جدول، پارامتر دوم آرایه ای از نام ستون ها و مقادیر متناظر به صورت کلید و مقدار، پارامتر سوم آرایه مربوط به شرایط بروزرسانی که این شروط با هم AND می شوند، پارامتر چهارم و پنجم به ترتیب placeholderهای مقادیر آرایه های پارامترهای دوم و سوم هستند. با اجرای این متد، در صورت بروزرسانی موفق جدول، تعداد سطرهای بروزشده و در غیر این صورت مقدار false برگردانده می شود.

<?php
$values = array(
    'column1' = >  'some string',
    'column2' = >  43
);
        
$where = array(
    'ID' = >  1);        
$formats_values = array( '%s', '%d' );
        
$formats_where = array( '%d' );
        
$wpdb- > update( $wpdb- > custom, $values, $where, $formats_values, $formats_where );
? > 

با اجرای کد فوق، در جدول custom اطلاعات ستونهای column1 و column2 سطری که آیدی آن برابر 1 است بروزرسانی می گردد.

حذف اطلاعات از جدول

برای حذف اطلاعات از جدول از متد delete کلاس wpdb استفاده می گردد. این متد سه پارامتر ورودی می پذیرد: پارامتر اول نام جدول، پارامتر دوم آرایه ای شامل نام ستونها و مقادیر متناظر آنها که شرایط حذف را مشخص می کنند و این شروط با هم AND می شوند و پارامتر سوم که اختیاری است آرایه ای از placeholderهای آرایه شروط حذف (پارامتر دوم متد) است. در صورت اجرای موفق دستور، تعداد سطرهای حذف شده و در غیر این صورت مقدار false برگردانده می شود.

<?php
$id = 815;
$table = 'wp_progress';
$wpdb->delete( $table, array( 'ID' => $id, 'slug'=>'andy' ), array ('%d','%s') );
?>

کد فوق سطری با آیدی 815 و slug برابر با andy را از جدول wp_progress حذف می کند.

جستجو در جدول

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

انتخاب یک متغیر (یک سلول جدول)

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

< ?php
        
$sql = "SELECT COUNT(ID) FROM {$wpdb- > posts}
        WHERE post_status = 'publish' AND post_type = 'post'";
        
$num_of_posts = $wpdb- > get_var( $sql );
? >

کد فوق تعداد پست های منتشر شده را بر می گرداند.

انتخاب یک سطر جدول

برای جستجو و انتخاب یک سطر از جدول، می توان از متد get_row استفاده کرد. نتیجه حاصل از پرس و جو می تواند به صورت یک شی یا یک آرایه انجمنی یا یک آرایه با شاخص عددی باشد. پارامتر اول این متد پرس و جو SQL مورد نظر و پارامتر دوم تعیین کننده نوع پاسخ برگشتی است. (پاسخ به صورت شی: OBJECT، پاسخ به صورت آرایه انجمنی: ARRAY_A، پاسخ به صورت آرایه شاخص دار عددی: ARRAY_N)

< ?php
$sql = "SELECT `user_email`, `user_url`
        FROM $wpdb- > users
        WHERE user_login = 'admin'";
        
$object  = $wpdb- > get_row( $sql, OBJECT );
$array_a = $wpdb- > get_row( $sql, ARRAY_A );
$array_n = $wpdb- > get_row( $sql, ARRAY_N );

$email = $object- > user_email;
        
$email = $array_a['user_email'];
        
$email = $array_n[0];
? >

در مثال فوق، نحوه دسترسی به مقدار user_email برای حالات مختلف پاسخ نشان داده شده است.

انتخاب یک ستون جدول

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

< ?php
        
$sql = "SELECT `user_email` FROM $wpdb- > users";
        
$emails = $wpdb- > get_col( $sql );
$subject = 'Blog maintenance';
$message = 'Dear user, the blog will be offline for 15 days.';
        
foreach( $emails as $email ) {
    wp_mail( $email, $subject, $message );
}
? >  

در مثال فوق، آدرس ایمیل کاربران انتخاب و سپس پیامی برای آنان ایمیل می شود.

انتخاب چند سطری از جدول

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

< ?php
        
$sql = "SELECT YEAR(post_date) AS `year`, count(ID) as posts
        FROM $wpdb- > posts
        WHERE post_type = 'post' AND post_status = 'publish'
        GROUP BY YEAR(post_date)
        ORDER BY post_date DESC";
        
$results = $wpdb- > get_results( $sql, ARRAY_A );
foreach( $results as $sum ) {
    $year  = $sum['year'];
    $count = $sum['posts'];
    echo " < p > Posts published in $year: $count < /p > ";
}
? >  

اجرای دستورات SQL به صورت عمومی

متد query کلاس wpdb یکی از مهمترین و پرکاربردترین متدهای این کلاس است. این متد امکان اجرای انواع دستورات SQL را فراهم می آورد. مقدار برگشتی این متد برای دستورات ایجاد، حذف یا تغییر ساختار جدول (CREATE، DROP، ALTER) مقدار true، برای بقیه دستورات تعداد سطرهای انتخابی یا تغییریافته و در صورت بروز خطا مقدار false می باشد.

<?php
$sql = "UPDATE $wpdb- > posts
        SET comment_status = 'closed'
        WHERE post_date  <  DATE_SUB( NOW(), INTERVAL 90 DAY )
        AND post_status = 'publish'";
        
$wpdb- > query( $sql );
?>

تامین امنیت برای پرس و جوها

برای جلوگیری از حملات تزریق SQL، کلاس wpdb از متد prepare برای تامین امنیت لازم برای اجرای دستورات استفاده می نماید. این متد با استفاده از placeholderها، پارامترهای به کار رفته در دستور SQL را به شکل امن جایگزین می کند. در پارامتر اول این متد، placeholderها باید در رشته دستور SQL قرار گیرند و سایر پارامترهای ورودی این متد به ترتیب به جای placeholderها در دستور مورد نظر جایگزین می شوند.

مثال:

<?php
$table_name = "{$wpdb->prefix}myTable";
$myID = 12;
 
$wpdb->query( $wpdb->prepare( "UPDATE `$table_name` SET `your_column_1` = 1 WHERE `$table_name`.`your_column_id` = %d", $myID ) );
?>

مثال:

< ?php
$sql = “SELECT `post_title`
        FROM $wpdb- > posts
        WHERE `post_author` = %d
        AND post_status = 'publish'
        AND post_type = 'post'
        AND DATE_FORMAT( `post_date`, ‘%%Y-%%m’) = %s ";
$id = 1;
$month = '2010-11';
        
$safe_sql = $wpdb- > prepare( $sql, $id, $month );
        
$posts = $wpdb- > get_results( $safe_sql );
        
? >  

نکته: متغیرهای مهم کلاس wpdb که بیشتر مورد استفاده قرار می گیرند:

$wpdb->insert_id: آیدی جدیدترین سطر اضافه شده به جدول در آخرین دستور insert

$wpdb->num_rows: تعداد سطرهای برگشتی آخرین پرس و جو

$wpdb->rows_affected: تعداد سطرهای تاثیریافته از آخرین پرس و جو

پست های مرتبط

Leave a Comment