শর্টকোড উপস্থিত থাকলে স্ক্রিপ্টগুলি / স্টাইলগুলি সারণী করুন


54

প্লাগইনগুলিতে ব্যবহারের জন্য স্ক্রিপ্টগুলি এবং / অথবা শৈলীগুলি নিবন্ধিত করার আইডিয়া উপায় কী?

আমি সম্প্রতি একটি শর্টকোড সহ ব্যবহারকারী অবতার / গ্রাভাটার যুক্ত করতে একটি প্লাগইন সাধারণ প্লাগইন তৈরি করেছি । আমার অবতার (স্কোয়ার, বৃত্তাকার ইত্যাদি) প্রদর্শনের জন্য বিভিন্ন স্টাইলের বিকল্প রয়েছে এবং সিএসএস সরাসরি শর্টকোডে রাখার সিদ্ধান্ত নিয়েছি।

যাইহোক, আমি এখন বুঝতে পারি যে এটি কোনও ভাল পদ্ধতির নয় কারণ এটি যখন প্রতি পৃষ্ঠায় শর্টকোড ব্যবহার করা হয় তখন প্রতিবার CSS এর পুনরাবৃত্তি করবে। আমি এই সাইটে আরও বেশ কয়েকটি পন্থা দেখেছি এবং ডাব্লুপি কোডডেক্স এমনকি তাদের নিজস্ব দুটি উদাহরণ রয়েছে তাই কোন পদ্ধতির সুনির্দিষ্ট এবং দ্রুততম তা জানা মুশকিল।

আমি বর্তমানে যে পদ্ধতিগুলি সম্পর্কে অবগত রয়েছি সেগুলি এখানে:

পদ্ধতি 1: সরাসরি শর্টকেডে অন্তর্ভুক্ত করুন - এটি বর্তমানে আমি প্লাগইনে করছি, তবে কোডটি পুনরাবৃত্তি করার পরে এটি ভাল মনে হচ্ছে না।

class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">

</style>
<?php
    return "$content";
     }
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );

পদ্ধতি 2: শর্তসাপেক্ষে স্ক্রিপ্টগুলি বা শৈলীর সন্ধানের জন্য ক্লাস ব্যবহার করুন

class My_Shortcode {
    static $add_script;
    static function init() {
        add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
        add_action('init', array(__CLASS__, 'register_script'));
        add_action('wp_footer', array(__CLASS__, 'print_script'));
    }
    static function handle_shortcode($atts) {
        self::$add_script = true;
        // shortcode handling here
    }
    static function register_script() {
        wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
    }
    static function print_script() {
        if ( ! self::$add_script )
            return;
        wp_print_scripts('my-script');
    }
}
My_Shortcode::init();

পদ্ধতি 3: ব্যবহার get_shortcode_regex();

function your_prefix_detect_shortcode() {

    global $wp_query;   
    $posts = $wp_query->posts;
    $pattern = get_shortcode_regex();

    foreach ($posts as $post){
        if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
            && array_key_exists( 2, $matches )
            && in_array( 'myshortcode', $matches[2] ) )
        {
            // css/js 
            break;  
        }    
    }
}
add_action( 'wp', 'your_prefix_detect_shortcode' );

পদ্ধতি 4: ব্যবহার has_shortcode();

function custom_shortcode_scripts() {
    global $post;
    if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
        wp_enqueue_script( 'my-script');
    }
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');

আমি মনে করি Method 4: Using has_shortcode();সর্বোত্তম কারণ কারণ এটি নিশ্চিত করবে যে স্ক্রিপ্টগুলি এবং শৈলীগুলি একবার লোড হবে যদি পোস্ট সামগ্রীতে শর্টকোডের একাধিক ব্যবহার নির্বিশেষে শর্টকোড থাকে। যদিও এটি উইজেটগুলিতে বা সাইডবারে শর্টকোড ব্যবহারের জন্য কাজ না করে তবে নিশ্চিত নয়। যদি এটি কোনও প্লাগিনের জন্য হয় তবে আমি আপনাকে শর্টকোডের সাথে স্ক্রিপ্টগুলি বেঁধে দেওয়ার পরামর্শ দেব না কারণ কেউ কেউ পছন্দসই আউটপুট পেতে শর্টকোডের পরিবর্তে আপনার ফাংশনটিকে কল করতে পারে।
রবার্ট হিউ

উত্তর:


