পাতা সাজানো হচ্ছে•••
বিজ্ঞাপনের স্থানহেডারের নিচে
পড়ার সময়মন্তব্যে যান

Wednesday, October 21, 2026

WordPress Reading Time Shortcode Plugin: বাংলা পোস্টের আনুমানিক পড়ার সময়

WordPress Reading Time Shortcode Plugin: বাংলা পোস্টের আনুমানিক পড়ার সময়

পাঠককে একটি পোস্ট শেষ করতে আনুমানিক সময় জানাতে ছোট shortcode plugin যথেষ্ট। আমরা [reading_time] দিয়ে বর্তমান পোস্ট এবং [reading_time id="123"] দিয়ে নির্দিষ্ট পোস্ট গণনা করব। এটি staging-এ পরীক্ষা করুন, backup রাখুন, এবং মনে রাখুন: বাংলা ও মিশ্র ভাষায় ফলটি estimate, মাপা পাঠ-সময় নয়।

গণনার নিয়ম

Raw content থেকে আগে নিবন্ধিত shortcode সরাব, পরে HTML, script ও style tag বাদ দেব। তারপর Unicode-aware whitespace দিয়ে preg_split('/\s+/u', ...) করব। প্রতি মিনিটে ১৮০ শব্দ ধরে ceil(words / 180), ন্যূনতম ১ মিনিট। punctuation, সংখ্যা, emoji, code ও ছোট শব্দের কারণে বাস্তব সময় আলাদা হতে পারে।

ফাইল বানান

wp-content/plugins/reading-time-bangla/reading-time-bangla.php তৈরি করুন:

<?php
/**
 * Plugin Name: Reading Time Bangla
 * Description: Shows an estimated reading time with a shortcode.
 * Version: 1.0.0
 * Requires at least: 6.0
 * Requires PHP: 7.4
 * License: GPL-2.0-or-later
 */
defined( 'ABSPATH' ) || exit;

File header না থাকলে WordPress plugin চিনবে না। ABSPATH check সরাসরি URL দিয়ে ফাইল চালানো আটকায়।

Shortcode handler

shortcode_atts() optional ID গ্রহণ করে। ID না থাকলে get_the_ID() Loop-এর বর্তমান পোস্ট নির্বাচন করে।

function rt_bangla_shortcode( $atts = array() ) {
    $atts = shortcode_atts(
        array( 'id' => 0 ),
        (array) $atts,
        'reading_time'
    );
    $post_id = absint( $atts['id'] );
    if ( ! $post_id ) {
        $post_id = get_the_ID();
    }
    if ( ! $post_id ) {
        return '';
    }
    $post = get_post( $post_id );
    if ( ! $post instanceof WP_Post ) {
        return '';
    }
    $text = strip_shortcodes( $post->post_content );
    $text = wp_strip_all_tags( $text, true );
    $text = trim( $text );
    if ( '' === $text ) {
        $words = 0;
    } else {
        $parts = preg_split( '/\s+/u', $text, -1, PREG_SPLIT_NO_EMPTY );
        $words = is_array( $parts ) ? count( $parts ) : 0;
    }
    $minutes = max( 1, (int) ceil( $words / 180 ) );
    return esc_html( sprintf( 'পড়তে আনুমানিক %d মিনিট', $minutes ) );
}
add_shortcode( 'reading_time', 'rt_bangla_shortcode' );

কেন ধাপগুলো নিরাপদ

strip_shortcodes() নিবন্ধিত shortcode tag সরায়। wp_strip_all_tags() HTML সরানোর পাশাপাশি script/style-এর content-ও বাদ দেয়। কাঁচা user markup output-এ ফেরত দিচ্ছি না এবং শেষ ফল esc_html()-এ escape করছি। তাই return plain text। Handler-এ ID দিলে সেই পোস্টের content গণনা হয়; Loop-এর বাইরে থাকলে explicit ID দিন। Private content প্রকাশের জন্য এটি ব্যবহার করবেন না; চাইলে পরের সংস্করণে get_post_status() যাচাই যোগ করুন।

ব্যবহার ও পরীক্ষা

Plugin সক্রিয় করে draft বা staging পোস্টে বসান:

[reading_time]
[reading_time id="42"]

খালি content-এ ফল ১ মিনিট থাকবে। বাংলা paragraph, English sentence, heading, link, উদ্ধৃতি এবং অন্য shortcode দিয়ে পরীক্ষা করুন। ১৮০ শব্দ/মিনিট স্থির heuristic; এটি screen-reader সময় বা নিশ্চিত পাঠ-সময় নয়।

রক্ষণাবেক্ষণ

