1. Home
  2. WordPress
  3. Plugin Development
  4. প্রফেশনাল প্লাগিন

প্রফেশনাল প্লাগিন

প্রফেশনাল ওয়ার্ডপ্রেস “স্ক্রল টু টপ বাটন” প্লাগিন তৈরির বিস্তারিত টিউটোরিয়াল

🌟 ভূমিকা

আজ আমরা একটি পূর্ণাঙ্গ প্রফেশনাল ওয়ার্ডপ্রেস প্লাগিন তৈরি করব যা ওয়েবসাইটে একটি “স্ক্রল টু টপ” বাটন যোগ করবে। এই প্লাগিনটি ভ্যানিলা জাভাস্ক্রিপ্ট ব্যবহার করে তৈরি করা হবে এবং এতে একটি অ্যাডমিন প্যানেল থাকবে যেখানে ব্যবহারকারী বাটনের বিভিন্ন সেটিংস কাস্টমাইজ করতে পারবেন।

📂 প্রোজেক্ট স্ট্রাকচার

প্রথমে আমরা আমাদের প্লাগিনের ফাইল স্ট্রাকচার বুঝে নেই:

scroll-to-top/
├── admin/
   ├── class-scroll-to-top-admin.php     # অ্যাডমিন ক্লাস
   ├── css/
      └── scroll-to-top-admin.css       # অ্যাডমিন স্টাইল
   ├── js/
      └── scroll-to-top-admin.js        # অ্যাডমিন স্ক্রিপ্ট
   └── partials/
       └── scroll-to-top-admin-display.php # অ্যাডমিন ভিউ
├── includes/
   ├── class-scroll-to-top.php           # মূল প্লাগিন ক্লাস
   ├── class-scroll-to-top-activator.php # অ্যাক্টিভেটর ক্লাস
   ├── class-scroll-to-top-deactivator.php # ডিঅ্যাক্টিভেটর ক্লাস
   └── class-scroll-to-top-i18n.php      # ইন্টারন্যাশনালাইজেশন ক্লাস
├── languages/
   └── scroll-to-top.pot                 # ট্রান্সলেশন টেমপ্লেট
├── public/
   ├── class-scroll-to-top-public.php    # পাবলিক ক্লাস
   ├── css/
      └── scroll-to-top-public.css      # পাবলিক স্টাইল
   ├── js/
      └── scroll-to-top-public.js       # পাবলিক স্ক্রিপ্ট
   └── partials/
       └── scroll-to-top-public-display.php # পাবলিক ভিউ
├── scroll-to-top.php                     # মূল প্লাগিন ফাইল
├── uninstall.php                         # আনইনস্টল ফাইল
├── index.php                             # সিকিউরিটি ফাইল
└── README.txt                            # প্লাগিন ডকুমেন্টেশন

🚀 ধাপ ১: প্রোজেক্ট ফোল্ডার তৈরি করা

প্রথমে, আপনার ওয়ার্ডপ্রেস ইনস্টলেশনের wp-content/plugins/ ফোল্ডারে একটি নতুন ফোল্ডার তৈরি করুন:

cd wp-content/plugins/
mkdir scroll-to-top
cd scroll-to-top

এরপর প্রয়োজনীয় সাব-ফোল্ডারগুলি তৈরি করুন:

mkdir admin
mkdir admin/css
mkdir admin/js
mkdir admin/partials
mkdir includes
mkdir languages
mkdir public
mkdir public/css
mkdir public/js
mkdir public/partials

📄 ধাপ ২: মূল প্লাগিন ফাইল তৈরি করা

এখন আমরা scroll-to-top.php ফাইল তৈরি করব, যা আমাদের প্লাগিনের মূল ফাইল:

touch scroll-to-top.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * স্ক্রল টু টপ বাটন প্লাগিন
 *
 * @link              https://yourwebsite.com
 * @since             1.0.0
 * @package           Scroll_To_Top
 *
 * @wordpress-plugin
 * Plugin Name:       Scroll To Top Button
 * Plugin URI:        https://yourwebsite.com/scroll-to-top
 * Description:       একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে যা ভিজিটরদের পেজের উপরে যেতে সাহায্য করে।
 * Version:           1.0.0
 * Author:            আপনার নাম
 * Author URI:        https://yourwebsite.com
 * License:           GPL-2.0+
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Text Domain:       scroll-to-top
 * Domain Path:       /languages
 */

// সরাসরি অ্যাক্সেস প্রতিরোধ করুন
if (!defined('WPINC')) {
    die;
}

/**
 * প্লাগিনের বর্তমান ভার্সন।
 */
define('SCROLL_TO_TOP_VERSION', '1.0.0');

/**
 * প্লাগিন অ্যাক্টিভেশন হুক।
 * এই ফাংশনটি প্লাগিন অ্যাক্টিভেট করার সময় চালানো হবে।
 */
function activate_scroll_to_top() {
    require_once plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top-activator.php';
    Scroll_To_Top_Activator::activate();
}

/**
 * প্লাগিন ডিঅ্যাক্টিভেশন হুক।
 * এই ফাংশনটি প্লাগিন ডিঅ্যাক্টিভেট করার সময় চালানো হবে।
 */
function deactivate_scroll_to_top() {
    require_once plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top-deactivator.php';
    Scroll_To_Top_Deactivator::deactivate();
}

register_activation_hook(__FILE__, 'activate_scroll_to_top');
register_deactivation_hook(__FILE__, 'deactivate_scroll_to_top');

/**
 * মূল প্লাগিন ক্লাস লোড করুন।
 */
require plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top.php';

/**
 * প্লাগিন এক্সিকিউশন শুরু করুন।
 *
 * @since    1.0.0
 */
function run_scroll_to_top() {
    $plugin = new Scroll_To_Top();
    $plugin->run();
}

run_scroll_to_top();

🔍 scroll-to-top.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ প্লাগিন হেডার কমেন্ট:

/**
 * স্ক্রল টু টপ বাটন প্লাগিন
 *
 * @link              https://yourwebsite.com
 * @since             1.0.0
 * @package           Scroll_To_Top
 *
 * @wordpress-plugin
 * Plugin Name:       Scroll To Top Button
 * Plugin URI:        https://yourwebsite.com/scroll-to-top
 * Description:       একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে যা ভিজিটরদের পেজের উপরে যেতে সাহায্য করে।
 * Version:           1.0.0
 * Author:            আপনার নাম
 * Author URI:        https://yourwebsite.com
 * License:           GPL-2.0+
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Text Domain:       scroll-to-top
 * Domain Path:       /languages
 */

🔹 এই অংশটি ওয়ার্ডপ্রেসকে জানায় যে এটি একটি প্লাগিন এবং প্লাগিনের বিবরণ প্রদান করে।
🔹 @wordpress-plugin ট্যাগটি ডকব্লক শুরু করে যা ওয়ার্ডপ্রেসের জন্য প্লাগিন মেটাডাটা ধারণ করে।
🔹 Plugin Name, Plugin URI, Description ইত্যাদি ফিল্ডগুলি ওয়ার্ডপ্রেস অ্যাডমিন প্যানেলের প্লাগইন পেজে দেখানো হবে।
🔹 Text Domain এবং Domain Path ফিল্ডগুলি ইন্টারন্যাশনালাইজেশনের জন্য ব্যবহৃত হয়।

2️⃣ সরাসরি অ্যাক্সেস প্রতিরোধ:

// সরাসরি অ্যাক্সেস প্রতিরোধ করুন
if (!defined('WPINC')) {
    die;
}

🔹 এই কোডটি নিশ্চিত করে যে কেউ সরাসরি এই ফাইল অ্যাক্সেস করতে পারবে না।
🔹 WPINC কনস্ট্যান্টটি শুধুমাত্র ওয়ার্ডপ্রেস লোড হলেই ডিফাইন করা হয়।
🔹 যদি কেউ ব্রাউজার থেকে সরাসরি এই ফাইল অ্যাক্সেস করার চেষ্টা করে, তাহলে স্ক্রিপ্ট এক্সিকিউশন বন্ধ হয়ে যাবে।

3️⃣ প্লাগিন ভার্সন ডিফাইন করা:

/**
 * প্লাগিনের বর্তমান ভার্সন।
 */
define('SCROLL_TO_TOP_VERSION', '1.0.0');

🔹 এই লাইনটি SCROLL_TO_TOP_VERSION নামে একটি কনস্ট্যান্ট ডিফাইন করে যা প্লাগিনের বর্তমান ভার্সন ধারণ করে।
🔹 এই কনস্ট্যান্টটি প্লাগিনের বিভিন্ন অংশে ব্যবহার করা হবে, যেমন স্ক্রিপ্ট এবং স্টাইল এনকিউ করার সময়।

4️⃣ অ্যাক্টিভেশন ফাংশন:

/**
 * প্লাগিন অ্যাক্টিভেশন হুক।
 * এই ফাংশনটি প্লাগিন অ্যাক্টিভেট করার সময় চালানো হবে।
 */
function activate_scroll_to_top() {
    require_once plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top-activator.php';
    Scroll_To_Top_Activator::activate();
}

🔹 এই ফাংশনটি প্লাগিন অ্যাক্টিভেট করার সময় চালানো হবে।
🔹 এটি class-scroll-to-top-activator.php ফাইল লোড করে এবং Scroll_To_Top_Activator ক্লাসের activate() মেথড কল করে।
🔹 plugin_dir_path(__FILE__) ফাংশনটি বর্তমান ফাইলের ডিরেক্টরি পাথ রিটার্ন করে।

5️⃣ ডিঅ্যাক্টিভেশন ফাংশন:

/**
 * প্লাগিন ডিঅ্যাক্টিভেশন হুক।
 * এই ফাংশনটি প্লাগিন ডিঅ্যাক্টিভেট করার সময় চালানো হবে।
 */
function deactivate_scroll_to_top() {
    require_once plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top-deactivator.php';
    Scroll_To_Top_Deactivator::deactivate();
}

🔹 এই ফাংশনটি প্লাগিন ডিঅ্যাক্টিভেট করার সময় চালানো হবে।
🔹 এটি class-scroll-to-top-deactivator.php ফাইল লোড করে এবং Scroll_To_Top_Deactivator ক্লাসের deactivate() মেথড কল করে।

6️⃣ হুক রেজিস্ট্রেশন:

register_activation_hook(__FILE__, 'activate_scroll_to_top');
register_deactivation_hook(__FILE__, 'deactivate_scroll_to_top');

🔹 register_activation_hook() ফাংশনটি ওয়ার্ডপ্রেসকে বলে যে প্লাগিন অ্যাক্টিভেট করার সময় activate_scroll_to_top ফাংশন কল করতে হবে।
🔹 register_deactivation_hook() ফাংশনটি ওয়ার্ডপ্রেসকে বলে যে প্লাগিন ডিঅ্যাক্টিভেট করার সময় deactivate_scroll_to_top ফাংশন কল করতে হবে।
🔹 __FILE__ হল বর্তমান ফাইলের পাথ।

7️⃣ মূল প্লাগিন ক্লাস লোড করা:

/**
 * মূল প্লাগিন ক্লাস লোড করুন।
 */
require plugin_dir_path(__FILE__) . 'includes/class-scroll-to-top.php';

🔹 এই লাইনটি মূল প্লাগিন ক্লাস ফাইল লোড করে।

8️⃣ প্লাগিন এক্সিকিউশন শুরু করা:

/**
 * প্লাগিন এক্সিকিউশন শুরু করুন।
 *
 * @since    1.0.0
 */
function run_scroll_to_top() {
    $plugin = new Scroll_To_Top();
    $plugin->run();
}

run_scroll_to_top();

🔹 run_scroll_to_top() ফাংশনটি Scroll_To_Top ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং এর run() মেথড কল করে।
🔹 এই ফাংশনটি সরাসরি কল করা হয়েছে, যা প্লাগিন এক্সিকিউশন শুরু করে।

📄 ধাপ ৩: সিকিউরিটি ফাইল তৈরি করা

এখন আমরা index.php ফাইল তৈরি করব, যা ডিরেক্টরি লিস্টিং প্রতিরোধ করবে:

touch index.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
// Silence is golden.

🔍 index.php ফাইলের বিস্তারিত ব্যাখ্যা:

এই ফাইলটি শুধুমাত্র একটি কমেন্ট ধারণ করে: “Silence is golden.”। এর উদ্দেশ্য হল ডিরেক্টরি লিস্টিং প্রতিরোধ করা। যদি কেউ ব্রাউজারে প্লাগিন ডিরেক্টরি অ্যাক্সেস করার চেষ্টা করে, তাহলে তারা শুধু একটি খালি পেজ দেখবে, ফাইলগুলির তালিকা নয়।

