آموزش ایجاد جداول سفارشی در دیتابیس وردپرس + مثال عملی

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

در نامگذاری برخی از این جداول از کلمه meta استفاده شده است، جداولی که با هوشمندی تمام طراحی شده اند و به شما این امکان را می دهد هر تعداد فیلد اطلاعاتی که نیاز دارید به آنها اضافه نمائید.

مثلا جزئیات و اطلاعات کاربران را در جدول wp_usermeta ثبت کنید، از wp_postmeta برای ذخیره داده ها و فیلدهای سفارشی وابسته به پست تایپ های مختلف استفاده نمائید، جداول wp_commentmeta و wp_termmeta هم که کاربردهای خاص خود را دارند.

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

با این حال گاهی اوقات جداول موجود در دیتابیس وردپرس برای پروژه شما کافی نیستند، سناریو، پیچیدگی و روش پیاده سازی نیازمندی های پروژه به گونه ای است که حتما باید جداول سفارشی(Custom Tables) خودتان را داشته باشید.

مشابه آموزش های قبلی مدیر دِو این بار هم یک سناریوی عملیاتی تعریف می کنیم:

  1. می خواهیم یک پلاگین اختصاصی به نام WP Views Tracker بنویسیم که در هنگام فعال سازی جدول سفارشی را ایجاد می کند.
  2. این افزونه قرار است بازدید روزانه نوشته های وب سایت را در جدول سفارشی ذخیره کند.
  3. پس از حذف پلاگین جدول سفارشی هم بایستی به طور کامل حذف گردد.

اگر گام های آموزش را به ترتیب انجام دهید، در انتهای آموزش ساختار پلاگین شما اینگونه خواهد بود.

ساختار پلاگین ایجاد جدول سفارشی در دیتابیس وردپرس

گام ۱: ایجاد جدول سفارشی در هنگام فعال سازی پلاگین وردپرس

ابتدا در دایرکتوری plugins(محل نصب وردپرس) یک دایرکتوری به نام wp-views-tracker ایجاده کرده و داخل آن فایلی به نام wp-views-tracker.php بسازید، حالا کدهای زیر را در این فایل قرار دهید.

?php
/*
* Plugin Name: WP Views Tracker
* Description: A simple wordpress plugin for testing custom database tables.
* Version: 1.0
* Author: Modiredev
* Author URI: https://modiredev.com
* Text Domain: wp-views-tracker
*/

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;

داخل پلاگین اختصاصی یک دایرکتوری به نام includes ایجاد کرده و در آن فایلی به نام activate.php بسازید، سپس کدهای زیر را به فایل اصلی پلاگین یعنی wp-views-tracker.php اضافه نمائید.

include ( 'includes/activate.php' );

register_activation_hook( __FILE__, 'modiredev_activate_plugin' );

هر زمان که مدیر وب سایت پلاگین WP Views Tracker را فعال کند تابع modirdev_activate_plugin تریگر و اجرا خواهد شد، این تابع جدول سفارشی ما را تولید می کند.

ساختار این جدول که نام آن را wp_views_tracker می نامیم بدین صورت خواهد بود.

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

نمی خواهیم به کمک phpMyAdmin جدول فوق را ایجاد کنیم، پس کدهای زیر را به فایل activate.php اضافه نمائید.

<?php

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;