Label অনুবাদযোগ্য করতে __() ও text domain যোগ করা যায়, তবে অনুবাদও escape করুন। বড় সাইটে cache করা সম্ভব, কিন্তু প্রথম সংস্করণে সরলতা ও কম ভুল বেশি গুরুত্বপূর্ণ। Function ও shortcode prefix অনন্য রাখুন, কারণ অন্য plugin একই tag নিবন্ধন করলে আচরণ বদলাতে পারে। Live-এ নেওয়ার আগে PHP lint, staging test, rollback copy এবং backup রাখুন। Core/plugin update-এর পর UTF-8 বাংলা, empty content, invalid ID ও private post আবার পরীক্ষা করুন।

সীমাবদ্ধতা বুঝে ব্যবহার

Unicode regex-এর u flag গুরুত্বপূর্ণ; সেটি ছাড়া UTF-8 text-এ whitespace আচরণ অপ্রত্যাশিত হতে পারে। PREG_SPLIT_NO_EMPTY একাধিক space বা line break থেকে খালি item বাদ দেয়। এটি ভাষাগত tokenization নয়—বাংলা শব্দের সঙ্গে punctuation লেগে থাকলে একটি token-ই ধরা হবে। ফলে এই shortcode analytics বা billing-এর জন্য ব্যবহার করবেন না। এটি পাঠককে দ্রুত একটি ধারণা দেওয়ার UI সহায়ক।

Shortcode-এর নাম prefix করা যায়, কিন্তু এখানে public ব্যবহার সহজ রাখতে reading_time রাখা হয়েছে। একই নামের conflict এড়াতে site-এ সক্রিয় plugin তালিকা দেখুন। Error হলে প্রথমে shortcode spelling, plugin activation, PHP syntax এবং post ID পরীক্ষা করুন। একটি child theme-এ code কপি না করে plugin হিসেবেই রাখুন, যাতে theme বদলালেও reading-time feature থাকে।

Security হিসেবে ID দিয়ে অন্য post পড়ার সম্ভাবনাও ভাবুন। সাধারণ published post-এর জন্য এটি ঠিক, কিন্তু private, pending বা draft content display context-এর বাইরে আনবেন না। প্রয়োজন হলে current_user_can() এবং status check যোগ করুন। Production deployment-এ least privilege, backup, staging এবং rollback ধাপ লিখে রাখলে ছোট plugin-ও রক্ষণাবেক্ষণযোগ্য থাকে।

Testing checklist-এ কয়েকটি edge case রাখুন: ID হিসাবে অক্ষর, শূন্য, deleted post, password-protected post এবং non-post object। absint() ভুল input-কে নিরাপদ integer-এ নামায়, কিন্তু authorization-এর বিকল্প নয়। তাই নির্দিষ্ট ID নিয়ে ফল দেখানোর নীতি সাইটের content visibility-এর সঙ্গে মিলিয়ে নিন। একই সঙ্গে UTF-8 database, Bengali punctuation এবং line break সহ একটি fixture রাখুন।

Output-এ HTML না ফেরানোর সিদ্ধান্ত ইচ্ছাকৃত: theme অনুযায়ী wrapper চাইলে পরে <span> যোগ করে attribute escape করতে হবে। এখন plain text হওয়ায় CSS dependency নেই এবং post editor-এর ভিতরে ব্যবহার সহজ। Version bump ও changelog লিখলে ভবিষ্যতে ১৮০-এর বদলে configurable speed যোগ করাও পরিষ্কার থাকবে।

Official sources

শেয়ার করুন WhatsApp Facebook Telegram X

No comments:

Post a Comment

বিজ্ঞাপনের স্থানপোস্ট ১
বিজ্ঞাপনের স্থানপোস্ট ২
বিজ্ঞাপনের স্থানপোস্ট ৩
About Me
পরিচয়
নাম

নাজমুল ইসলাম

ভূমিকা

Tech Specialist

আরও পরিচিতি
শিক্ষা / পড়াশোনার বিষয়
HSC
কাজ / প্রযুক্তির ক্ষেত্র / দক্ষতা
শহর / জেলা
শখ / আগ্রহ
ব্লগের বিষয় / পাঠকদের জন্য সংক্ষিপ্ত পরিচিতি
ব্যক্তিগত লেখা, ছোট গল্প ও প্রযুক্তি ভাবনা নিয়ে লিখি।
পাবলিক ওয়েবসাইট / সোশ্যাল লিংক
শেষের পরিচিতি
নাজমুল ইসলাম · Tech Specialist

লেখার আর্কাইভ

মাস অনুযায়ী পুরোনো লেখাগুলো খুঁজে নিন।