এই একই ফাইল আমরা প্রতিটি সাব-ডিরেক্টরিতেও যোগ করব:

echo "<?php // Silence is golden." > admin/index.php
echo "<?php // Silence is golden." > admin/css/index.php
echo "<?php // Silence is golden." > admin/js/index.php
echo "<?php // Silence is golden." > admin/partials/index.php
echo "<?php // Silence is golden." > includes/index.php
echo "<?php // Silence is golden." > languages/index.php
echo "<?php // Silence is golden." > public/index.php
echo "<?php // Silence is golden." > public/css/index.php
echo "<?php // Silence is golden." > public/js/index.php
echo "<?php // Silence is golden." > public/partials/index.php

📄 ধাপ ৪: আনইনস্টল ফাইল তৈরি করা

এখন আমরা uninstall.php ফাইল তৈরি করব, যা প্লাগিন আনইনস্টল করার সময় চালানো হবে:

touch uninstall.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিন আনইনস্টল করার সময় ট্রিগার হয়।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 */

// সরাসরি অ্যাক্সেস প্রতিরোধ করুন
if (!defined('WP_UNINSTALL_PLUGIN')) {
    exit;
}

// প্লাগিনের সেটিংস ডিলিট করুন
delete_option('scroll_to_top_settings');
// মাল্টিসাইটের জন্য সেটিংস ডিলিট করুন
delete_site_option('scroll_to_top_settings');

🔍 uninstall.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ সরাসরি অ্যাক্সেস প্রতিরোধ:

// সরাসরি অ্যাক্সেস প্রতিরোধ করুন
if (!defined('WP_UNINSTALL_PLUGIN')) {
    exit;
}

🔹 এই কোডটি নিশ্চিত করে যে এই ফাইলটি শুধুমাত্র ওয়ার্ডপ্রেসের আনইনস্টল প্রসেসের মাধ্যমে চালানো হবে।
🔹 WP_UNINSTALL_PLUGIN কনস্ট্যান্টটি শুধুমাত্র ওয়ার্ডপ্রেস আনইনস্টল প্রসেসের সময় ডিফাইন করা হয়।

2️⃣ সেটিংস ডিলিট করা:

// প্লাগিনের সেটিংস ডিলিট করুন
delete_option('scroll_to_top_settings');
// মাল্টিসাইটের জন্য সেটিংস ডিলিট করুন
delete_site_option('scroll_to_top_settings');

🔹 delete_option('scroll_to_top_settings') লাইনটি ওয়ার্ডপ্রেস ডাটাবেস থেকে প্লাগিনের সেটিংস ডিলিট করে।
🔹 delete_site_option('scroll_to_top_settings') লাইনটি মাল্টিসাইট ইনস্টলেশনের জন্য সেটিংস ডিলিট করে।

📄 ধাপ ৫: অ্যাক্টিভেটর ক্লাস তৈরি করা

এখন আমরা includes/class-scroll-to-top-activator.php ফাইল তৈরি করব:

touch includes/class-scroll-to-top-activator.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিন অ্যাক্টিভেশনের সময় ফায়ার হয়।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 */

/**
 * প্লাগিন অ্যাক্টিভেশনের সময় ফায়ার হয়।
 *
 * এই ক্লাসটি প্লাগিন অ্যাক্টিভেশনের সময় প্রয়োজনীয় সব ইনিশিয়ালাইজেশন ধারণ করে।
 *
 * @since      1.0.0
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_Activator {

    /**
     * প্লাগিন অ্যাক্টিভেশন।
     *
     * ডিফল্ট সেটিংস সেট করুন।
     *
     * @since    1.0.0
     */
    public static function activate() {
        $default_settings = array(
            'button_color'       => '#0073aa',
            'button_hover_color' => '#00a0d2',
            'button_text_color'  => '#ffffff',
            'button_size'        => 'medium',
            'button_position'    => 'right',
            'button_icon'        => 'dashicons-arrow-up-alt2',
            'button_shape'       => 'circle',
            'scroll_offset'      => 300,
            'animation_speed'    => 800,
            'display_on'         => array('home', 'posts', 'pages'),
        );

        // যদি সেটিংস আগে থেকে না থাকে, তাহলে ডিফল্ট সেটিংস যোগ করুন
        if (!get_option('scroll_to_top_settings')) {
            add_option('scroll_to_top_settings', $default_settings);
        }
    }
}

🔍 class-scroll-to-top-activator.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ ক্লাস ডিফিনিশন:

class Scroll_To_Top_Activator {
    // ...
}

🔹 এই ক্লাসটি প্লাগিন অ্যাক্টিভেশনের সময় প্রয়োজনীয় কাজগুলি করে।

2️⃣ অ্যাক্টিভেট মেথড:

/**
 * প্লাগিন অ্যাক্টিভেশন।
 *
 * ডিফল্ট সেটিংস সেট করুন।
 *
 * @since    1.0.0
 */
public static function activate() {
    $default_settings = array(
        'button_color'       => '#0073aa',
        'button_hover_color' => '#00a0d2',
        'button_text_color'  => '#ffffff',
        'button_size'        => 'medium',
        'button_position'    => 'right',
        'button_icon'        => 'dashicons-arrow-up-alt2',
        'button_shape'       => 'circle',
        'scroll_offset'      => 300,
        'animation_speed'    => 800,
        'display_on'         => array('home', 'posts', 'pages'),
    );

    // যদি সেটিংস আগে থেকে না থাকে, তাহলে ডিফল্ট সেটিংস যোগ করুন
    if (!get_option('scroll_to_top_settings')) {
        add_option('scroll_to_top_settings', $default_settings);
    }
}

🔹 activate() মেথডটি স্ট্যাটিক, যা মানে এটি ক্লাসের ইনস্ট্যান্স তৈরি না করেই কল করা যায়।
🔹 $default_settings অ্যারেতে প্লাগিনের ডিফল্ট সেটিংস ডিফাইন করা হয়েছে:

  • button_color: বাটনের ব্যাকগ্রাউন্ড কালার
  • button_hover_color: বাটনের হোভার কালার
  • button_text_color: বাটনের টেক্সট কালার
  • button_size: বাটনের সাইজ (small, medium, large)
  • button_position: বাটনের পজিশন (left, right)
  • button_icon: বাটনের আইকন (ওয়ার্ডপ্রেস ড্যাশিকন)
  • button_shape: বাটনের শেপ (circle, square, rounded)
  • scroll_offset: স্ক্রল অফসেট (পিক্সে বাটনের আইকন (ওয়ার্ডপ্রেস ড্যাশিকন)
  • button_shape: বাটনের শেপ (circle, square, rounded)
  • scroll_offset: স্ক্রল অফসেট (পিক্সেল) – বাটন দেখানোর জন্য কতটুকু স্ক্রল করতে হবে
  • animation_speed: স্ক্রল অ্যানিমেশনের গতি (মিলিসেকেন্ডে)
  • display_on: কোন পেজে বাটন দেখাবে (হোম, পোস্ট, পেজ)

🔹 if (!get_option('scroll_to_top_settings')) { ... } ব্লকটি চেক করে যে সেটিংস আগে থেকে আছে কিনা। যদি না থাকে, তাহলে add_option() ফাংশন ব্যবহার করে ডিফল্ট সেটিংস যোগ করা হয়।

📄 ধাপ ৬: ডিঅ্যাক্টিভেটর ক্লাস তৈরি করা

এখন আমরা includes/class-scroll-to-top-deactivator.php ফাইল তৈরি করব:

touch includes/class-scroll-to-top-deactivator.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিন ডিঅ্যাক্টিভেশনের সময় ফায়ার হয়।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 */

/**
 * প্লাগিন ডিঅ্যাক্টিভেশনের সময় ফায়ার হয়।
 *
 * এই ক্লাসটি প্লাগিন ডিঅ্যাক্টিভেশনের সময় প্রয়োজনীয় সব ক্লিনআপ ধারণ করে।
 *
 * @since      1.0.0
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_Deactivator {

    /**
     * প্লাগিন ডিঅ্যাক্টিভেশন।
     *
     * এখানে ডিঅ্যাক্টিভেশন লজিক লিখুন।
     * আমরা সেটিংস রাখছি যাতে পরে প্লাগিন আবার অ্যাক্টিভেট করলে সেটিংস থাকে।
     * যদি সেটিংস মুছে ফেলতে চান, তাহলে uninstall.php ব্যবহার করুন।
     *
     * @since    1.0.0
     */
    public static function deactivate() {
        // ডিঅ্যাক্টিভেশন লজিক এখানে লিখুন
    }
}

🔍 class-scroll-to-top-deactivator.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ ক্লাস ডিফিনিশন:

class Scroll_To_Top_Deactivator {
    // ...
}

🔹 এই ক্লাসটি প্লাগিন ডিঅ্যাক্টিভেশনের সময় প্রয়োজনীয় কাজগুলি করে।

2️⃣ ডিঅ্যাক্টিভেট মেথড:

/**
 * প্লাগিন ডিঅ্যাক্টিভেশন।
 *
 * এখানে ডিঅ্যাক্টিভেশন লজিক লিখুন।
 * আমরা সেটিংস রাখছি যাতে পরে প্লাগিন আবার অ্যাক্টিভেট করলে সেটিংস থাকে।
 * যদি সেটিংস মুছে ফেলতে চান, তাহলে uninstall.php ব্যবহার করুন।
 *
 * @since    1.0.0
 */
public static function deactivate() {
    // ডিঅ্যাক্টিভেশন লজিক এখানে লিখুন
}

🔹 deactivate() মেথডটি স্ট্যাটিক, যা মানে এটি ক্লাসের ইনস্ট্যান্স তৈরি না করেই কল করা যায়।
🔹 এই মেথডে আমরা কোন কোড লিখিনি, কারণ আমরা প্লাগিন ডিঅ্যাক্টিভেট করার সময় সেটিংস রাখতে চাই।
🔹 যদি আমরা সেটিংস মুছে ফেলতে চাই, তাহলে সেটা uninstall.php ফাইলে করা উচিত, যা প্লাগিন সম্পূর্ণভাবে ডিলিট করার সময় চালানো হয়।

📄 ধাপ ৭: ইন্টারন্যাশনালাইজেশন ক্লাস তৈরি করা

এখন আমরা includes/class-scroll-to-top-i18n.php ফাইল তৈরি করব:

touch includes/class-scroll-to-top-i18n.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিনের ইন্টারন্যাশনালাইজেশন ডিফাইন করে।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 */

/**
 * প্লাগিনের ইন্টারন্যাশনালাইজেশন ডিফাইন করে।
 *
 * প্লাগিনের টেক্সট ডোমেইন লোড করে ট্রান্সলেশনের জন্য।
 *
 * @since      1.0.0
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_i18n {

    /**
     * প্লাগিনের টেক্সট ডোমেইন লোড করে।
     *
     * @since    1.0.0
     */
    public function load_plugin_textdomain() {
        load_plugin_textdomain(
            'scroll-to-top',
            false,
            dirname(dirname(plugin_basename(__FILE__))) . '/languages/'
        );
    }
}

🔍 class-scroll-to-top-i18n.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ ক্লাস ডিফিনিশন:

class Scroll_To_Top_i18n {
    // ...
}

🔹 এই ক্লাসটি প্লাগিনের ইন্টারন্যাশনালাইজেশন (i18n) হ্যান্ডেল করে।

2️⃣ টেক্সট ডোমেইন লোড করা:

/**
 * প্লাগিনের টেক্সট ডোমেইন লোড করে।
 *
 * @since    1.0.0
 */
public function load_plugin_textdomain() {
    load_plugin_textdomain(
        'scroll-to-top',
        false,
        dirname(dirname(plugin_basename(__FILE__))) . '/languages/'
    );
}

🔹 load_plugin_textdomain() মেথডটি ওয়ার্ডপ্রেসের load_plugin_textdomain() ফাংশন কল করে।
🔹 প্রথম প্যারামিটার 'scroll-to-top' হল প্লাগিনের টেক্সট ডোমেইন।
🔹 দ্বিতীয় প্যারামিটার false বলে যে ডিফল্ট ওয়ার্ডপ্রেস ট্রান্সলেশন ডিরেক্টরি ব্যবহার করা হবে না।
🔹 তৃতীয় প্যারামিটার ট্রান্সলেশন ফাইলগুলির পাথ নির্দেশ করে, যা এক্ষেত্রে প্লাগিনের languages ফোল্ডার।

