পাতা সাজানো হচ্ছে•••
পাঠকের খেলাঘরছোট্ট বুদ্ধির আসর৬টি টেক প্রশ্ন · প্রতি খেলায় নতুন সেট
ধাঁধা ১ / ৬স্কোর ০ / ৬
আমি ইন্টারনেটের ঠিকানা-বই: নাম থেকে সার্ভারের IP ঠিকানা খুঁজে দিই। আমি কে?

বিজ্ঞাপনের স্থানহেডারের নিচে

বিষয়ভিত্তিক লেখা

Shortcode

এই বিভাগের লেখাগুলো একসঙ্গে পড়ুন।

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

নিরাপদ Accessible Notice Box-এর জন্য Custom WordPress Shortcode Plugin

নিরাপদ Accessible Notice Box-এর জন্য Custom WordPress Shortcode Plugin

বারবার সতর্কতা, টিপস বা সাফল্যের বার্তা লিখতে HTML কপি-পেস্ট করা বিরক্তিকর। একটি ছোট shortcode plugin এই কাজকে সম্পাদকের জন্য সহজ করে, আবার theme বদলালেও কাজটি রেখে দেয়। এই উদাহরণে [bns_notice] tag, তিনটি সীমিত type এবং accessible aside ব্যবহার করব। শুরুতেই staging-এ plugin চালান; production-এ নেওয়ার আগে backup রাখুন।

কেন plugin, theme নয়?

Shortcode হলো content-এর ছোট placeholder, যা render-এর সময় callback-এ যায়। Theme-এর functions.php-তে রাখলে theme বদলালে হারাতে পারে; plugin-এ রাখলে content portability ভালো থাকে। Tag-এ নিজের prefix ব্যবহার করুন, কারণ একই নামের shortcode হলে পরে load হওয়া callback আগেরটিকে override করতে পারে।

ফাইল ও কোড

wp-content/plugins/bengali-notice-shortcode/bengali-notice-shortcode.php বানিয়ে এই কোড বসান:

<?php
/**
 * Plugin Name: Bengali Notice Shortcode
 * Description: Accessible notice box shortcode.
 * Version: 1.0.0
 */
if ( ! defined( 'ABSPATH' ) ) { exit; }

function bns_notice_shortcode( $atts, $content = null ) {
    $atts = shortcode_atts(
        array( 'type' => 'info', 'title' => '' ),
        $atts,
        'bns_notice'
    );
    $allowed = array( 'info', 'success', 'warning' );
    $type = in_array( $atts['type'], $allowed, true ) ? $atts['type'] : 'info';
    $title = sanitize_text_field( $atts['title'] );
    $body  = wp_kses_post( do_shortcode( $content ?? '' ) );
    $label = $title ? '<strong class="bns-title">' . esc_html( $title ) . '</strong>' : '';
    return '<aside class="bns-notice bns-' . esc_attr( $type ) . '" role="status">' . $label . '<div>' . $body . '</div></aside>';
}
add_shortcode( 'bns_notice', 'bns_notice_shortcode' );

কোডটি কীভাবে নিরাপদ?

shortcode_atts() শুধু অনুমোদিত type ও title রাখে এবং default পূরণ করে। type-কে allow-list দিয়ে মিলিয়েছি; অজানা value হলে info হবে। title plain text, তাই sanitize_text_field() দিয়ে পরিষ্কার করে output-এ esc_html() করেছি। class attribute-এ esc_attr() আছে। ভেতরের content-এ সাধারণ formatting দরকার বলে wp_kses_post() ব্যবহার করেছি—এটি arbitrary script ঢুকতে দেয় না। Shortcode callback-এ echo নয়, string return করা উচিত।

ব্যবহার

[bns_notice type="warning" title="ব্যাকআপ নিন"]লাইভ সাইটে পরিবর্তনের আগে staging পরীক্ষা করুন।[/bns_notice]

[bns_notice type="success" title="সম্পন্ন"]ফাইলটি আপলোড হয়েছে।[/bns_notice]

[bns_notice]শুধু তথ্যের বার্তা।[/bns_notice]

Plugin activate করে একটি post-এ shortcode দিন। Output দেখে keyboard focus, contrast এবং screen reader-এ অর্থপূর্ণ ঘোষণা হচ্ছে কি না পরীক্ষা করুন। role="status" সাধারণ status বার্তার জন্য উপযোগী; জরুরি বিপদ হলে আলাদা আচরণ দরকার, তাই নির্বিচারে alert ব্যবহার করবেন না। CSS না থাকলেও semantic aside পাঠযোগ্য থাকবে। চাইলে plugin-এ enqueue করা ছোট stylesheet যোগ করুন—inline style দিয়ে content ভারী করবেন না।