45

আমি একটি অন্য উপায় খুঁজে পেয়েছি যা আমার পক্ষে ভালভাবে কাজ করে:

  • প্লাগইন সূচনা করার সময়, আপনার স্ক্রিপ্ট এবং শৈলীগুলি সজ্জিত করবেন না, তবে এগুলি wp_register_styleএবং এর সাথে নিবন্ধ করুন wp_register_script

  • এরপরে আপনি স্ক্রিপ্ট / স্টাইলটি চাহিদা অনুযায়ী লোড করতে পারেন। উদাহরণস্বরূপ আপনি যখন একটি শর্টকোড রেন্ডার করেন wp_enqueue_style("your_style")এবং wp_enqueue_script("your_script")

এই পদ্ধতিটি ব্যবহার করে এখানে প্লাগইন একটি উদাহরণ যা আপনাকে শর্টকোড হিসাবে get_avatar ব্যবহার করতে দেয়। শর্টকোড উপস্থিত থাকলে স্টাইলশীটটি কেবল তৈরি করা হয়।

ব্যবহার (বর্তমান ব্যবহারকারীর কাছে আইডি ডিফল্ট):

[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]

function wpse_165754_avatar_shortcode_wp_enqueue_scripts() {
    wp_register_style( 'get-avatar-style', plugins_url( '/css/style.css', __FILE__ ), array(), '1.0.0', 'all' );
}