📄 ধাপ ৮: মূল প্লাগিন ক্লাস তৈরি করা

এখন আমরা includes/class-scroll-to-top.php ফাইল তৈরি করব:

touch includes/class-scroll-to-top.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * মূল প্লাগিন ক্লাস।
 *
 * এই ক্লাসটি প্লাগিনের কোর ফাংশনালিটি ডিফাইন করে।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 */

/**
 * মূল প্লাগিন ক্লাস।
 *
 * এই ক্লাসটি প্লাগিনের কোর ফাংশনালিটি ডিফাইন করে।
 * হুক ডিফাইন করে, লোডার সেট করে, এবং প্লাগিনের অ্যাডমিন এবং পাবলিক-ফেসিং সাইড লোড করে।
 *
 * @since      1.0.0
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top {

    /**
     * লোডার যা প্লাগিনের সমস্ত হুক মেইনটেইন করে।
     *
     * @since    1.0.0
     * @access   protected
     * @var      Scroll_To_Top_Loader    $loader    প্লাগিনের সমস্ত হুক মেইনটেইন করে।
     */
    protected $loader;

    /**
     * প্লাগিনের টেক্সট ডোমেইন।
     *
     * @since    1.0.0
     * @access   protected
     * @var      string    $plugin_name    প্লাগিনের টেক্সট ডোমেইন।
     */
    protected $plugin_name;

    /**
     * প্লাগিনের বর্তমান ভার্সন।
     *
     * @since    1.0.0
     * @access   protected
     * @var      string    $version    প্লাগিনের বর্তমান ভার্সন।
     */
    protected $version;

    /**
     * ক্লাস ইনস্ট্যান্টিয়েট করে এবং প্লাগিনের প্রোপার্টি সেট করে।
     *
     * @since    1.0.0
     */
    public function __construct() {
        if (defined('SCROLL_TO_TOP_VERSION')) {
            $this->version = SCROLL_TO_TOP_VERSION;
        } else {
            $this->version = '1.0.0';
        }
        $this->plugin_name = 'scroll-to-top';

        $this->load_dependencies();
        $this->set_locale();
        $this->define_admin_hooks();
        $this->define_public_hooks();
    }

    /**
     * প্লাগিনের অপারেশনের জন্য প্রয়োজনীয় সমস্ত ডিপেন্ডেন্সি লোড করে।
     *
     * এই ফাংশনের মধ্যে নিম্নলিখিত ফাইলগুলি অন্তর্ভুক্ত:
     *
     * - Scroll_To_Top_Loader. প্লাগিনের হুকগুলি রেজিস্টার করে।
     * - Scroll_To_Top_i18n. ইন্টারন্যাশনালাইজেশন ফাংশনালিটি ডিফাইন করে।
     * - Scroll_To_Top_Admin. অ্যাডমিন-স্পেসিফিক হুক ডিফাইন করে।
     * - Scroll_To_Top_Public. পাবলিক-ফেসিং হুক ডিফাইন করে।
     *
     * লোডার অবজেক্ট তৈরি করে এবং এটিকে $this->loader প্রোপার্টিতে সেট করে।
     *
     * @since    1.0.0
     * @access   private
     */
    private function load_dependencies() {

        /**
         * প্লাগিনের সমস্ত হুক রেজিস্টার এবং এক্সিকিউট করার জন্য ক্লাস।
         */
        require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-scroll-to-top-loader.php';

        /**
         * প্লাগিনের ইন্টারন্যাশনালাইজেশনের জন্য ক্লাস।
         */
        require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-scroll-to-top-i18n.php';

        /**
         * অ্যাডমিন এরিয়ার ফাংশনালিটির জন্য ক্লাস।
         */
        require_once plugin_dir_path(dirname(__FILE__)) . 'admin/class-scroll-to-top-admin.php';

        /**
         * পাবলিক-ফেসিং ফাংশনালিটির জন্য ক্লাস।
         */
        require_once plugin_dir_path(dirname(__FILE__)) . 'public/class-scroll-to-top-public.php';

        $this->loader = new Scroll_To_Top_Loader();
    }

    /**
     * প্লাগিনের ইন্টারন্যাশনালাইজেশন হুক সেট করে।
     *
     * @since    1.0.0
     * @access   private
     */
    private function set_locale() {
        $plugin_i18n = new Scroll_To_Top_i18n();
        $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain');
    }

    /**
     * অ্যাডমিন এরিয়ার সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
     *
     * @since    1.0.0
     * @access   private
     */
    private function define_admin_hooks() {
        $plugin_admin = new Scroll_To_Top_Admin($this->get_plugin_name(), $this->get_version());

        $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles');
        $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts');

        // অ্যাডমিন মেনু যোগ করুন
        $this->loader->add_action('admin_menu', $plugin_admin, 'add_plugin_admin_menu');

        // সেটিংস লিংক যোগ করুন
        $this->loader->add_filter('plugin_action_links_' . plugin_basename(plugin_dir_path(dirname(__FILE__)) . $this->plugin_name . '.php'), $plugin_admin, 'add_action_links');

        // সেটিংস রেজিস্টার করুন
        $this->loader->add_action('admin_init', $plugin_admin, 'register_settings');
    }

    /**
     * পাবলিক-ফেসিং সাইডের সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
     *
     * @since    1.0.0
     * @access   private
     */
    private function define_public_hooks() {
        $plugin_public = new Scroll_To_Top_Public($this->get_plugin_name(), $this->get_version());

        $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_styles');
        $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');

        // বাটন HTML যোগ করুন
        $this->loader->add_action('wp_footer', $plugin_public, 'display_scroll_to_top_button');
    }

    /**
     * প্লাগিন চালায়, সমস্ত হুক লোড করে।
     *
     * @since    1.0.0
     */
    public function run() {
        $this->loader->run();
    }

    /**
     * প্লাগিনের নাম রিটার্ন করে। প্লাগিনের টেক্সট ডোমেইন ডিফাইন করতে ব্যবহৃত হয়।
     *
     * @since     1.0.0
     * @return    string    প্লাগিনের নাম।
     */
    public function get_plugin_name() {
        return $this->plugin_name;
    }

    /**
     * লোডার রেফারেন্স রিটার্ন করে যা প্লাগিনের হুক রেজিস্টার করে।
     *
     * @since     1.0.0
     * @return    Scroll_To_Top_Loader    প্লাগিনের হুক রেজিস্টার করে।
     */
    public function get_loader() {
        return $this->loader;
    }

    /**
     * প্লাগিনের ভার্সন নম্বর রিটার্ন করে।
     *
     * @since     1.0.0
     * @return    string    প্লাগিনের ভার্সন নম্বর।
     */
    public function get_version() {
        return $this->version;
    }
}

🔍 class-scroll-to-top.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ ক্লাস প্রোপার্টি:

/**
 * লোডার যা প্লাগিনের সমস্ত হুক মেইনটেইন করে।
 *
 * @since    1.0.0
 * @access   protected
 * @var      Scroll_To_Top_Loader    $loader    প্লাগিনের সমস্ত হুক মেইনটেইন করে।
 */
protected $loader;

/**
 * প্লাগিনের টেক্সট ডোমেইন।
 *
 * @since    1.0.0
 * @access   protected
 * @var      string    $plugin_name    প্লাগিনের টেক্সট ডোমেইন।
 */
protected $plugin_name;

/**
 * প্লাগিনের বর্তমান ভার্সন।
 *
 * @since    1.0.0
 * @access   protected
 * @var      string    $version    প্লাগিনের বর্তমান ভার্সন।
 */
protected $version;

🔹 $loader: এই প্রোপার্টিতে Scroll_To_Top_Loader ক্লাসের একটি ইনস্ট্যান্স স্টোর করা হয়, যা প্লাগিনের সমস্ত হুক মেইনটেইন করে।
🔹 $plugin_name: এই প্রোপার্টিতে প্লাগিনের নাম স্টোর করা হয়, যা টেক্সট ডোমেইন হিসেবেও ব্যবহৃত হয়।
🔹 $version: এই প্রোপার্টিতে প্লাগিনের বর্তমান ভার্সন স্টোর করা হয়।

2️⃣ কনস্ট্রাক্টর:

/**
 * ক্লাস ইনস্ট্যান্টিয়েট করে এবং প্লাগিনের প্রোপার্টি সেট করে।
 *
 * @since    1.0.0
 */
public function __construct() {
    if (defined('SCROLL_TO_TOP_VERSION')) {
        $this->version = SCROLL_TO_TOP_VERSION;
    } else {
        $this->version = '1.0.0';
    }
    $this->plugin_name = 'scroll-to-top';

    $this->load_dependencies();
    $this->set_locale();
    $this->define_admin_hooks();
    $this->define_public_hooks();
}

🔹 কনস্ট্রাক্টর প্লাগিনের ভার্সন এবং নাম সেট করে।
🔹 if (defined('SCROLL_TO_TOP_VERSION')) { ... } ব্লকটি চেক করে যে SCROLL_TO_TOP_VERSION কনস্ট্যান্ট ডিফাইন করা আছে কিনা। যদি থাকে, তাহলে সেটা ব্যবহার করে, অন্যথায় ডিফল্ট ভার্সন ‘1.0.0’ সেট করে।
🔹 $this->plugin_name = 'scroll-to-top'; লাইনটি প্লাগিনের নাম সেট করে।
🔹 কনস্ট্রাক্টর চারটি মেথড কল করে:

  • load_dependencies(): প্লাগিনের ডিপেন্ডেন্সি লোড করে
  • set_locale(): ইন্টারন্যাশনালাইজেশন সেট করে
  • define_admin_hooks(): অ্যাডমিন হুক ডিফাইন করে
  • define_public_hooks(): পাবলিক হুক ডিফাইন করে

3️⃣ ডিপেন্ডেন্সি লোড করা:

/**
 * প্লাগিনের অপারেশনের জন্য প্রয়োজনীয় সমস্ত ডিপেন্ডেন্সি লোড করে।
 *
 * এই ফাংশনের মধ্যে নিম্নলিখিত ফাইলগুলি অন্তর্ভুক্ত:
 *
 * - Scroll_To_Top_Loader. প্লাগিনের হুকগুলি রেজিস্টার করে।
 * - Scroll_To_Top_i18n. ইন্টারন্যাশনালাইজেশন ফাংশনালিটি ডিফাইন করে।
 * - Scroll_To_Top_Admin. অ্যাডমিন-স্পেসিফিক হুক ডিফাইন করে।
 * - Scroll_To_Top_Public. পাবলিক-ফেসিং হুক ডিফাইন করে।
 *
 * লোডার অবজেক্ট তৈরি করে এবং এটিকে $this->loader প্রোপার্টিতে সেট করে।
 *
 * @since    1.0.0
 * @access   private
 */
private function load_dependencies() {

    /**
     * প্লাগিনের সমস্ত হুক রেজিস্টার এবং এক্সিকিউট করার জন্য ক্লাস।
     */
    require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-scroll-to-top-loader.php';

    /**
     * প্লাগিনের ইন্টারন্যাশনালাইজেশনের জন্য ক্লাস।
     */
    require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-scroll-to-top-i18n.php';

    /**
     * অ্যাডমিন এরিয়ার ফাংশনালিটির জন্য ক্লাস।
     */
    require_once plugin_dir_path(dirname(__FILE__)) . 'admin/class-scroll-to-top-admin.php';

    /**
     * পাবলিক-ফেসিং ফাংশনালিটির জন্য ক্লাস।
     */
    require_once plugin_dir_path(dirname(__FILE__)) . 'public/class-scroll-to-top-public.php';

    $this->loader = new Scroll_To_Top_Loader();
}

🔹 এই মেথডটি প্লাগিনের অপারেশনের জন্য প্রয়োজনীয় সমস্ত ফাইল লোড করে।
🔹 require_once স্টেটমেন্টগুলি নিম্নলিখিত ফাইলগুলি লোড করে:

  • class-scroll-to-top-loader.php: প্লাগিনের হুক রেজিস্টার এবং এক্সিকিউট করার জন্য ক্লাস
  • class-scroll-to-top-i18n.php: ইন্টারন্যাশনালাইজেশনের জন্য ক্লাস
  • class-scroll-to-top-admin.php: অ্যাডমিন এরিয়ার ফাংশনালিটির জন্য ক্লাস
  • class-scroll-to-top-public.php: পাবলিক-ফেসিং ফাংশনালিটির জন্য ক্লাস
    🔹 $this->loader = new Scroll_To_Top_Loader(); লাইনটি Scroll_To_Top_Loader ক্লাসের একটি ইনস্ট্যান্স তৈরি করে এবং এটিকে $this->loader প্রোপার্টিতে সেট করে।