সীমা ও রক্ষণাবেক্ষণ

এই shortcode title-এ markup ইচ্ছাকৃতভাবে নিষিদ্ধ। body-তে allowed HTML রাখা হয়েছে, তবুও untrusted shortcode nesting বা third-party filter থাকলে staging-এ পরীক্ষা জরুরি। Function prefix করা হয়েছে যাতে global namespace সংঘর্ষ কমে। ভবিষ্যতে নতুন type যোগ করলে allow-list, CSS এবং documentation একসঙ্গে বদলান।

সম্পাদকের জন্য ছোট নিয়ম

একটি notice-এ একটাই উদ্দেশ্য রাখুন। title সংক্ষিপ্ত, body-তে সরাসরি নির্দেশনা এবং প্রয়োজন হলে একটি descriptive link দিন। একই post-এ অনেক nested notice দিলে screen reader-এর reading flow ভারী হতে পারে। তাই editorial guideline-এ type-এর অর্থ লিখে দিন: info সাধারণ তথ্য, success সম্পন্ন কাজ, warning সতর্কতা।

CSS যোগ করার সময় শুধু রঙের উপর নির্ভর করবেন না; border, icon-এর accessible label বা heading-ও ব্যবহার করুন। contrast checker দিয়ে foreground ও background পরীক্ষা করুন। HTML output পরিবর্তন করলে view-source এবং keyboard navigation দুটোই যাচাই করুন। Shortcode content-এ user-generated text থাকলে allowed markup সীমিত রাখাই নিরাপদ।

Plugin update করার আগে staging-এ পুরোনো post render হচ্ছে কি না দেখুন। shortcode tag rename করলে পুরোনো content ভেঙে যাবে, তাই দরকার হলে পুরোনো tag-এর compatibility alias রাখুন। Function name-এ prefix এবং unique CSS class ব্যবহার করলে অন্য plugin-এর সঙ্গে সংঘর্ষের সম্ভাবনা কমে।

ছোট কিন্তু জরুরি যাচাই

কোড বসানোর পরে শুধু editor-এ সবুজ দেখালেই শেষ নয়। আলাদা browser-এ logged-out অবস্থায় page খুলুন, keyboard দিয়ে link ও control চালান, এবং mobile width-এ horizontal scroll হচ্ছে কি না দেখুন। PHP ও WordPress version-এর compatibility নোট করুন। staging-এ error log দেখে warning থাকলে সমাধান করুন; live সাইটে অযথা debug output দেখাবেন না। Backup ফেরত আনার পদ্ধতিও আগে পরীক্ষা করে রাখুন। কোনও third-party plugin একই hook বা class ব্যবহার করছে কি না দেখলে prefix বদলান। ছোট পরিবর্তন একবারে deploy করলে সমস্যা হলে কোন অংশ rollback করতে হবে তা স্পষ্ট থাকে। এই নিয়মগুলি theme, shortcode এবং CPT—তিন ক্ষেত্রেই প্রযোজ্য।

নোট লিখে রাখুন কোন file কোথায় রাখা হয়েছে এবং কোন shortcode বা URL পরীক্ষা করা হয়েছে। এতে ভবিষ্যতের update-এ ভুল কমে এবং অন্য developer দ্রুত দায়িত্ব নিতে পারেন। এই অভ্যাসটি রাখুন।

আরও পড়ুন

সতর্কতা: লাইভ সাইটে বদলানোর আগে staging কপি, পূর্ণ backup এবং rollback পরিকল্পনা রাখুন। কোডটি নিজের WordPress/PHP সংস্করণে পরীক্ষা করুন।

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

নাজমুল ইসলাম

ভূমিকা

Tech Specialist

আরও পরিচিতি
শিক্ষা / পড়াশোনার বিষয়
কাজ / প্রযুক্তির ক্ষেত্র / দক্ষতা
Web Designer , Web Developer & Blog Content Writer.
শহর / জেলা
Natore , Rajshahi
শখ / আগ্রহ
Taste Something Different 😜 always.
ব্লগের বিষয়
পাবলিক ওয়েবসাইট / সোশ্যাল লিংক
শেষের পরিচিতি
নাজমুল ইসলাম · Tech Specialist

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

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