ওয়ার্ডপ্রেস প্লাগইন আপডেট কীভাবে প্রয়োগ করবেন যা ডেটাবেস সংশোধন করে?


10

আমি একটি ওয়ার্ডপ্রেস প্লাগইন বিকাশ করি, যার নিজস্ব কয়েকটি ডাটাবেস টেবিল রয়েছে। সক্রিয় হওয়ার সময় প্লাগইন এই টেবিলগুলি তৈরি করে এবং মুছে ফেলা / আনইনস্টল করার সময় সেগুলি সরিয়ে দেয়।

আমাকে প্লাগইনের একটি আপডেট প্রক্রিয়া প্রয়োগ করতে হবে যা প্লাগইনের কোড পাশাপাশি টেবিলের কাঠামো আপডেট করে। সবচেয়ে সহজ কেসটি হ'ল টেবিলগুলির মধ্যে একটিতে একটি নতুন কলাম যুক্ত করা। আরও জটিল কেসটি হ'ল একটি নতুন টেবিল কাঠামো তৈরি করা এবং সেই অনুযায়ী সামগ্রী আপডেট করা।

আপনি এই সমস্যাটি সমাধান করার জন্য কীভাবে সুপারিশ করবেন? এমন কোনও বিল্ট-ইন ওয়ার্ডপ্রেস ফাংশন রয়েছে যা সাহায্য করতে পারে?

উত্তর:


4

আজকাল এটি করার সঠিক উপায় হ'ল আপনার স্কিমাটি প্লাগইন উত্সে একটি ফাইল হিসাবে অন্তর্ভুক্ত করা এবং ইনবিল্ট ওয়ার্ডপ্রেস ফাংশন ডিবিডেল্টা () ব্যবহার করে সেই স্কিমটি ব্যবহার করে প্রয়োজনীয় ডেটাবেস আপডেট করতে। প্রয়োজনীয় প্রকৃত কোডটি খুব সহজ:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );

এটি উভয়ই আপনার প্রয়োজন হিসাবে ডাটাবেস তৈরি এবং আপডেট করবে। আমি যখন সর্বশেষে চেক করেছি তখন এটি পুরানো অব্যবহৃত কলামগুলি মোছেনি, সুতরাং আপনার এটির জন্য কোনও সংস্করণ চেকের মাধ্যমে কোড দরকার। এটি ওয়ার্ডপ্রেসের একটি সুন্দর বৈশিষ্ট্য এবং একটি বিশাল টাইমসভার। স্কিমা.এসকিউএল ফাইল তৈরি করার সময় সাবধান থাকুন যে আপনি ডিবিডেল্টা () কোডটি ফাঁকা দেওয়ার বিষয়ে খুব উদ্বেগজনক বলে খ্যাতিমান হিসাবে ঠিক একটি মাইএসকিএল স্কিমা রফতানিতে ফাঁকা স্থানটি অনুলিপি করেছেন। আপনার ডাটাবেসের সংস্করণও পরীক্ষা করা উচিত এবং এটি সর্বশেষ না হলে ডাটাবেস আপডেট করার জন্য উপরের দিকে কল করুন। DbDelta () সঠিকভাবে পায় না (যেমন একটি কলাম মুছতে পারে) এমন পরিবর্তনগুলি কভার করতে আপনাকে নির্দিষ্ট আপডেটগুলিও করতে হবে। সংস্করণটি আপডেট হয়েছে কিনা তা পরীক্ষা করে দেখে a wpdb এর মাধ্যমে এই ম্যানুয়াল আপডেটগুলি করা যায় কিনা তা সাধারণ লজিকাল লেখা সহজ। উদাহরণস্বরূপ, আপনি এখন কোনও অব্যবহৃত একটি কলাম ফেলে দিতে পারেন।

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);

এটি চলমান কোড থেকে সরল করা হয়েছে, ক্ষমা চাইছি যদি আমি প্রকাশের জন্য এটি সরল করার প্রক্রিয়ায় এটি ভেঙে ফেলেছি।

এও মনে রাখবেন যে ওয়ার্ডপ্রেস ৩.৯.২ অনুসারে, ওয়ার্ডপ্রেস সর্বদা প্লাগইন আপডেট করার ক্ষেত্রে অ্যাক্টিভেশন হুক চালায় না (বিশেষত, যদি ড্যাশবোর্ড আপডেট পৃষ্ঠা থেকে কোনও গণ আপডেট করা হয়)।