4️⃣ লোকেল সেট করা:

/**
 * প্লাগিনের ইন্টারন্যাশনালাইজেশন হুক সেট করে।
 *
 * @since    1.0.0
 * @access   private
 */
private function set_locale() {
    $plugin_i18n = new Scroll_To_Top_i18n();
    $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain');
}

/**
 * অ্যাডমিন এরিয়ার সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
 *
 * @since    1.0.0
 * @access   private
 */
private function define_admin_hooks() {
    $plugin_admin = new Scroll_To_Top_Admin($this->get_plugin_name(), $this->get_version());

    $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles');
    $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts');

    // অ্যাডমিন মেনু যোগ করুন
    $this->loader->add_action('admin_menu', $plugin_admin, 'add_plugin_admin_menu');

    // সেটিংস লিংক যোগ করুন
    $this->loader->add_filter('plugin_action_links_' . plugin_basename(plugin_dir_path(dirname(__FILE__)) . $this->plugin_name . '.php'), $plugin_admin, 'add_action_links');

    // সেটিংস রেজিস্টার করুন
    $this->loader->add_action('admin_init', $plugin_admin, 'register_settings');
}

🔹 এই মেথডটি প্লাগিনের ইন্টারন্যাশনালাইজেশন হুক সেট করে।
🔹 $plugin_i18n = new Scroll_To_Top_i18n(); লাইনটি Scroll_To_Top_i18n ক্লাসের একটি ইনস্ট্যান্স তৈরি করে।
🔹 $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain'); লাইনটি plugins_loaded হুকে load_plugin_textdomain মেথড যোগ করে, যা প্লাগিনের টেক্সট ডোমেইন লোড করে।

5️⃣ অ্যাডমিন হুক ডিফাইন করা:

/**
 * অ্যাডমিন এরিয়ার সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
 *
 * @since    1.0.0
 * @access   private
 */
private function define_admin_hooks() {
    $plugin_admin = new Scroll_To_Top_Admin($this->get_plugin_name(), $this->get_version());

    $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles');
    $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts');

    // অ্যাডমিন মেনু যোগ করুন
    $this->loader->add_action('admin_menu', $plugin_admin, 'add_plugin_admin_menu');

    // সেটিংস লিংক যোগ করুন
    $this->loader->add_filter('plugin_action_links_' . plugin_basename(plugin_dir_path(dirname(__FILE__)) . $this->plugin_name . '.php'), $plugin_admin, 'add_action_links');

    // সেটিংস রেজিস্টার করুন
    $this->loader->add_action('admin_init', $plugin_admin, 'register_settings');
}

🔹 এই মেথডটি অ্যাডমিন এরিয়ার সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
🔹 $plugin_admin = new Scroll_To_Top_Admin($this->get_plugin_name(), $this->get_version()); লাইনটি Scroll_To_Top_Admin ক্লাসের একটি ইনস্ট্যান্স তৈরি করে।
🔹 $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_styles'); লাইনটি admin_enqueue_scripts হুকে enqueue_styles মেথড যোগ করে, যা অ্যাডমিন স্টাইল লোড করে।
🔹 $this->loader->add_action('admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts'); লাইনটি admin_enqueue_scripts হুকে enqueue_scripts মেথড যোগ করে, যা অ্যাডমিন স্ক্রিপ্ট লোড করে।
🔹 $this->loader->add_action('admin_menu', $plugin_admin, 'add_plugin_admin_menu'); লাইনটি admin_menu হুকে add_plugin_admin_menu মেথড যোগ করে, যা অ্যাডমিন মেনু যোগ করে।
🔹 $this->loader->add_filter('plugin_action_links_' . plugin_basename(plugin_dir_path(dirname(__FILE__)) . $this->plugin_name . '.php'), $plugin_admin, 'add_action_links'); লাইনটি প্লাগিন পেজে সেটিংস লিংক যোগ করে।
🔹 $this->loader->add_action('admin_init', $plugin_admin, 'register_settings'); লাইনটি admin_init হুকে register_settings মেথড যোগ করে, যা সেটিংস রেজিস্টার করে।

6️⃣ পাবলিক হুক ডিফাইন করা:

/**
 * পাবলিক-ফেসিং সাইডের সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
 *
 * @since    1.0.0
 * @access   private
 */
private function define_public_hooks() {
    $plugin_public = new Scroll_To_Top_Public($this->get_plugin_name(), $this->get_version());

    $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_styles');
    $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');

    // বাটন HTML যোগ করুন
    $this->loader->add_action('wp_footer', $plugin_public, 'display_scroll_to_top_button');
}

🔹 এই মেথডটি পাবলিক-ফেসিং সাইডের সাথে সম্পর্কিত সমস্ত হুক রেজিস্টার করে।
🔹 $plugin_public = new Scroll_To_Top_Public($this->get_plugin_name(), $this->get_version()); লাইনটি Scroll_To_Top_Public ক্লাসের একটি ইনস্ট্যান্স তৈরি করে।
🔹 $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_styles'); লাইনটি wp_enqueue_scripts হুকে enqueue_styles মেথড যোগ করে, যা পাবলিক স্টাইল লোড করে।
🔹 $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts'); লাইনটি wp_enqueue_scripts হুকে enqueue_scripts মেথড যোগ করে, যা পাবলিক স্ক্রিপ্ট লোড করে।
🔹 $this->loader->add_action('wp_footer', $plugin_public, 'display_scroll_to_top_button'); লাইনটি wp_footer হুকে display_scroll_to_top_button মেথড যোগ করে, যা স্ক্রল টু টপ বাটন HTML যোগ করে।

7️⃣ প্লাগিন চালানো:

/**
 * প্লাগিন চালায়, সমস্ত হুক লোড করে।
 *
 * @since    1.0.0
 */
public function run() {
    $this->loader->run();
}

🔹 এই মেথডটি প্লাগিন চালায়, লোডারের run() মেথড কল করে যা সমস্ত হুক লোড করে।

8️⃣ গেটার মেথড:

/**
 * প্লাগিনের নাম রিটার্ন করে। প্লাগিনের টেক্সট ডোমেইন ডিফাইন করতে ব্যবহৃত হয়।
 *
 * @since     1.0.0
 * @return    string    প্লাগিনের নাম।
 */
public function get_plugin_name() {
    return $this->plugin_name;
}

/**
 * লোডার রেফারেন্স রিটার্ন করে যা প্লাগিনের হুক রেজিস্টার করে।
 *
 * @since     1.0.0
 * @return    Scroll_To_Top_Loader    প্লাগিনের হুক রেজিস্টার করে।
 */
public function get_loader() {
    return $this->loader;
}

/**
 * প্লাগিনের ভার্সন নম্বর রিটার্ন করে।
 *
 * @since     1.0.0
 * @return    string    প্লাগিনের ভার্সন নম্বর।
 */
public function get_version() {
    return $this->version;
}

🔹 get_plugin_name() মেথডটি প্লাগিনের নাম রিটার্ন করে।
🔹 get_loader() মেথডটি লোডার রেফারেন্স রিটার্ন করে।
🔹 get_version() মেথডটি প্লাগিনের ভার্সন নম্বর রিটার্ন করে।

📄 ধাপ ৯: লোডার ক্লাস তৈরি করা

এখন আমরা includes/class-scroll-to-top-loader.php ফাইল তৈরি করব:

touch includes/class-scroll-to-top-loader.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিনের সমস্ত অ্যাকশন এবং ফিল্টার রেজিস্টার করে।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 */