add_action( 'wp_enqueue_scripts', 'wpse_165754_avatar_shortcode_wp_enqueue_scripts' );
if ( function_exists( 'get_avatar' ) ) {
    function wpse_165754_user_avatar_shortcode( $attributes ) {

        global $current_user;
        get_currentuserinfo();

        extract( shortcode_atts(
                     array(
                         "id"      => $current_user->ID,
                         "size"    => 32,
                         "default" => 'mystery',
                         "alt"     => '',
                         "class"   => '',
                     ), $attributes, 'get_avatar' ) );

        $get_avatar = get_avatar( $id, $size, $default, $alt );

        wp_enqueue_style( 'get-avatar-style' );

        return '<span class="get_avatar ' . $class . '">' . $get_avatar . '</span>';
    }

    add_shortcode( 'get_avatar', wpse_165754_user_avatar_shortcode' );
}

ভুলে গিয়েছি আমি গত বছর এই প্রশ্নটি জিজ্ঞাসা করেছি, তবে আমি আসলে বেশিরভাগ ক্ষেত্রেই এটি শুরু করেছিলাম। এটি একধরণের পদ্ধতি 1 এবং 2 এর মতো
ব্রায়ান উইলিস

4
এই পদ্ধতিটি ফুটারে সিএসএস লোড করে, যার অবশ্যই সীমাবদ্ধতা রয়েছে?
জ্যাকব র্যাকুইয়া

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

26

উত্তর শুরু করার আগে আমাকে বলতে হবে যে এই বিষয় সম্পর্কিত CSS এবং js এক নয়।

কারণটি সহজ: পৃষ্ঠার শরীরে js যুক্ত করার সময় (পাদলেখের মধ্যে) যাওয়ার একটি সাধারণ এবং বৈধ উপায়, সিএসএস <head>পৃষ্ঠার বিভাগে রাখা দরকার : এমনকি বেশিরভাগ ব্রাউজারই পৃষ্ঠাতে সিএসএস সঠিকভাবে রেন্ডার করতে পারে if বডি, এটি বৈধ এইচটিএমএল কোড নয়।

যখন একটি শর্টকোড রেন্ডার করা হয়, <head>বিভাগটি ইতিমধ্যে মুদ্রিত হয়েছিল, এর অর্থ ফুটারে কোনও সমস্যা ছাড়াই জেএস যুক্ত করা যেতে পারে, তবে শর্টকোডটি রেন্ডার করার আগে সিএসএস যুক্ত করতে হবে be

স্ক্রিপ্ট

যদি আপনার শর্টকোডের কেবল জেএস প্রয়োজন হয় আপনি ভাগ্যবান এবং কেবল wp_enqueue_scriptশর্টকোড কলব্যাকের শিরোনামে ব্যবহার করতে পারেন :

add_shortcode( 'myshortcode', 'my_handle_shortcode' );

function my_handle_shortcode() {
  wp_enqueue_script( 'myshortcodejs', '/path/to/js/file.js' );
  // rest of code here...
}

এটির ফলে আপনার স্ক্রিপ্টটি ফুটারে যুক্ত হবে এবং কেবল একবারেই, পৃষ্ঠাতে শর্টকোড একাধিকবার ব্যবহৃত হলেও।

শৈলী

যদি আপনার কোডটির শৈলীর প্রয়োজন হয় তবে শর্টকোডটি আসলে রেন্ডার হওয়ার আগে আপনাকে কাজ করতে হবে ।

এটি করার বিভিন্ন উপায় রয়েছে:

  1. বর্তমান ক্যোয়ারিতে সমস্ত পোস্ট দেখুন এবং প্রয়োজনে শর্টকোড শৈলী যুক্ত করুন। আপনি ওপিতে # 3 এবং # 4 পদ্ধতিতে এটিই করেন। প্রকৃতপক্ষে, দুটি দুটি পদ্ধতিই একই কাজ করে তবে has_shortcodeডাব্লুপি 3.6-এ যোগ করা হয়েছিল, যদিও get_shortcode_regexএটি সংস্করণ 2.5 থেকে পাওয়া যায়, তাই get_shortcode_regexআপনি যদি আপনার প্লাগইনটিকে পুরানো সংস্করণের সাথে সামঞ্জস্য করতে চান তবেই ব্যবহার করুন ।

  2. সর্বদা সমস্ত পৃষ্ঠায় শর্টকোড শৈলী যুক্ত করুন

সমস্যা

# 1 সহ সমস্যাটি হল পারফরম্যান্স। রিজেেক্সগুলি বেশ ধীর গতি সম্পন্ন অপারেশন এবং সমস্ত পোস্টের একটি লুপে রেজেক্স চালু করুন ধারাবাহিকভাবে পৃষ্ঠা ধীর হতে পারে। তদুপরি, সংরক্ষণাগারগুলিতে কেবল পোস্ট সংক্ষিপ্তসার দেখানো এবং শর্টকোডগুলি সহ কেবলমাত্র একক দর্শনগুলিতে সম্পূর্ণ সামগ্রী দেখানো থিমগুলির মধ্যে একটি খুব সাধারণ কাজ। যদি তা ঘটে থাকে, যখন কোনও সংরক্ষণাগার দেখানো হয়, আপনার প্লাগইনটি কোনও স্টাইল ব্যবহার করা হবে না এমন লক্ষ্য যুক্ত করে একটি লুপে একটি রেজেক্স ম্যাচ চালু করবে: একটি অপ্রয়োজনীয় ডাবল পারফরম্যান্স প্রভাব: পৃষ্ঠা উত্পন্নকরণ + অতিরিক্ত অপ্রয়োজনীয় এইচটিটিপি অনুরোধ

# 2 সহ সমস্যাটি আবার পারফরম্যান্স। সমস্ত পৃষ্ঠায় শৈলী যুক্ত করার অর্থ সমস্ত পৃষ্ঠাগুলির জন্য অতিরিক্ত HTTP অনুরোধ যুক্ত করা প্রয়োজন, এমনকি যখন প্রয়োজন হয় না। এমনকি সার্ভারের সাইড পেজ প্রজন্মের সময়টি প্রভাবিত না হলেও, মোট পৃষ্ঠা রেন্ডারিং সময় এবং সমস্ত সাইটের পৃষ্ঠাগুলির জন্য।

সুতরাং, একটি প্লাগইন বিকাশকারীকে কি করা উচিত?

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

এইভাবে "template_redirect"বর্তমান ক্যোয়ারী প্রয়োজনীয়তাগুলি পূরণ করে এবং সেই ক্ষেত্রে শৈলী যুক্ত করে কিনা তা খতিয়ে দেখা সম্ভব ।

ব্যবহারকারী যদি কেবল একক পোস্ট দর্শনে শর্টকোড ব্যবহার করতে চান, পোস্টের শর্টকোড রয়েছে কিনা তা একটি ভাল ধারণা যাচাই করা: একবার কেবলমাত্র একটি রেজেক্স প্রয়োজন হলে এটি পৃষ্ঠাটি এত ধীরে ধীরে কমিয়ে দেবে না।

ব্যবহারকারী আর্কাইভ এমনকি সর্টকোড ব্যবহারের জন্য চয়ন করেন, তাহলে আমি সব পোস্টের জন্য Regex চালানোর এড়াতে তাহলে পোস্ট এর সংখ্যা উচ্চ এবং মাত্র শৈলী যদি ক্যোয়ারী হইয়া প্রয়োজনীয়তা সারিবদ্ধ।

এই বিষয়ে "উচ্চ" কী বিবেচনা করা উচিত তা কিছু পারফরম্যান্স পরীক্ষা ব্যবহার করা উচিত বা বিকল্প হিসাবে, অন্য একটি বিকল্প যুক্ত করুন এবং ব্যবহারকারীদের পছন্দ দিন।


2
এখানে লক্ষণীয় যে <style>ডকুমেন্টের বডিতে ট্যাগগুলি এখন ডাব্লু 3 সি অনুমান অনুসারে বৈধ। w3.org/TR/html52/docament-metadata.html#the-style-element
আইজাক লুব

5

আমার প্লাগইনটির জন্য আমি দেখতে পেলাম যে কখনও কখনও ব্যবহারকারীদের একটি থিম নির্মাতা থাকে যা পোস্ট মেটা ডেটাতে শর্টকড সংরক্ষণ করে । আমার প্লাগইন শর্ট কোডটি বর্তমান পোস্টে বা পোস্ট মেটা ডেটাতে উপস্থিত রয়েছে কিনা তা সনাক্ত করতে আমি এখানে যা ব্যবহার করছি :

function abcd_load_my_shorcode_resources() {
       global $post, $wpdb;

       // determine whether this page contains "my_shortcode" shortcode
       $shortcode_found = false;
       if ( has_shortcode($post->post_content, 'my_shortcode') ) {
          $shortcode_found = true;
       } else if ( isset($post->ID) ) {
          $result = $wpdb->get_var( $wpdb->prepare(
            "SELECT count(*) FROM $wpdb->postmeta " .
            "WHERE post_id = %d and meta_value LIKE '%%my_shortcode%%'", $post->ID ) );
          $shortcode_found = ! empty( $result );
       }

       if ( $shortcode_found ) {
          wp_enqueue_script(...);
          wp_enqueue_style(...);
       }
}
add_action( 'wp_enqueue_scripts', 'abcd_load_my_shorcode_resources' );

2

আমি এটি করি:

class My_Shortcode {

    function __construct() {
        do_action('my_start_shortcode'); // call
....

এবং অন্যান্য ফাংশনগুলিতে (বা অন্যান্য প্লাগইন) হুক ধরুন:

function wpse_3232_load_script(){
    wp_enqueue_script('js-myjs');
}
add_action('my_start_shortcode','wpse_3232_load_script',10);

1

শর্টকডটি পাঠ্য উইজেটে উপস্থিত থাকলে আমি নিজের প্লাগইনটি সন্ধান করেছি for

function check_shortcode($text) {

  $pattern = get_shortcode_regex();

   if (   preg_match_all( '/'. $pattern .'/s', $text, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'myshortcode', $matches[2] ) )
    {
        // myshortcode is being used

        // enque my css and js
        /****** Enqueu RFNB  ******/
        wp_enqueue_style('css-mycss');
        wp_enqueue_script('js-myjs');

        // OPTIONAL ALLOW SHORTCODE TO WORK IN TEXT WIDGET
        add_filter( 'widget_text', 'shortcode_unautop');
        add_filter( 'widget_text', 'do_shortcode'); 

    }

  return $text;

}
add_filter('widget_text', 'check_shortcode');

1

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

এখানে আমি ব্যবহৃত is_a( $post, 'WP_Post' )যদি চেক করতে $postবস্তুর হয় WP_Postশ্রেণী এবং আমি ব্যবহৃত $post->post_contentপোস্ট করা বিষয়বস্তু বার করো।

if ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'shortcode_tag') ) {
    wp_enqueue_style( 'handle', get_template_directory_uri() . '/your_file_filename.css' );
}

0

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

// This makes sure the styling is already enqueued in the header, so before the shortcode loads in the page/post
function enqueue_shortcode_header_script() {
    global $post;
    if ( function_exists( 'has_shortcode' ) ){  // is added in wordpress 3.6
        // Source: https://codex.wordpress.org/Function_Reference/has_shortcode
        if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'my_shortcode') ) {
            wp_enqueue_style( 'shortcode-css' );
        }
    }
    else if ( isset($post->ID) ) { // Small percentage wordpress users are below 3.6 https://wordpress.org/about/stats/
        global $wpdb;
        $result = $wpdb->get_var(
          $wpdb->prepare(
              "SELECT count(*) FROM $wpdb->postmeta " .
              "WHERE post_id = %d and meta_value LIKE '%%my_shortcode%%'",
               $post->ID )
        );
        if (!empty( $result )) { wp_enqueue_style( 'shortcode-css' ); }
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_shortcode_header_script');

0

আমরা প্রকৃতপক্ষে শর্তযুক্তভাবে কোনও অতিরিক্ত বিস্তৃত ফাংশন ব্যবহার না করে শর্টকোডের মাধ্যমে সিএসএস এবং জেএস ফাইলগুলি লোড করতে পারি :

প্রথমে, ধরে নেওয়া যাক আমরা এর আগে আমাদের সমস্ত সিএসএস / জেএস ফাইলগুলি নিবন্ধভুক্ত করেছি (সম্ভবত যখন wp_enqueue_scriptsচালানো হয়েছিল)

function prep_css_and_js() {
     wp_register_style('my-css', $_css_url);
     wp_register_script('my-js', $_js_url);
}
add_action( 'wp_enqueue_scripts', 'prep_css_and_js', 5 );

এর পরে, আমাদের শর্টকোড কার্যকারিতা পরীক্ষা করতে দিন:

function my_shortcode_func( $atts, $content = null ) {
  if( ! wp_style_is( "my-css", $list = 'enqueued' ) ) { wp_enqueue_style('my-css'); }
  if( ! wp_script_is( "my-js", $list = 'enqueued' ) ) { wp_enqueue_script('my-js'); }
  ...
}

সহজ। সম্পন্ন. ত্রুটি: আমরা সিএসএস / জেএস ফাইলগুলি "শর্তসাপেক্ষে লোড" করতে পারি, (কেবল যখন [শর্টকোড] চালানো হয়)।

আসুন নিম্নলিখিত মতাদর্শটি বিবেচনা করুন:

  • আমরা নির্দিষ্ট সিএসএস / জেএস ফাইলগুলি লোড করতে চাই (তবে কেবল যখন শর্টকোড ট্রিগার হয়)
  • হয়ত আমরা চাই না যে এই ফাইলগুলি প্রতিটি পৃষ্ঠায় লোড হয়, বা কোনও পৃষ্ঠা / পোস্টে শর্টকোড ব্যবহার না করা হয়। (হালকা ওজন)
  • আমরা নিশ্চিত করে ডাব্লুপি শর্টকোড কল করার আগে এবং এনকুইয়ের আগে সিএসএস / জেএসএস ফাইলগুলির সমস্ত নিবন্ধভুক্ত করে নিশ্চিত করে এটি অর্জন করতে পারি।
  • আইই: সম্ভবত আমার prep_css_and_js()ফাংশন চলাকালীন সময়ে আমি সমস্ত .css / .js ফাইলগুলি নির্দিষ্ট ফোল্ডারে লোড করি ...

এখন যেহেতু ডব্লিউপি তাদের এটিকে নিবন্ধভুক্ত স্ক্রিপ্ট হিসাবে দেখেছে, আমরা প্রকৃতপক্ষে শর্তাধীন তাদেরকে পরিস্থিতিতে অবস্থার সত্যতার ভিত্তিতে কল করতে পারি, তবে এতে সীমাবদ্ধ নয় my_shortcode_func()

উপকারিতা: (কোনও মাইএসকিউএল নেই, কোনও উন্নত ফাংশন নেই এবং কোনও ফিল্টার প্রয়োজন নেই)

  • এটি "ডাব্লুপি অর্থোডিক্স", মার্জিত, দ্রুত লোডিং সহজ এবং সহজ
  • সংকলক / মিনিফায়ারগুলিকে এই জাতীয় স্ক্রিপ্টগুলি সনাক্ত করতে দেয়
  • ডাব্লুপি ফাংশন ব্যবহার করে (wp_register_style / wp_register_script)
  • আরও থিম / প্লাগইনগুলির সাথে সামঞ্জস্যপূর্ণ যা কোনও কারণের সত্যতার জন্য সেই স্ক্রিপ্টগুলি ডি-রেজিস্টার করতে চায়।
  • একাধিকবার ট্রিগার করবে না
  • খুব কম প্রসেসিং বা কোড জড়িত

তথ্যসূত্র:

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