আজকাল আমি স্কিমা.এসকিউএল ফাইলের আধুনিক সময় থেকেই ডিবি সংস্করণ নেওয়া শুরু করেছি। এর অর্থ হ'ল স্কিম.এসকিউএল ফাইলটি কেবলমাত্র আপডেট করা ডেটাবেস আপগ্রেডের পক্ষে যথেষ্ট; ডাটাবেস সংস্করণ সম্পাদনা করার দরকার নেই। এর মতো কিছু: b db_version = ফাইলটাইম ("স্কিমা.এসকিউএল");
ব্রায়ান সি

1
সুতরাং, যদি ফাইলের সময়টি মুভিং সার্ভারের মতো বাহ্যিক কিছু থেকে পরিবর্তিত হয়, এমটাইম এবং ডিবি সংস্করণ পরিবর্তন হয়?
ওয়ালফ

ফাইলের সময় সর্বদা জিএমটিতে থাকে এবং সার্ভারগুলি কয়েক সেকেন্ডের মধ্যে খুব কমই আলাদা হয়, সুতরাং এটির দ্বারা এটি দু'বার ট্রিগার হতে পারে প্রায় অসম্ভব। যাইহোক, এটি আবার ট্রিগার হয়ে উঠলেও, কোনওরকম ক্ষতি হয় না কারণ এটি একবার চালিত হয় এবং লাইভ ডিবির বিপরীতে তুলনা করে, অবশ্যই কিছু পরিবর্তন না করে। এটি ডিবিডেলটা () সম্পর্কে সুন্দর জিনিস - এটি সমস্যা ছাড়াই একাধিকবার চালানো যেতে পারে। ভাল প্রশ্ন, ধন্যবাদ।
ব্রায়ান সি

3

সংক্ষেপে, হ্যাঁ - $wpdbক্লাস। আরও তথ্যের জন্য কোডেক্স দেখুন

যখনই আপনি কোনও কাস্টম টেবিল (বা কোনও টেবিল, সত্যই) এর সাথে আপনার ইন্টারঅ্যাক্ট করা উচিত $wpdb- বিশেষত নিশ্চিত হয়ে নিন যে আপনি সেই prepareপদ্ধতির সাথে পরিচিত যা কোয়েরিগুলি থেকে বাঁচতে এবং ইঞ্জেকশনগুলি রোধ করতে সহায়তা করতে পারে।

আপনি টেবিল তৈরি করতে এটি ব্যবহার করা উচিত হিসাবে আপনি ইতিমধ্যে পরিচিত হওয়া উচিত। আপনার ইনস্টল হুক এ আপনার এমন কিছু হওয়া উচিত:

$charset_collate = '';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);

এই কোডটি আসলে যখনই প্লাগ-ইন সক্রিয় হয় (যেমন কেবল ইনস্টল করা হয় না) চালিত হয়। সুতরাং কেউ স্বয়ংক্রিয়ভাবে প্লাগ-ইন আপডেট করলে এটি চলবে । দ্রষ্টব্য: যদি তারা ম্যানুয়ালি প্লাগ-ইন প্রতিস্থাপনের মাধ্যমে আপগ্রেড করে - তবে তা হবে না - সুতরাং admin_initআপনার প্লাগ-ইন আপগ্রেড হওয়ার সময় আপনাকে উপরের কোডটি ট্রিগার করতে হবে (বিকল্প সারণীতে সংস্করণ নম্বর সংরক্ষণ করুন, বর্তমান সংস্করণের বিপরীতে পরীক্ষা করুন) ।

এখন আপনি সাধারণত চাইবেন না যে CREATE TABLEআপনি যখনই প্লাগ-ইন আপডেট করবেন তখন এসকিউএল কমান্ডটি চলমান থাকে - এটি এখানে dBDelta()আসে।

উপরের কমান্ডটি চালানোর আগে - এটি সারণী উপস্থিত আছে কিনা তা পরীক্ষা করে দেখায়। আরও কী, এটি কলামের প্রকারগুলি পরীক্ষা করে। সুতরাং যদি টেবিলটি বিদ্যমান না থাকে তবে এটি তৈরি করে, যদি তা করে তবে কিছু কলামের ধরণের পরিবর্তন করে এটি আপডেট করে এবং যদি কোনও কলাম উপস্থিত না থাকে - এটি এতে যুক্ত করে it

দুর্ভাগ্যক্রমে - আপনি যদি উপরে থেকে কোনও কলাম সরিয়ে ফেলেন তবে এটি স্বয়ংক্রিয়ভাবে কলামটি সরিয়ে ফেলবে না। কলামগুলি / সারণীগুলি সরাতে আপনাকে DROPসেগুলি নির্দিষ্টভাবে করা দরকার ( এটি করার আগে সেগুলি উপস্থিত রয়েছে কিনা তা পরীক্ষা করা)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.