/**
 * প্লাগিনের সমস্ত অ্যাকশন এবং ফিল্টার রেজিস্টার করে।
 *
 * প্লাগিনের সমস্ত হুক মেইনটেইন করে এবং রেজিস্টার করে।
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/includes
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_Loader {

    /**
     * প্লাগিনে রেজিস্টার করা সমস্ত অ্যাকশন ধারণ করে।
     *
     * @since    1.0.0
     * @access   protected
     * @var      array    $actions    প্লাগিনে রেজিস্টার করা সমস্ত অ্যাকশন ধারণ করে।
     */
    protected $actions;

    /**
     * প্লাগিনে রেজিস্টার করা সমস্ত ফিল্টার ধারণ করে।
     *
     * @since    1.0.0
     * @access   protected
     * @var      array    $filters    প্লাগিনে রেজিস্টার করা সমস্ত ফিল্টার ধারণ করে।
     */
    protected $filters;

    /**
     * ইনিশিয়ালাইজ অ্যাকশন এবং ফিল্টার কালেকশন।
     *
     * @since    1.0.0
     */
    public function __construct() {
        $this->actions = array();
        $this->filters = array();
    }

    /**
     * নতুন অ্যাকশন হুক ওয়ার্ডপ্রেসে যোগ করে।
     *
     * @since    1.0.0
     * @param    string               $hook             হুকের নাম যেখানে অ্যাকশন যোগ করা হবে।
     * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
     * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
     * @param    int                  $priority         অপশনাল। ডিফল্ট 10
     * @param    int                  $accepted_args    অপশনাল। ডিফল্ট 1
     */
    public function add_action($hook, $component, $callback, $priority = 10, $accepted_args = 1) {
        $this->actions = $this->add($this->actions, $hook, $component, $callback, $priority, $accepted_args);
    }

    /**
     * নতুন ফিল্টার হুক ওয়ার্ডপ্রেসে যোগ করে।
     *
     * @since    1.0.0
     * @param    string               $hook             হুকের নাম যেখানে ফিল্টার যোগ করা হবে।
     * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
     * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
     * @param    int                  $priority         অপশনাল। ডিফল্ট 10
     * @param    int                  $accepted_args    অপশনাল। ডিফল্ট 1
     */
    public function add_filter($hook, $component, $callback, $priority = 10, $accepted_args = 1) {
        $this->filters = $this->add($this->filters, $hook, $component, $callback, $priority, $accepted_args);
    }

    /**
     * কালেকশনে নতুন হুক যোগ করার জন্য ইউটিলিটি মেথড।
     *
     * @since    1.0.0
     * @access   private
     * @param    array                $hooks            হুক কালেকশন যেখানে নতুন হুক রেজিস্টার করা হবে।
     * @param    string               $hook             হুকের নাম যেখানে ফাংশন রেজিস্টার করা হবে।
     * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
     * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
     * @param    int                  $priority         অ্যাকশন এক্সিকিউট করার প্রায়োরিটি।
     * @param    int                  $accepted_args    কলব্যাক ফাংশনে পাস করা আর্গুমেন্টের সংখ্যা।
     * @return   array                                  কালেকশন অফ অ্যাকশনস/ফিল্টারস রেজিস্টার্ড উইথ ওয়ার্ডপ্রেস।
     */
    private function add($hooks, $hook, $component, $callback, $priority, $accepted_args) {
        $hooks[] = array(
            'hook'          => $hook,
            'component'     => $component,
            'callback'      => $callback,
            'priority'      => $priority,
            'accepted_args' => $accepted_args
        );

        return $hooks;
    }

    /**
     * রেজিস্টার করা সমস্ত ফিল্টার এবং অ্যাকশন ওয়ার্ডপ্রেসে যোগ করে।
     *
     * @since    1.0.0
     */
    public function run() {
        foreach ($this->filters as $hook) {
            add_filter($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']);
        }

        foreach ($this->actions as $hook) {
            add_action($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']);
        }
    }
}

🔍 class-scroll-to-top-loader.php ফাইলের বিস্তারিত ব্যাখ্যা:

1️⃣ ক্লাস প্রোপার্টি:

/**
 * প্লাগিনে রেজিস্টার করা সমস্ত অ্যাকশন ধারণ করে।
 *
 * @since    1.0.0
 * @access   protected
 * @var      array    $actions    প্লাগিনে রেজিস্টার করা সমস্ত অ্যাকশন ধারণ করে।
 */
protected $actions;

/**
 * প্লাগিনে রেজিস্টার করা সমস্ত ফিল্টার ধারণ করে।
 *
 * @since    1.0.0
 * @access   protected
 * @var      array    $filters    প্লাগিনে রেজিস্টার করা সমস্ত ফিল্টার ধারণ করে।
 */
protected $filters;

🔹 $actions: এই প্রোপার্টিতে প্লাগিনে রেজিস্টার করা সমস্ত অ্যাকশন ধারণ করা হয়।
🔹 $filters: এই প্রোপার্টিতে প্লাগিনে রেজিস্টার করা সমস্ত ফিল্টার ধারণ করা হয়।

2️⃣ কনস্ট্রাক্টর:

/**
 * ইনিশিয়ালাইজ অ্যাকশন এবং ফিল্টার কালেকশন।
 *
 * @since    1.0.0
 */
public function __construct() {
    $this->actions = array();
    $this->filters = array();
}

🔹 কনস্ট্রাক্টর $actions এবং $filters প্রোপার্টিগুলিকে খালি অ্যারে হিসেবে ইনিশিয়ালাইজ করে।

3️⃣ অ্যাকশন যোগ করা:

/**
 * নতুন অ্যাকশন হুক ওয়ার্ডপ্রেসে যোগ করে।
 *
 * @since    1.0.0
 * @param    string               $hook             হুকের নাম যেখানে অ্যাকশন যোগ করা হবে।
 * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
 * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
 * @param    int                  $priority         অপশনাল। ডিফল্ট 10
 * @param    int                  $accepted_args    অপশনাল। ডিফল্ট 1
 */
public function add_action($hook, $component, $callback, $priority = 10, $accepted_args = 1) {
    $this->actions = $this->add($this->actions, $hook, $component, $callback, $priority, $accepted_args);
}

🔹 এই মেথডটি নতুন অ্যাকশন হুক যোগ করে।
🔹 এটি add() প্রাইভেট মেথড কল করে, যা $actions অ্যারেতে নতুন অ্যাকশন যোগ করে।

4️⃣ ফিল্টার যোগ করা:

/**
 * নতুন ফিল্টার হুক ওয়ার্ডপ্রেসে যোগ করে।
 *
 * @since    1.0.0
 * @param    string               $hook             হুকের নাম যেখানে ফিল্টার যোগ করা হবে।
 * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
 * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
 * @param    int                  $priority         অপশনাল। ডিফল্ট 10
 * @param    int                  $accepted_args    অপশনাল। ডিফল্ট 1
 */
public function add_filter($hook, $component, $callback, $priority = 10, $accepted_args = 1) {
    $this->filters = $this->add($this->filters, $hook, $component, $callback, $priority, $accepted_args);
}

🔹 এই মেথডটি নতুন ফিল্টার হুক যোগ করে।
🔹 এটি add() প্রাইভেট মেথড কল করে, যা $filters অ্যারেতে নতুন ফিল্টার যোগ করে।

5️⃣ হুক যোগ করার ইউটিলিটি মেথড:

/**
 * কালেকশনে নতুন হুক যোগ করার জন্য ইউটিলিটি মেথড।
 *
 * @since    1.0.0
 * @access   private
 * @param    array                $hooks            হুক কালেকশন যেখানে নতুন হুক রেজিস্টার করা হবে।
 * @param    string               $hook             হুকের নাম যেখানে ফাংশন রেজিস্টার করা হবে।
 * @param    object               $component        রেফারেন্স টু দ্য অবজেক্ট ইনস্ট্যান্স।
 * @param    string               $callback         কল করার জন্য ফাংশনের নাম।
 * @param    int                  $priority         অ্যাকশন এক্সিকিউট করার প্রায়োরিটি।
 * @param    int                  $accepted_args    কলব্যাক ফাংশনে পাস করা আর্গুমেন্টের সংখ্যা।
 * @return   array                                  কালেকশন অফ অ্যাকশনস/ফিল্টারস রেজিস্টার্ড উইথ ওয়ার্ডপ্রেস।
 */
private function add($hooks, $hook, $component, $callback, $priority, $accepted_args) {
    $hooks[] = array(
        'hook'          => $hook,
        'component'     => $component,
        'callback'      => $callback,
        'priority'      => $priority,
        'accepted_args' => $accepted_args
    );

    return $hooks;
}

🔹 এই প্রাইভেট মেথডটি $hooks অ্যারেতে নতুন হুক যোগ করে।
🔹 এটি একটি অ্যাসোসিয়েটিভ অ্যারে তৈরি করে যা হুকের বিভিন্ন প্রোপার্টি ধারণ করে:

  • hook: হুকের নাম
  • component: অবজেক্ট ইনস্ট্যান্স
  • callback: কলব্যাক ফাংশনের নাম
  • priority: হুকের প্রায়োরিটি
  • accepted_args: কলব্যাক ফাংশনে পাস করা আর্গুমেন্টের সংখ্যা
    🔹 এটি আপডেট করা $hooks অ্যারে রিটার্ন করে।

6️⃣ হুক রান করা:

/**
 * রেজিস্টার করা সমস্ত ফিল্টার এবং অ্যাকশন ওয়ার্ডপ্রেসে যোগ করে।
 *
 * @since    1.0.0
 */
public function run() {
    foreach ($this->filters as $hook) {
        add_filter($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']);
    }

    foreach ($this->actions as $hook) {
        add_action($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']);
    }
}

🔹 এই মেথডটি রেজিস্টার করা সমস্ত ফিল্টার এবং অ্যাকশন ওয়ার্ডপ্রেসে যোগ করে।
🔹 প্রথম foreach লুপটি $filters অ্যারের প্রতিটি আইটেমের জন্য add_filter() ফাংশন কল করে।
🔹 দ্বিতীয় foreach লুপটি $actions অ্যারের প্রতিটি আইটেমের জন্য add_action() ফাংশন কল করে।

📄 ধাপ ১০: অ্যাডমিন ক্লাস তৈরি করা

এখন আমরা admin/class-scroll-to-top-admin.php ফাইল তৈরি করব:

touch admin/class-scroll-to-top-admin.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিনের অ্যাডমিন-স্পেসিফিক ফাংশনালিটি।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/admin
 */

/**
 * প্লাগিনের অ্যাডমিন-স্পেসিফিক ফাংশনালিটি।
 *
 * অ্যাডমিন-ফেসিং সাইডের হুক এবং ফাংশন ডিফাইন করে।
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/admin
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_Admin {

    /**
     * প্লাগিনের আইডি।
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $plugin_name    প্লাগিনের আইডি।
     */
    private $plugin_name;

    /**
     * প্লাগিনের বর্তমান ভার্সন।
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $version    প্লাগিনের বর্তমান ভার্সন।
     */
    private $version;

    /**
     * ইনিশিয়ালাইজ ক্লাস এবং সেট করে প্রোপার্টি।
     *
     * @since    1.0.0
     * @param      string    $plugin_name       প্লাগিনের নাম।
     * @param      string    $version    প্লাগিনের ভার্সন।
     */
    public function __construct($plugin_name, $version) {
        $this->plugin_name = $plugin_name;
        $this->version = $version;
    }

    /**
     * অ্যাডমিন-স্পেসিফিক স্টাইলশিট রেজিস্টার করে।
     *
     * @since    1.0.0
     */
    public function enqueue_styles() {
        wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/scroll-to-top-admin.css', array(), $this->version, 'all');
        // ওয়ার্ডপ্রেস কালার পিকার স্টাইল
        wp_enqueue_style('wp-color-picker');
    }

    /**
     * অ্যাডমিন-স্পেসিফিক জাভাস্ক্রিপ্ট রেজিস্টার করে।
     *
     * @since    1.0.0
     */
    public function enqueue_scripts() {
        wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/scroll-to-top-admin.js', array('jquery', 'wp-color-picker'), $this->version, false);
    }

    /**
     * অ্যাডমিন মেনু পেজ যোগ করে।
     *
     * @since    1.0.0
     */
    public function add_plugin_admin_menu() {
        add_options_page(
            'স্ক্রল টু টপ সেটিংস', // পেজ টাইটেল
            'স্ক্রল টু টপ', // মেনু টাইটেল
            'manage_options', // ক্যাপাবিলিটি
            $this->plugin_name, // মেনু স্লাগ
            array($this, 'display_plugin_admin_page') // কলব্যাক ফাংশন
        );
    }

    /**
     * অ্যাডমিন পেজ কন্টেন্ট রেন্ডার করে।
     *
     * @since    1.0.0
     */
    public function display_plugin_admin_page() {
        include_once('partials/scroll-to-top-admin-display.php');
    }

    /**
     * প্লাগিন অ্যাকশন লিংক যোগ করে।
     *
     * @since    1.0.0
     * @param    array    $links    প্লাগিন অ্যাকশন লিংক।
     */
    public function add_action_links($links) {
        $settings_link = array(
            '<a href="' . admin_url('options-general.php?page=' . $this->plugin_name) . '">' . __('সেটিংস', $this->plugin_name) . '</a>',
        );
        return array_merge($settings_link, $links);
    }

    /**
     * সেটিংস রেজিস্টার করে।
     *
     * @since    1.0.0
     */
    public function register_settings() {
        // সেটিংস রেজিস্টার করুন
        register_setting(
            $this->plugin_name . '_settings', // অপশন গ্রুপ
            'scroll_to_top_settings', // অপশন নাম
            array($this, 'validate_settings') // স্যানিটাইজেশন কলব্যাক
        );

        // সেটিংস সেকশন যোগ করুন
        add_settings_section(
            $this->plugin_name . '_general', // আইডি
            __('জেনারেল সেটিংস', $this->plugin_name), // টাইটেল
            array($this, 'settings_section_callback'), // কলব্যাক
            $this->plugin_name // পেজ
        );

        // বাটন কালার ফিল্ড যোগ করুন
        add_settings_field(
            'button_color', // আইডি
            __('বাটন কালার', $this->plugin_name), // টাইটেল
            array($this, 'button_color_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন হোভার কালার ফিল্ড যোগ করুন
        add_settings_field(
            'button_hover_color', // আইডি
            __('বাটন হোভার কালার', $this->plugin_name), // টাইটেল
            array($this, 'button_hover_color_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন টেক্সট কালার ফিল্ড যোগ করুন
        add_settings_field(
            'button_text_color', // আইডি
            __('বাটন টেক্সট কালার', $this->plugin_name), // টাইটেল
            array($this, 'button_text_color_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন সাইজ ফিল্ড যোগ করুন
        add_settings_field(
            'button_size', // আইডি
            __('বাটন সাইজ', $this->plugin_name), // টাইটেল
            array($this, 'button_size_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন পজিশন ফিল্ড যোগ করুন
        add_settings_field(
            'button_position', // আইডি
            __('বাটন পজিশন', $this->plugin_name), // টাইটেল
            array($this, 'button_position_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন আইকন ফিল্ড যোগ করুন
        add_settings_field(
            'button_icon', // আইডি
            __('বাটন আইকন', $this->plugin_name), // টাইটেল
            array($this, 'button_icon_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // বাটন শেপ ফিল্ড যোগ করুন
        add_settings_field(
            'button_shape', // আইডি
            __('বাটন শেপ', $this->plugin_name), // টাইটেল
            array($this, 'button_shape_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // স্ক্রল অফসেট ফিল্ড যোগ করুন
        add_settings_field(
            'scroll_offset', // আইডি
            __('স্ক্রল অফসেট (পিক্সেল)', $this->plugin_name), // টাইটেল
            array($this, 'scroll_offset_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // অ্যানিমেশন স্পিড ফিল্ড যোগ করুন
        add_settings_field(
            'animation_speed', // আইডি
            __('অ্যানিমেশন স্পিড (মিলিসেকেন্ড)', $this->plugin_name), // টাইটেল
            array($this, 'animation_speed_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );

        // ডিসপ্লে অপশন ফিল্ড যোগ করুন
        add_settings_field(
            'display_on', // আইডি
            __('বাটন দেখানোর স্থান', $this->plugin_name), // টাইটেল
            array($this, 'display_on_field_callback'), // কলব্যাক
            $this->plugin_name, // পেজ
            $this->plugin_name . '_general' // সেকশন
        );
    }

    /**
     * সেটিংস সেকশন কলব্যাক।
     *
     * @since    1.0.0
     * @param    array    $args    সেটিংস ফিল্ড আর্গুমেন্ট।
     */
    public function settings_section_callback($args) {
        echo '<p>' . __('স্ক্রল টু টপ বাটনের সেটিংস কাস্টমাইজ করুন।', $this->plugin_name) . '</p>';
    }

    /**
     * বাটন কালার ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_color_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_color']) ? $settings['button_color'] : '#0073aa';
        echo '<input type="text" class="color-picker" name="scroll_to_top_settings[button_color]" value="' . esc_attr($value) . '" />';
    }

    /**
     * বাটন হোভার কালার ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_hover_color_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_hover_color']) ? $settings['button_hover_color'] : '#00a0d2';
        echo '<input type="text" class="color-picker" name="scroll_to_top_settings[button_hover_color]" value="' . esc_attr($value) . '" />';
    }

    /**
     * বাটন টেক্সট কালার ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_text_color_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_text_color']) ? $settings['button_text_color'] : '#ffffff';
        echo '<input type="text" class="color-picker" name="scroll_to_top_settings[button_text_color]" value="' . esc_attr($value) . '" />';
    }

    /**
     * বাটন সাইজ ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_size_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_size']) ? $settings['button_size'] : 'medium';
        ?>
        <select name="scroll_to_top_settings[button_size]">
            <option value="small" <?php selected($value, 'small'); ?>><?php _e('ছোট', $this->plugin_name); ?></option>
            <option value="medium" <?php selected($value, 'medium'); ?>><?php _e('মাঝারি', $this->plugin_name); ?></option>
            <option value="large" <?php selected($value, 'large'); ?>><?php _e('বড়', $this->plugin_name); ?></option>
        </select>
        <?php
    }

    /**
     * বাটন পজিশন ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_position_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_position']) ? $settings['button_position'] : 'right';
        ?>
        <select name="scroll_to_top_settings[button_position]">
            <option value="left" <?php selected($value, 'left'); ?>><?php _e('বাম', $this->plugin_name); ?></option>
            <option value="right" <?php selected($value, 'right'); ?>><?php _e('ডান', $this->plugin_name); ?></option>
        </select>
        <?php
    }

    /**
     * বাটন আইকন ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_icon_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_icon']) ? $settings['button_icon'] : 'dashicons-arrow-up-alt2';
        ?>
        <select name="scroll_to_top_settings[button_icon]">
            <option value="dashicons-arrow-up-alt2" <?php selected($value, 'dashicons-arrow-up-alt2'); ?>><?php _e('তীর উপরে', $this->plugin_name); ?></option>
            <option value="dashicons-arrow-up" <?php selected($value, 'dashicons-arrow-up'); ?>><?php _e('তীর উপরে (সিম্পল)', $this->plugin_name); ?></option>
            <option value="dashicons-arrow-up-alt" <?php selected($value, 'dashicons-arrow-up-alt'); ?>><?php _e('তীর উপরে (অল্টারনেটিভ)', $this->plugin_name); ?></option>
            <option value="dashicons-upload" <?php selected($value, 'dashicons-upload'); ?>><?php _e('আপলোড আইকন', $this->plugin_name); ?></option>
        </select>
        <span class="dashicons <?php echo esc_attr($value); ?>"></span>
        <?php
    }

    /**
     * বাটন শেপ ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function button_shape_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['button_shape']) ? $settings['button_shape'] : 'circle';
        ?>
        <select name="scroll_to_top_settings[button_shape]">
            <option value="circle" <?php selected($value, 'circle'); ?>><?php _e('বৃত্তাকার', $this->plugin_name); ?></option>
            <option value="square" <?php selected($value, 'square'); ?>><?php _e('বর্গাকার', $this->plugin_name); ?></option>
            <option value="rounded" <?php selected($value, 'rounded'); ?>><?php _e('গোলাকার কোণ', $this->plugin_name); ?></option>
        </select>
        <?php
    }

    /**
     * স্ক্রল অফসেট ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function scroll_offset_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['scroll_offset']) ? $settings['scroll_offset'] : 300;
        echo '<input type="number" min="0" max="1000" name="scroll_to_top_settings[scroll_offset]" value="' . esc_attr($value) . '" /> ' . __('পিক্সেল', $this->plugin_name);
    }

    /**
     * অ্যানিমেশন স্পিড ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function animation_speed_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $value = isset($settings['animation_speed']) ? $settings['animation_speed'] : 800;
        echo '<input type="number" min="100" max="3000" step="100" name="scroll_to_top_settings[animation_speed]" value="' . esc_attr($value) . '" /> ' . __('মিলিসেকেন্ড', $this->plugin_name);
    }

    /**
     * ডিসপ্লে অপশন ফিল্ড কলব্যাক।
     *
     * @since    1.0.0
     */
    public function display_on_field_callback() {
        $settings = get_option('scroll_to_top_settings');
        $display_on = isset($settings['display_on']) ? $settings['display_on'] : array('home', 'posts', 'pages');
        ?>
        <label>
            <input type="checkbox" name="scroll_to_top_settings[display_on][]" value="home" <?php checked(in_array('home', $display_on), true); ?> />
            <?php _e('হোম পেজ', $this->plugin_name); ?>
        </label><br>
        <label>
            <input type="checkbox" name="scroll_to_top_settings[display_on][]" value="posts" <?php checked(in_array('posts', $display_on), true); ?> />
            <?php _e('পোস্ট', $this->plugin_name); ?>
        </label><br>
        <label>
            <input type="checkbox" name="scroll_to_top_settings[display_on][]" value="pages" <?php checked(in_array('pages', $display_on), true); ?> />
            <?php _e('পেজ', $this->plugin_name); ?>
        </label><br>
        <label>
            <input type="checkbox" name="scroll_to_top_settings[display_on][]" value="archives" <?php checked(in_array('archives', $display_on), true); ?> />
            <?php _e('আর্কাইভ পেজ', $this->plugin_name); ?>
        </label><br>
        <label>
            <input type="checkbox" name="scroll_to_top_settings[display_on][]" value="search" <?php checked(in_array('search', $display_on), true); ?> />
            <?php _e('সার্চ রেজাল্ট', $this->plugin_name); ?>
        </label>
        <?php
    }

    /**
     * সেটিংস ভ্যালিডেট করে।
     *
     * @since    1.0.0
     * @param    array    $input    সেটিংস ইনপুট।
     * @return   array              স্যানিটাইজড সেটিংস।
     */
    public function validate_settings($input) {
        $valid = array();

        // বাটন কালার ভ্যালিডেট করুন
        $valid['button_color'] = isset($input['button_color']) ? sanitize_hex_color($input['button_color']) : '#0073aa';

        // বাটন হোভার কালার ভ্যালিডেট করুন
        $valid['button_hover_color'] = isset($input['button_hover_color']) ? sanitize_hex_color($input['button_hover_color']) : '#00a0d2';

        // বাটন টেক্সট কালার ভ্যালিডেট করুন
        $valid['button_text_color'] = isset($input['button_text_color']) ? sanitize_hex_color($input['button_text_color']) : '#ffffff';

        // বাটন সাইজ ভ্যালিডেট করুন
        $valid_sizes = array('small', 'medium', 'large');
        $valid['button_size'] = isset($input['button_size']) && in_array($input['button_size'], $valid_sizes) ? $input['button_size'] : 'medium';

        // বাটন পজিশন ভ্যালিডেট করুন
        $valid_positions = array('left', 'right');
        $valid['button_position'] = isset($input['button_position']) && in_array($input['button_position'], $valid_positions) ? $input['button_position'] : 'right';

        // বাটন আইকন ভ্যালিডেট করুন
        $valid_icons = array('dashicons-arrow-up-alt2', 'dashicons-arrow-up', 'dashicons-arrow-up-alt', 'dashicons-upload');
        $valid['button_icon'] = isset($input['button_icon']) && in_array($input['button_icon'], $valid_icons) ? $input['button_icon'] : 'dashicons-arrow-up-alt2';

        // বাটন শেপ ভ্যালিডেট করুন
        $valid_shapes = array('circle', 'square', 'rounded');
        $valid['button_shape'] = isset($input['button_shape']) && in_array($input['button_shape'], $valid_shapes) ? $input['button_shape'] : 'circle';

        // স্ক্রল অফসেট ভ্যালিডেট করুন
        $valid['scroll_offset'] = isset($input['scroll_offset']) ? absint($input['scroll_offset']) : 300;

        // অ্যানিমেশন স্পিড ভ্যালিডেট করুন
        $valid['animation_speed'] = isset($input['animation_speed']) ? absint($input['animation_speed']) : 800;

        // ডিসপ্লে অপশন ভ্যালিডেট করুন
        $valid_display_options = array('home', 'posts', 'pages', 'archives', 'search');
        $valid['display_on'] = isset($input['display_on']) && is_array($input['display_on']) ? array_intersect($input['display_on'], $valid_display_options) : array('home', 'posts', 'pages');

        return $valid;
    }
}

📄 ধাপ ১১: অ্যাডমিন ভিউ তৈরি করা

এখন আমরা admin/partials/scroll-to-top-admin-display.php ফাইল তৈরি করব:

touch admin/partials/scroll-to-top-admin-display.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * অ্যাডমিন এরিয়ার ভিউ।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/admin/partials
 */
?>

<div class="wrap">
    <h1><?php echo esc_html(get_admin_page_title()); ?></h1>

    <div class="scroll-to-top-admin-content">
        <div class="scroll-to-top-admin-main">
            <form method="post" action="options.php">
                <?php
                settings_fields($this->plugin_name . '_settings');
                do_settings_sections($this->plugin_name);
                submit_button(__('সেটিংস সেভ করুন', $this->plugin_name));
                ?>
            </form>
        </div>

        <div class="scroll-to-top-admin-sidebar">
            <div class="scroll-to-top-preview">
                <h3><?php _e('বাটন প্রিভিউ', $this->plugin_name); ?></h3>
                <div class="preview-container">
                    <?php
                    $settings = get_option('scroll_to_top_settings');
                    $button_color = isset($settings['button_color']) ? $settings['button_color'] : '#0073aa';
                    $button_text_color = isset($settings['button_text_color']) ? $settings['button_text_color'] : '#ffffff';
                    $button_size = isset($settings['button_size']) ? $settings['button_size'] : 'medium';
                    $button_shape = isset($settings['button_shape']) ? $settings['button_shape'] : 'circle';
                    $button_icon = isset($settings['button_icon']) ? $settings['button_icon'] : 'dashicons-arrow-up-alt2';

                    $size_class = '';
                    switch ($button_size) {
                        case 'small':
                            $size_class = 'scroll-to-top-small';
                            break;
                        case 'medium':
                            $size_class = 'scroll-to-top-medium';
                            break;
                        case 'large':
                            $size_class = 'scroll-to-top-large';
                            break;
                    }

                    $shape_class = '';
                    switch ($button_shape) {
                        case 'circle':
                            $shape_class = 'scroll-to-top-circle';
                            break;
                        case 'square':
                            $shape_class = 'scroll-to-top-square';
                            break;
                        case 'rounded':
                            $shape_class = 'scroll-to-top-rounded';
                            break;
                    }
                    ?>
                    <div class="scroll-to-top-button <?php echo esc_attr($size_class); ?> <?php echo esc_attr($shape_class); ?>" style="background-color: <?php echo esc_attr($button_color); ?>; color: <?php echo esc_attr($button_text_color); ?>;">
                        <span class="dashicons <?php echo esc_attr($button_icon); ?>"></span>
                    </div>
                </div>
            </div>

            <div class="scroll-to-top-help">
                <h3><?php _e('সাহায্য এবং সাপোর্ট', $this->plugin_name); ?></h3>
                <p><?php _e('এই প্লাগিন সম্পর্কে সাহায্য বা সাপোর্ট পেতে, দয়া করে আমাদের সাথে যোগাযোগ করুন।', $this->plugin_name); ?></p>
                <a href="https://yourwebsite.com/contact" class="button button-primary" target="_blank"><?php _e('সাপোর্ট পান', $this->plugin_name); ?></a>
            </div>
        </div>
    </div>
</div>

📄 ধাপ ১২: অ্যাডমিন CSS তৈরি করা

এখন আমরা admin/css/scroll-to-top-admin.css ফাইল তৈরি করব:

touch admin/css/scroll-to-top-admin.css

এই ফাইলে নিম্নলিখিত কোড লিখুন:

/**
 * অ্যাডমিন-স্পেসিফিক স্টাইল।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/admin/css
 */

/* অ্যাডমিন লেআউট */
.scroll-to-top-admin-content {
    display: flex;
    flex-wrap: wrap;
    margin-top: 20px;
}

.scroll-to-top-admin-main {
    flex: 1;
    min-width: 500px;
    margin-right: 20px;
}

.scroll-to-top-admin-sidebar {
    width: 300px;
}

/* সেটিংস ফর্ম */
.form-table th {
    width: 200px;
}

.wp-picker-container {
    display: inline-block;
}

/* প্রিভিউ সেকশন */
.scroll-to-top-preview {
    background: #fff;
    border: 1px solid #ccd0d4;
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
    padding: 15px;
    margin-bottom: 20px;
}

.preview-container {
    position: relative;
    height: 150px;
    background: #f5f5f5;
    border: 1px solid #ddd;
    margin-top: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.scroll-to-top-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.scroll-to-top-small {
    width: 30px;
    height: 30px;
}

.scroll-to-top-medium {
    width: 40px;
    height: 40px;
}

.scroll-to-top-large {
    width: 50px;
    height: 50px;
}

.scroll-to-top-circle {
    border-radius: 50%;
}

.scroll-to-top-square {
    border-radius: 0;
}

.scroll-to-top-rounded {
    border-radius: 4px;
}

/* হেল্প সেকশন */
.scroll-to-top-help {
    background: #fff;
    border: 1px solid #ccd0d4;
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
    padding: 15px;
}

/* রেসপন্সিভ */
@media screen and (max-width: 782px) {
    .scroll-to-top-admin-content {
        flex-direction: column;
    }

    .scroll-to-top-admin-main {
        margin-right: 0;
        margin-bottom: 20px;
        min-width: auto;
    }

    .scroll-to-top-admin-sidebar {
        width: 100%;
    }
}

📄 ধাপ ১৩: অ্যাডমিন জাভাস্ক্রিপ্ট তৈরি করা

এখন আমরা admin/js/scroll-to-top-admin.js ফাইল তৈরি করব:

touch admin/js/scroll-to-top-admin.js

এই ফাইলে নিম্নলিখিত কোড লিখুন:

/**
 * অ্যাডমিন-স্পেসিফিক জাভাস্ক্রিপ্ট।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/admin/js
 */

(function($) {
    'use strict';

    $(document).ready(function() {
        // কালার পিকার ইনিশিয়ালাইজ করুন
        $('.color-picker').wpColorPicker({
            change: function(event, ui) {
                updatePreview();
            }
        });

        // সেটিংস পরিবর্তনের সময় প্রিভিউ আপডেট করুন
        $('select[name="scroll_to_top_settings[button_size]"], select[name="scroll_to_top_settings[button_shape]"], select[name="scroll_to_top_settings[button_icon]"]').on('change', function() {
            updatePreview();
        });

        // প্রিভিউ আপডেট ফাংশন
        function updatePreview() {
            var buttonColor = $('input[name="scroll_to_top_settings[button_color]"]').val();
            var textColor = $('input[name="scroll_to_top_settings[button_text_color]"]').val();
            var buttonSize = $('select[name="scroll_to_top_settings[button_size]"]').val();
            var buttonShape = $('select[name="scroll_to_top_settings[button_shape]"]').val();
            var buttonIcon = $('select[name="scroll_to_top_settings[button_icon]"]').val();

            // প্রিভিউ বাটন আপডেট করুন
            var $previewButton = $('.scroll-to-top-button');

            // কালার আপডেট করুন
            $previewButton.css({
                'background-color': buttonColor,
                'color': textColor
            });

            // সাইজ ক্লাস আপডেট করুন
            $previewButton.removeClass('scroll-to-top-small scroll-to-top-medium scroll-to-top-large');
            $previewButton.addClass('scroll-to-top-' + buttonSize);

            // শেপ ক্লাস আপডেট করুন
            $previewButton.removeClass('scroll-to-top-circle scroll-to-top-square scroll-to-top-rounded');
            $previewButton.addClass('scroll-to-top-' + buttonShape);

            // আইকন আপডেট করুন
            $previewButton.find('.dashicons').attr('class', 'dashicons ' + buttonIcon);
        }
    });

})(jQuery);

📄 ধাপ ১৪: পাবলিক ক্লাস তৈরি করা

এখন আমরা public/class-scroll-to-top-public.php ফাইল তৈরি করব:

touch public/class-scroll-to-top-public.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * প্লাগিনের পাবলিক-ফেসিং ফাংশনালিটি।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/public
 */

/**
 * প্লাগিনের পাবলিক-ফেসিং ফাংশনালিটি।
 *
 * পাবলিক-ফেসিং সাইডের হুক এবং ফাংশন ডিফাইন করে।
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/public
 * @author     আপনার নাম <your.email@example.com>
 */
class Scroll_To_Top_Public {

    /**
     * প্লাগিনের আইডি।
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $plugin_name    প্লাগিনের আইডি।
     */
    private $plugin_name;

    /**
     * প্লাগিনের বর্তমান ভার্সন।
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $version    প্লাগিনের বর্তমান ভার্সন।
     */
    private $version;

    /**
     * ইনিশিয়ালাইজ ক্লাস এবং সেট করে প্রোপার্টি।
     *
     * @since    1.0.0
     * @param      string    $plugin_name       প্লাগিনের নাম।
     * @param      string    $version    প্লাগিনের ভার্সন।
     */
    public function __construct($plugin_name, $version) {
        $this->plugin_name = $plugin_name;
        $this->version = $version;
    }

    /**
     * পাবলিক-ফেসিং স্টাইলশিট রেজিস্টার করে।
     *
     * @since    1.0.0
     */
    public function enqueue_styles() {
        wp_enqueue_style($this->plugin_name, plugin_dir_url(__FILE__) . 'css/scroll-to-top-public.css', array(), $this->version, 'all');
        wp_enqueue_style('dashicons');
    }

    /**
     * পাবলিক-ফেসিং জাভাস্ক্রিপ্ট রেজিস্টার করে।
     *
     * @since    1.0.0
     */
    public function enqueue_scripts() {
        wp_enqueue_script($this->plugin_name, plugin_dir_url(__FILE__) . 'js/scroll-to-top-public.js', array('jquery'), $this->version, true);

        // সেটিংস জাভাস্ক্রিপ্টে পাস করুন
        $settings = get_option('scroll_to_top_settings');
        wp_localize_script($this->plugin_name, 'scrollToTopSettings', array(
            'scrollOffset' => isset($settings['scroll_offset']) ? absint($settings['scroll_offset']) : 300,
            'animationSpeed' => isset($settings['animation_speed']) ? absint($settings['animation_speed']) : 800,
        ));
    }

    /**
     * স্ক্রল টু টপ বাটন HTML ডিসপ্লে করে।
     *
     * @since    1.0.0
     */
    public function display_scroll_to_top_button() {
        $settings = get_option('scroll_to_top_settings');

        // চেক করুন যে বর্তমান পেজে বাটন দেখাতে হবে কিনা
        $display_on = isset($settings['display_on']) ? $settings['display_on'] : array('home', 'posts', 'pages');
        $show_button = false;

        if (in_array('home', $display_on) && is_front_page()) {
            $show_button = true;
        } elseif (in_array('posts', $display_on) && is_single()) {
            $show_button = true;
        } elseif (in_array('pages', $display_on) && is_page()) {
            $show_button = true;
        } elseif (in_array('archives', $display_on) && is_archive()) {
            $show_button = true;
        } elseif (in_array('search', $display_on) && is_search()) {
            $show_button = true;
        }

        if (!$show_button) {
            return;
        }

        // সেটিংস থেকে ভ্যালু নিন
        $button_color = isset($settings['button_color']) ? $settings['button_color'] : '#0073aa';
        $button_hover_color = isset($settings['button_hover_color']) ? $settings['button_hover_color'] : '#00a0d2';
        $button_text_color = isset($settings['button_text_color']) ? $settings['button_text_color'] : '#ffffff';
        $button_size = isset($settings['button_size']) ? $settings['button_size'] : 'medium';
        $button_position = isset($settings['button_position']) ? $settings['button_position'] : 'right';
        $button_icon = isset($settings['button_icon']) ? $settings['button_icon'] : 'dashicons-arrow-up-alt2';
        $button_shape = isset($settings['button_shape']) ? $settings['button_shape'] : 'circle';

        // সাইজ ক্লাস
        $size_class = '';
        switch ($button_size) {
            case 'small':
                $size_class = 'scroll-to-top-small';
                break;
            case 'medium':
                $size_class = 'scroll-to-top-medium';
                break;
            case 'large':
                $size_class = 'scroll-to-top-large';
                break;
        }

        // পজিশন ক্লাস
        $position_class = '';
        switch ($button_position) {
            case 'left':
                $position_class = 'scroll-to-top-left';
                break;
            case 'right':
                $position_class = 'scroll-to-top-right';
                break;
        }

        // শেপ ক্লাস
        $shape_class = '';
        switch ($button_shape) {
            case 'circle':
                $shape_class = 'scroll-to-top-circle';
                break;
            case 'square':
                $shape_class = 'scroll-to-top-square';
                break;
            case 'rounded':
                $shape_class = 'scroll-to-top-rounded';
                break;
        }

        // ইনলাইন স্টাইল
        $inline_style = '
            <style>
                .scroll-to-top-button {
                    background-color: ' . esc_attr($button_color) . ';
                    color: ' . esc_attr($button_text_color) . ';
                }
                .scroll-to-top-button:hover {
                    background-color: ' . esc_attr($button_hover_color) . ';
                }
            </style>
        ';

        // বাটন HTML
        $button_html = '
            ' . $inline_style . '
            <div id="scroll-to-top" class="scroll-to-top-button ' . esc_attr($size_class) . ' ' . esc_attr($position_class) . ' ' . esc_attr($shape_class) . '">
                <span class="dashicons ' . esc_attr($button_icon) . '"></span>
            </div>
        ';

        echo $button_html;
    }
}

📄 ধাপ ১৫: পাবলিক CSS তৈরি করা

এখন আমরা public/css/scroll-to-top-public.css ফাইল তৈরি করব:

touch public/css/scroll-to-top-public.css

এই ফাইলে নিম্নলিখিত কোড লিখুন:

/**
 * পাবলিক-ফেসিং স্টাইল।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/public/css
 */

/* স্ক্রল টু টপ বাটন */
.scroll-to-top-button {
    position: fixed;
    bottom: 20px;
    z-index: 99999;
    cursor: pointer;
    display: none;
    align-items: center;
    justify-content: center;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
    transition: background-color 0.3s, transform 0.3s;
}

.scroll-to-top-button:hover {
    transform: translateY(-3px);
}

/* পজিশন */
.scroll-to-top-left {
    left: 20px;
}

.scroll-to-top-right {
    right: 20px;
}

/* সাইজ */
.scroll-to-top-small {
    width: 30px;
    height: 30px;
}

.scroll-to-top-small .dashicons {
    font-size: 16px;
    width: 16px;
    height: 16px;
}

.scroll-to-top-medium {
    width: 40px;
    height: 40px;
}

.scroll-to-top-medium .dashicons {
    font-size: 20px;
    width: 20px;
    height: 20px;
}

.scroll-to-top-large {
    width: 50px;
    height: 50px;
}

.scroll-to-top-large .dashicons {
    font-size: 24px;
    width: 24px;
    height: 24px;
}

/* শেপ */
.scroll-to-top-circle {
    border-radius: 50%;
}

.scroll-to-top-square {
    border-radius: 0;
}

.scroll-to-top-rounded {
    border-radius: 4px;
}

/* আইকন */
.scroll-to-top-button .dashicons {
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}

📄 ধাপ ১৬: পাবলিক জাভাস্ক্রিপ্ট তৈরি করা

এখন আমরা public/js/scroll-to-top-public.js ফাইল তৈরি করব:

touch public/js/scroll-to-top-public.js

এই ফাইলে নিম্নলিখিত কোড লিখুন:

/**
 * পাবলিক-ফেসিং জাভাস্ক্রিপ্ট।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/public/js
 */

(function($) {
    'use strict';

    $(document).ready(function() {
        var $scrollToTopButton = $('#scroll-to-top');
        var scrollOffset = scrollToTopSettings.scrollOffset || 300;
        var animationSpeed = scrollToTopSettings.animationSpeed || 800;

        // স্ক্রল করলে বাটন দেখান/লুকান
        $(window).scroll(function() {
            if ($(this).scrollTop() > scrollOffset) {
                $scrollToTopButton.fadeIn();
            } else {
                $scrollToTopButton.fadeOut();
            }
        });

        // বাটনে ক্লিক করলে উপরে স্ক্রল করুন
        $scrollToTopButton.on('click', function(e) {
            e.preventDefault();
            $('html, body').animate({
                scrollTop: 0
            }, animationSpeed);
            return false;
        });
    });

})(jQuery);

📄 ধাপ ১৭: ট্রান্সলেশন টেমপ্লেট তৈরি করা

এখন আমরা languages/scroll-to-top.pot ফাইল তৈরি করব:

touch languages/scroll-to-top.pot

এই ফাইলে নিম্নলিখিত কোড লিখুন:

# Copyright (C) 2023 আপনার নাম
# This file is distributed under the GPL-2.0+.
msgid ""
msgstr ""
"Project-Id-Version: Scroll To Top Button 1.0.0\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/scroll-to-top\n"
"POT-Creation-Date: 2023-01-01T00:00:00+00:00\n"
"PO-Revision-Date: 2023-01-01T00:00:00+00:00\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: WP-CLI 2.7.1\n"
"X-Domain: scroll-to-top\n"

#. Plugin Name of the plugin
msgid "Scroll To Top Button"
msgstr ""

#. Plugin URI of the plugin
msgid "https://yourwebsite.com/scroll-to-top"
msgstr ""

#. Description of the plugin
msgid "একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে যা ভিজিটরদের পেজের উপরে যেতে সাহায্য করে।"
msgstr ""

#. Author of the plugin
msgid "আপনার নাম"
msgstr ""

#. Author URI of the plugin
msgid "https://yourwebsite.com"
msgstr ""

#: admin/class-scroll-to-top-admin.php:111
msgid "সেটিংস"
msgstr ""

#: admin/class-scroll-to-top-admin.php:129
msgid "জেনারেল সেটিংস"
msgstr ""

#: admin/class-scroll-to-top-admin.php:138
msgid "বাটন কালার"
msgstr ""

#: admin/class-scroll-to-top-admin.php:147
msgid "বাটন হোভার কালার"
msgstr ""

#: admin/class-scroll-to-top-admin.php:156
msgid "বাটন টেক্সট কালার"
msgstr ""

#: admin/class-scroll-to-top-admin.php:165
msgid "বাটন সাইজ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:174
msgid "বাটন পজিশন"
msgstr ""

#: admin/class-scroll-to-top-admin.php:183
msgid "বাটন আইকন"
msgstr ""

#: admin/class-scroll-to-top-admin.php:192
msgid "বাটন শেপ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:201
msgid "স্ক্রল অফসেট (পিক্সেল)"
msgstr ""

#: admin/class-scroll-to-top-admin.php:210
msgid "অ্যানিমেশন স্পিড (মিলিসেকেন্ড)"
msgstr ""

#: admin/class-scroll-to-top-admin.php:219
msgid "বাটন দেখানোর স্থান"
msgstr ""

#: admin/class-scroll-to-top-admin.php:232
msgid "স্ক্রল টু টপ বাটনের সেটিংস কাস্টমাইজ করুন।"
msgstr ""

#: admin/class-scroll-to-top-admin.php:267
msgid "ছোট"
msgstr ""

#: admin/class-scroll-to-top-admin.php:268
msgid "মাঝারি"
msgstr ""

#: admin/class-scroll-to-top-admin.php:269
msgid "বড়"
msgstr ""

#: admin/class-scroll-to-top-admin.php:283
msgid "বাম"
msgstr ""

#: admin/class-scroll-to-top-admin.php:284
msgid "ডান"
msgstr ""

#: admin/class-scroll-to-top-admin.php:298
msgid "তীর উপরে"
msgstr ""

#: admin/class-scroll-to-top-admin.php:299
msgid "তীর উপরে (সিম্পল)"
msgstr ""

#: admin/class-scroll-to-top-admin.php:300
msgid "তীর উপরে (অল্টারনেটিভ)"
msgstr ""

#: admin/class-scroll-to-top-admin.php:301
msgid "আপলোড আইকন"
msgstr ""

#: admin/class-scroll-to-top-admin.php:316
msgid "বৃত্তাকার"
msgstr ""

#: admin/class-scroll-to-top-admin.php:317
msgid "বর্গাকার"
msgstr ""

#: admin/class-scroll-to-top-admin.php:318
msgid "গোলাকার কোণ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:332
msgid "পিক্সেল"
msgstr ""

#: admin/class-scroll-to-top-admin.php:344
msgid "মিলিসেকেন্ড"
msgstr ""

#: admin/class-scroll-to-top-admin.php:357
msgid "হোম পেজ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:361
msgid "পোস্ট"
msgstr ""

#: admin/class-scroll-to-top-admin.php:365
msgid "পেজ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:369
msgid "আর্কাইভ পেজ"
msgstr ""

#: admin/class-scroll-to-top-admin.php:373
msgid "সার্চ রেজাল্ট"
msgstr ""

#: admin/partials/scroll-to-top-admin-display.php:21
msgid "সেটিংস সেভ করুন"
msgstr ""

#: admin/partials/scroll-to-top-admin-display.php:28
msgid "বাটন প্রিভিউ"
msgstr ""

#: admin/partials/scroll-to-top-admin-display.php:65
msgid "সাহায্য এবং সাপোর্ট"
msgstr ""

#: admin/partials/scroll-to-top-admin-display.php:66
msgid "এই প্লাগিন সম্পর্কে সাহায্য বা সাপোর্ট পেতে, দয়া করে আমাদের সাথে যোগাযোগ করুন।"
msgstr ""

#: admin/partials/scroll-to-top-admin-display.php:67
msgid "সাপোর্ট পান"
msgstr ""

📄 ধাপ ১৮: পাবলিক ভিউ তৈরি করা

এখন আমরা public/partials/scroll-to-top-public-display.php ফাইল তৈরি করব:

touch public/partials/scroll-to-top-public-display.php

এই ফাইলে নিম্নলিখিত কোড লিখুন:

<?php
/**
 * পাবলিক-ফেসিং ফাংশনালিটির জন্য ভিউ।
 *
 * @link       https://yourwebsite.com
 * @since      1.0.0
 *
 * @package    Scroll_To_Top
 * @subpackage Scroll_To_Top/public/partials
 */
?>

<!-- এই ফাইলটি শুধুমাত্র ভিউ কোড ধারণ করার জন্য। -->

📄 ধাপ ১৯: README.txt তৈরি করা

এখন আমরা README.txt ফাইল তৈরি করব:

touch README.txt

এই ফাইলে নিম্নলিখিত কোড লিখুন:

=== Scroll To Top Button ===
Contributors: yourname
Donate link: https://yourwebsite.com/donate
Tags: scroll to top, back to top, scroll button, vanilla js
Requires at least: 5.0
Tested up to: 6.2
Stable tag: 1.0.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে যা ভিজিটরদের পেজের উপরে যেতে সাহায্য করে।

== Description ==

Scroll To Top Button প্লাগিনটি আপনার ওয়েবসাইটে একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে, যা ভিজিটরদের পেজের উপরে যেতে সাহায্য করে। এটি ভ্যানিলা জাভাস্ক্রিপ্ট ব্যবহার করে তৈরি করা হয়েছে এবং এতে একটি অ্যাডমিন প্যানেল আছে যেখানে আপনি বাটনের বিভিন্ন সেটিংস কাস্টমাইজ করতে পারেন।

**ফিচার:**

* কাস্টমাইজেবল বাটন কালার
* কাস্টমাইজেবল বাটন সাইজ
* কাস্টমাইজেবল বাটন পজিশন
* কাস্টমাইজেবল বাটন শেপ
* কাস্টমাইজেবল বাটন আইকন
* কাস্টমাইজেবল স্ক্রল অফসেট
* কাস্টমাইজেবল অ্যানিমেশন স্পিড
* নির্দিষ্ট পেজে বাটন দেখানোর অপশন

== Installation ==

1. প্লাগিন ফাইলগুলি `/wp-content/plugins/scroll-to-top` ডিরেক্টরিতে আপলোড করুন, অথবা ওয়ার্ডপ্রেস প্লাগিন ডিরেক্টরি থেকে সরাসরি ইনস্টল করুন।
2. ওয়ার্ডপ্রেস অ্যাডমিন প্যানেলের 'প্লাগিন' মেনুতে প্লাগিনটি অ্যাক্টিভেট করুন।
3. 'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে প্লাগিনের সেটিংস কাস্টমাইজ করুন।

== Frequently Asked Questions ==

= আমি কিভাবে বা্টনের কালার পরিবর্তন করতে পারি? =

'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে আপনি বাটনের কালার, হোভার কালার, এবং টেক্সট কালার পরিবর্তন করতে পারেন।

= আমি কিভাবে বাটনের সাইজ পরিবর্তন করতে পারি? =

'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে আপনি বাটনের সাইজ পরিবর্তন করতে পারেন। তিনটি অপশন আছে: ছোট, মাঝারি, এবং বড়।

= আমি কিভাবে বাটনের পজিশন পরিবর্তন করতে পারি? =

'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে আপনি বাটনের পজিশন পরিবর্তন করতে পারেন। দুটি অপশন আছে: বাম এবং ডান।

= আমি কিভাবে বাটনের আইকন পরিবর্তন করতে পারি? =

'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে আপনি বাটনের আইকন পরিবর্তন করতে পারেন। বিভিন্ন ধরনের আইকন অপশন আছে।

= আমি কিভাবে নির্দিষ্ট পেজে বাটন দেখাতে পারি? =

'সেটিংস' > 'স্ক্রল টু টপ' মেনুতে গিয়ে আপনি নির্দিষ্ট পেজে বাটন দেখানোর অপশন সেট করতে পারেন। আপনি হোম পেজ, পোস্ট, পেজ, আর্কাইভ পেজ, এবং সার্চ রেজাল্টে বাটন দেখানোর অপশন সেট করতে পারেন।

== Screenshots ==

1. অ্যাডমিন সেটিংস পেজ
2. ফ্রন্টএন্ড বাটন প্রিভিউ

== Changelog ==

= 1.0.0 =
* প্রথম রিলিজ

== Upgrade Notice ==

= 1.0.0 =
প্রথম রিলিজ

🚀 ধাপ ২০: প্লাগিন টেস্ট করা

এখন আপনার প্লাগিন তৈরি হয়ে গেছে! এটি টেস্ট করার জন্য:

  1. আপনার ওয়ার্ডপ্রেস অ্যাডমিন প্যানেলে যান।
  2. ‘প্লাগিন’ > ‘ইনস্টলড প্লাগিন’ মেনুতে যান।
  3. ‘Scroll To Top Button’ প্লাগিনটি খুঁজে বের করুন এবং অ্যাক্টিভেট করুন।
  4. ‘সেটিংস’ > ‘স্ক্রল টু টপ’ মেনুতে যান এবং প্লাগিনের সেটিংস কাস্টমাইজ করুন।
  5. আপনার ওয়েবসাইটের ফ্রন্টএন্ডে যান এবং পেজটি স্ক্রল করুন। আপনি দেখবেন যে স্ক্রল টু টপ বাটনটি আপনার সেটিংস অনুযায়ী দেখা যাচ্ছে।

📝 সারাংশ

এই টিউটোরিয়ালে, আমরা একটি পূর্ণাঙ্গ প্রফেশনাল ওয়ার্ডপ্রেস প্লাগিন তৈরি করেছি যা একটি কাস্টমাইজেবল স্ক্রল টু টপ বাটন যোগ করে। আমরা নিম্নলিখিত বিষয়গুলি শিখেছি:

  1. প্রফেশনাল ওয়ার্ডপ্রেস প্লাগিন স্ট্রাকচার তৈরি করা
  2. ওয়ার্ডপ্রেস অ্যাক্টিভেশন এবং ডিঅ্যাক্টিভেশন হুক ব্যবহার করা
  3. ওয়ার্ডপ্রেস সেটিংস API ব্যবহার করা
  4. অ্যাডমিন প্যানেল তৈরি করা
  5. ফ্রন্টএন্ড ফাংশনালিটি যোগ করা
  6. ভ্যানিলা জাভাস্ক্রিপ্ট ব্যবহার করা
  7. ইন্টারন্যাশনালাইজেশন সাপোর্ট যোগ করা
  8. প্লাগিন সিকিউরিটি নিশ্চিত করা

এই প্লাগিনটি আরও উন্নত করার জন্য আপনি নিম্নলিখিত ফিচারগুলি যোগ করতে পারেন:

  1. আরও বাটন স্টাইল অপশন
  2. মোবাইল-স্পেসিফিক সেটিংস
  3. কাস্টম CSS অপশন
  4. প্রিভিউ ফাংশনালিটি
  5. ইমপোর্ট/এক্সপোর্ট সেটিংস

আশা করি এই টিউটোরিয়ালটি আপনাকে প্রফেশনাল ওয়ার্ডপ্রেস প্লাগিন ডেভেলপমেন্ট সম্পর্কে একটি ভাল ধারণা দিয়েছে!

How can we help?