if ( ! function_exists( 'modiredev_activate_plugin' ) ){

    function  modiredev_activate_plugin(){

        global $wpdb;
    
        $charset_collate = "";
    
        if ( !empty( $wpdb->charset ) )
            $charset_collate = "DEFAULT CHARACTER SET {$wpdb->charset} ";
    
        if ( !empty( $wpdb->collate ) )
            $charset_collate .= "COLLATE {$wpdb->collate}";
    
        $create_table_SQL = "CREATE TABLE `" . $wpdb->prefix . "views_tracker` (
                        `ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
                        `post_id` BIGINT(20) NOT NULL,
                        `views` BIGINT(20) NOT NULL DEFAULT 1,
                        `view_date` DATE NOT NULL,
                         PRIMARY KEY (`ID`)
                    ) $charset_collate ENGINE=InnoDB ;";
    
        require( ABSPATH . "/wp-admin/includes/upgrade.php" );
        dbDelta( $create_table_SQL );
    }

}

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

نام جداول وردپرس از دو بخش پیشوند جدول(Table Prefix) و نام جدول تشکیل شده است، ۹۹ درصد کاربران در فرآیند نصب وردپرس مقدار پیش فرض _wp را به عنوان پیشوند جداول خود انتخاب می کنند، ۱ درصد باقیمانده هم از پیشوندی متفاوت استفاده می کنند یا پس از نصب وردپرس آن را تغییر می دهند.

خوشبختانه این پیشوند از طریق فایل تنظیمات وردپرس یعنی wp-config.php قابل مشاهده است.

$table_prefix  = 'wp_';

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

به عنوان یک راه حل میانبر و دم دستی می توانید متغیر charset_collate$ را به صورت زیر هم مقداردهی کنید.

$charset_collate = $wpdb->get_charset_collate();

در نهایت برای اعمال تغییرات در دیتابیس وردپرس بایستی از تابع dbDelta استفاده کنیم، این تابع در صورتی اجرا می شود که فایل upgrade.php لود شده باشد.

برای ایجاد، حذف و آپدیت جداول وردپرس به فایل upgrade.php احتیاج داریم، دلیل اینکه وردپرس فایل فوق را به صورت خودکار require نمی کند در نظر گرفتن مسائل امنیتی است.

حالا از طریق پنل مدیریتی وردپرس پلاگین WP Viwes Tracker را فعال کرده و جدول ایجاد شده را در phpMyAdmin مشاهده کنید.

گام ۲: ثبت بازدیدها در جدول سفارشی

در دایرکتوری includes یک فایل به نام set-views.php ایجاد کرده و آن را در فایل اصلی پلاگین include کنید.

سپس تابع modirdev_set_views را از طریق اکشن wp_head فراخوانی نمائید، این اکشن هوک هر زمان که صفحه ای بارگذاری شود اجرا می گردد.

include( 'includes/set-views.php' );

add_action( 'wp_head', 'modiredev_set_views' );

سپس کدهای زیر را به فایل set-views.php اضافه کنید.

<?php

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;

if ( ! function_exists( 'modiredev_set_views' ) ){

    function modiredev_set_views(){
        
        if ( is_single() ) {
    
            global $wpdb;
            global $post;
    
            $date  = current_time( 'mysql' );
    
            $wpdb->query(
                $wpdb->prepare(
                    "INSERT INTO `" . $wpdb->prefix . "views_tracker` 
                        (post_id,views,view_date)
                        VALUES(%d,%d,%s)",
                    $post->ID,
                    ۱,
                    $date
                )
            );
        }
    }

}

در صورتی که کاربر در حال مشاهده یک نوشته باشد تابع is_single مقدار true برگشت می دهد، در این صورت بازدید صورت گرفته در جدول wp_views_tracker ذخیره خواهد شد.

همانطور که ملاحظه می کنید بازدید کاربران در جدول سفارشی ثبت شده است.

ثبت داده ها در جدول سفارشی وردپرس

گام ۳: حذف جدول سفارشی در هنگام حذف پلاگین وردپرس

متاسفانه اکثر توسعه دهندگان در فرآیند حذف پلاگین به جداول و داده هایی که تولید کرده اند توجه ای ندارند و آنها را به حال خود رها می کنند، مشکلی که در پلاگین های معروفی مثل Ninja Forms هم دیده می شود.

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

<?php
if ( ! defined( 'WP_UNINSTALL_PLUGIN' )){
    exit;
}

global $wpdb;

$wpdb->query( "DROP TABLE IF EXISTS `" . $wpdb->prefix . "views_tracker`" );

حتما یک کپی از پلاگین را در جایی خارج از دایرکتوری plugins ذخیره کنید، حالا از پنل مدیریتی وردپرس وارد لیست پلاگین ها شده و پلاگین WP Views Tracker را غیرفعال و سپس حذف نمائید، با این کار علاوه بر حذف پلاگین جدول سفارشی هم حذف خواهد شد.

جمع بندی

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

حتما از چهارچوب ها و قوانین تعریف شده وردپرس تبعیت کنید، در حال حاضر فایل upgrade.php، تابع dbDelta و کلاس wpdb تنها رویکردی است که برای ایجاد و مدیریت جداول سفارشی مورد نیاز است.

دانلود کدهای آموزش
نظرات و سوالات کاربران
  1. سلام وقت بخیر برای قالب به چه صورت می توان این کار را کرد یعنی زمانی که قالب فعال میشه یک جدول ساخته بشه و وقتی قالب حذف میشه جداول اون هم حذف بشه
    ممنون اگه راهنمایی کنید

    1. سلام دوست عزیز.
      اسکریپت های ایجاد و حذف جدول تغییری نمی کنه فقط:

      برای ایجاد جدول در هنگام فعال سازی قالب از اکشن هوک after_switch_theme استفاده کنید، مشابه کدهای زیر:

      function theme_create_custom_table(){
      // Create Table Script
      }
      add_action('after_switch_theme','theme_create_custom_table');

      برای حذف جدول هم بدین صورت عمل کنید.

      function theme_remove_custom_table(){
      // Drop Table Script
      }
      add_action('switch_theme','theme_remove_custom_table');

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

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