পোস্টমেটা সহ পোস্ট পাওয়ার সর্বাধিক দক্ষ উপায়


36

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

আমি এর মতো একটি কাস্টম ক্যোয়ারী দিয়ে চেষ্টা করছি:

$results = $wpdb->get_results("
    SELECT  p.ID,
        p.post_title,
        pm1.meta_value AS first_field,
        pm2.meta_value AS second_field,
        pm3.meta_value AS third_field
    FROM    $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
            pm1.post_id = p.ID  AND
            pm1.meta_key    = 'first_field_key'
        ) LEFT JOIN $wpdb->postmeta pm2 ON (
            pm2.post_id = p.ID  AND
            pm2.meta_key    = 'second_field_key'
        ) LEFT JOIN $wpdb->postmeta pm3 ON (
            pm3.post_id = p.ID  AND
            pm3.meta_key    = 'third_field_key'
        )
    WHERE   post_status = 'publish'
");

কাজ মনে হচ্ছে। আপনি যদি সেই মেটা ক্ষেত্রগুলির মধ্যে এমন কোনও উপায়ে একই পোস্টে ব্যবহার করেন যা এটির জন্য একাধিক মেটা মানকে একই পোস্টে ব্যবহার করে তা ট্রিপস আপ হয়ে যায়। আমি এটি করতে যোগদানের কথা ভাবতে পারি না।

সুতরাং, প্রশ্ন 1: একাধিক মান মেটা ক্ষেত্র আনতে একটি যোগদান, উপ-কোয়েরি, বা যা কিছু আছে?

তবে প্রশ্ন 2: এটি কি মূল্য? কত postmetaটেবিল অগ্রহায়ণ আমি যোগ করার পূর্বে একটি 2-ক্যোয়ারী পদ্ধতির বাঞ্ছনীয় হয়ে না? আমি একটি পোস্টে সমস্ত পোস্ট ডেটা ধরতে পারি, তারপরে অন্যটিতে সমস্ত প্রাসঙ্গিক পোস্টমেটা ধরতে পারি এবং পিএইচপি-তে একটি রেজাল্টে পোস্ট ডেটার সাথে মেটা একত্রিত করতে পারি। যদি এটি এমনকি সম্ভব হয় তবে কি কোনও একক-জটিল-এস -কিউএল কোয়েরির চেয়ে দ্রুততর হবে?

আমি সবসময়ই মনে করি, "ডাটাবেসে যতটা সম্ভব কাজ দিন।" এই এক নিশ্চিত না!


আপনি এমনকি যোগদান করতে চান কিনা আমি নিশ্চিত নই। get_posts () এবং get_post_meta () এর সংমিশ্রণ আপনাকে একই তথ্য ফিরিয়ে দেয়। প্রকৃতপক্ষে, এটি যোগদানের ক্ষেত্রে কম দক্ষ কারণ আপনি সম্ভবত ডেটা পুনরুদ্ধার করতে পারেন যা আপনি পরে ব্যবহার করবেন না।
রেফপোসাদাস

2
পোস্ট মেটা ডেটা যাইহোক স্বয়ংক্রিয়ভাবে ক্যাশেড নয়?
ম্যানি ফ্লুরমন্ড

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

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

উত্তর:


58

পোস্ট মেটা তথ্য স্বয়ংক্রিয়ভাবে একটি স্ট্যান্ডার্ড WP_Query(এবং মূল ক্যোয়ারী) এর জন্য মেমরিতে ক্যাশে হয় , যদি না আপনি নির্দিষ্টভাবে update_post_meta_cacheপ্যারামিটারটি ব্যবহার করে এটি না করার কথা বলেন ।

অতএব, আপনি এই জন্য আপনার নিজের প্রশ্ন লিখতে হবে না।

সাধারণ প্রশ্নের জন্য কীভাবে মেটা ক্যাশে কাজ করে:

যদি update_post_meta_cacheপ্যারামিটারটি WP_Queryমিথ্যাতে সেট না করা থাকে, তবে পোস্টগুলি ডিবি থেকে পুনরুদ্ধার করার পরে, update_post_caches()ফাংশনটি কল করা হবে, যার ফলস্বরূপ কল হয় update_postmeta_cache()

update_postmeta_cache()ফাংশনের জন্য একটি মোড়কের হয় update_meta_cache(), এবং এটি মূলত একটি সহজ কল SELECTসব আইডি পোস্টগুলি উদ্ধার সঙ্গে। এটি কোয়েরিতে থাকা সমস্ত পোস্টের জন্য সমস্ত পোস্টমেটা পেতে এবং সেই তথ্যটি অবজেক্ট ক্যাশে (ব্যবহার করে wp_cache_add()) সংরক্ষণ করবে।

আপনি যখন এমন কিছু করেন get_post_custom(), এটি প্রথমে সেই অবজেক্টের ক্যাশেটি পরীক্ষা করে। সুতরাং এটি এই মুহুর্তে পোস্ট মেটা পেতে অতিরিক্ত অনুসন্ধান করা হয় না। যদি আপনি পোস্টটি একটিতে অর্জন করেন WP_Queryতবে মেটা ইতিমধ্যে স্মৃতিতে রয়েছে এবং এটি সেখান থেকে সরাসরি পাওয়া যায়।

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

অন্য কথায়, আপনার ক্যোয়ারী সম্ভবত সঠিক ক্যোয়ারী এবং একটি সাধারণ ধ্রুবক মেমরি সমাধান ব্যবহারের চেয়ে বোঝা এবং লোডগুলি ধীর করে। স্বাভাবিক ব্যবহার করুন WP_Query। নিজেকে কিছুটা চেষ্টা সাশ্রয় করুন।

অতিরিক্ত: update_meta_cache() স্মার্ট, বিটিডাব্লু। এটি ইতিমধ্যে তাদের মেটা তথ্য ক্যাশে থাকা পোস্টগুলির জন্য মেটা তথ্য পুনরুদ্ধার করবে না। এটি মূলত দু'বার একই মেটা পায় না। সুপার দক্ষ।

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


30

আমি একটি পিভট ক্যোয়ারী সুপারিশ করব। আপনার উদাহরণ ব্যবহার করে:

SELECT  p.ID,   
        p.post_title, 
        MAX(CASE WHEN wp_postmeta.meta_key = 'first_field' then wp_postmeta.meta_value ELSE NULL END) as first_field,
        MAX(CASE WHEN wp_postmeta.meta_key = 'second_field' then wp_postmeta.meta_value ELSE NULL END) as second_field,
        MAX(CASE WHEN wp_postmeta.meta_key = 'third_field' then wp_postmeta.meta_value ELSE NULL END) as third_field,

 FROM    wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID)                      
GROUP BY
   wp_posts.ID,wp_posts.post_title

এই উত্তরটি সঠিক হিসাবে চিহ্নিত করা উচিত।
লুক

আপনি যদি একটি ডাটাবেস ক্যোয়ারী খুঁজছেন তবে এটি সঠিক উত্তর
অ্যালেক্স পপভ

এই কোয়েরিটি আমার সময় হ্রাস করেছিল যখন আমি ডাব্লুপি_কিউয়ারি 25 সেকেন্ড থেকে ~ 3 সেকেন্ডে ব্যবহার করছিলাম। আমার প্রয়োজন ছিল এটি একবারই চালানো যাতে কোনও ক্যাশিংয়ের দরকার পড়েনি।
কুশ

11

আমি এমন একটি কেস নিয়ে এসেছি যেখানে আমি দ্রুত তাদের সম্পর্কিত মেটা তথ্যের সাথে প্রচুর পোস্ট পুনরুদ্ধার করতে চাই। আমার ও (2000) পোস্টগুলি পুনরুদ্ধার করতে হবে।

অট্টোর পরামর্শটি ব্যবহার করে আমি এটি ব্যবহার করে দেখেছি - সমস্ত পোস্টের জন্য ডাব্লুপি_কিউয়ারি :: ক্যোয়ারী চালাচ্ছি এবং তারপরে প্রতিটি পোস্টের জন্য get_post_custom লুপিং এবং চালনা করছি। এটি সম্পূর্ণ করতে প্রায় 3 সেকেন্ড সময় নিয়েছে

আমি তখন ইথানের পিভট ক্যোয়ারীটি চেষ্টা করেছিলাম (যদিও আমি আগ্রহী প্রতিটি মেটা_কি ম্যানুয়ালি জিজ্ঞাসা করা পছন্দ করি না)। মেটা_ভ্যালু আনসরিয়ালাইজ করতে আমাকে এখনও পুনরুদ্ধার করা সমস্ত পোস্টের মধ্য দিয়ে যেতে হয়েছিল। এটি সম্পূর্ণ করতে প্রায় 1.3 সেকেন্ড সময় নিয়েছে

আমি তখন GROUP_CONCAT ফাংশনটি ব্যবহার করে চেষ্টা করেছি এবং সেরা ফলাফল পেয়েছি। কোডটি এখানে:

global $wpdb;
$wpdb->query('SET SESSION group_concat_max_len = 10000'); // necessary to get more than 1024 characters in the GROUP_CONCAT columns below
$query = "
    SELECT p.*, 
    GROUP_CONCAT(pm.meta_key ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_keys, 
    GROUP_CONCAT(pm.meta_value ORDER BY pm.meta_key DESC SEPARATOR '||') as meta_values 
    FROM $wpdb->posts p 
    LEFT JOIN $wpdb->postmeta pm on pm.post_id = p.ID 
    WHERE p.post_type = 'product' and p.post_status = 'publish' 
    GROUP BY p.ID
";

$products = $wpdb->get_results($query);

// massages the products to have a member ->meta with the unserialized values as expected
function massage($a){
    $a->meta = array_combine(explode('||',$a->meta_keys),array_map('maybe_unserialize',explode('||',$a->meta_values)));
    unset($a->meta_keys);
    unset($a->meta_values);
    return $a;
}

$products = array_map('massage',$products);

এটি গড়ে 0.7 সেকেন্ড সময় নেয় । এটি ডাব্লুপি get_post_custom () সমাধানের প্রায় এক চতুর্থাংশ এবং পিভট ক্যোয়ারী সমাধানের প্রায় অর্ধেক।

এটি কারও আগ্রহী হবে।


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

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

হ্যাঁ, আপনার যদি অবিরাম মেমোরি ক্যাশে থাকে (এক্সসি ক্যাচ, মেমক্যাচড, এপিসি, ইত্যাদি) এবং অবজেক্ট ক্যাচিং প্লাগইন ব্যবহার করুন (ডাব্লু 3 টোটাল ক্যাশে মেমরির সমস্ত ধরণের ক্যাশ সমর্থন করে) তবে আপনাকে সমস্ত বস্তু ক্যাশে মেমোরিতে সংরক্ষণ করে বেশ কিছু কিছুর গতিবেগ।
অটো

আমি ব্যাকবোন / আন্ডারস্কোর জেএস ফিল্টারিং স্কিমটিতে ব্যবহার করতে 6000 আইটেম ফিরিয়ে দিচ্ছি। এটি একটি 6s এর কাস্টম ক্যোয়ারী নিয়েছে যা আমি এমনকি WP_Query হিসাবে চালাতে পারি নি কারণ এটির সময়সীমা শেষ হয়ে গেছে এবং এটি একটি 2-এর ক্যোয়ারী করেছে। যদিও অ্যারে_ম্যাপটি এটিকে কিছুটা পিছিয়ে দেয় ...
জ্যাক

WP_Query এর মধ্যে সমস্ত মেটা ডেটা ফেরত দেওয়ার জন্য উচ্চ পারফরম্যান্স সমর্থন তৈরির জন্য কোনও সমর্থন আছে কি?
atwellpub

2

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

SELECT p.ID, p.post_title, 
    MAX(CASE WHEN pm1.meta_key = '_price' then pm1.meta_value ELSE NULL END) as price,
    MAX(CASE WHEN pm1.meta_key = '_regular_price' then pm1.meta_value ELSE NULL END) as regular_price,
    MAX(CASE WHEN pm1.meta_key = '_sale_price' then pm1.meta_value ELSE NULL END) as sale_price,
    MAX(CASE WHEN pm1.meta_key = '_sku' then pm1.meta_value ELSE NULL END) as sku
    FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID)                 
    WHERE p.post_type in('product', 'product_variation') AND p.post_status = 'publish'
    GROUP BY p.ID, p.post_title

যদিও সতর্কতা অবলম্বন করবেন না, উইওকমার্স আমার মেটা টেবিলে 300K + সারি তৈরি করেছে, সুতরাং এটি খুব বড় এবং অতএব খুব ধীর গতির ছিল।


1

কোন এসকিউএল সংস্করণ:

কোনও এসকিউএল ছাড়াই সমস্ত পোস্ট এবং তাদের সমস্ত মেটা মান (মেটা) পান:

ধরা যাক আপনার আইডির অ্যারে হিসাবে পোস্ট আইডির একটি তালিকা রয়েছে, এর মতো কিছু

$post_ids_list = [584, 21, 1, 4, ...];

এখন 1 টি ক্যোয়ারিতে সমস্ত পোস্ট এবং সমস্ত মেটাস পাওয়া কমপক্ষে এসকিউএল এর কিছুটা ব্যতীত সম্ভব নয়, সুতরাং আমাদের অবশ্যই 2 টি ক্যোয়ারী করতে হবে (এখনও মাত্র 2):

1. সমস্ত পোস্ট পান ( ডাব্লুপিউকিউয়ারি ব্যবহার করে )

$request = new WP Query([
  'post__in' => $post_ids_list,
  'ignore_sticky_posts' => true, //if you want to ignore the "stickiness"
]);

(আপনি wp_reset_postdata();যদি পরে "লুপ" করছেন তবে কল করতে ভুলবেন না ;))

2. মেটা ক্যাশে আপডেট করুন

//don't be confused here: "post" means content type (post X user X ...), NOT post type ;)
update_meta_cache('post', $post_ids_list);

মেটা ডেটা পেতে কেবলমাত্র সেই মানটি ব্যবহার করুন get_post_meta()যা @ অটো উল্লেখ করেছে: প্রথমে ক্যাশে intoুকে আছে
:)

দ্রষ্টব্য: আপনার যদি পোস্টগুলি থেকে অন্য ডেটার প্রয়োজন হয় না (যেমন শিরোনাম, সামগ্রী, ...) আপনি কেবল 2. :-) করতে পারেন


0

সমাধান ফর্ম ট্রেভার ব্যবহার করে এবং এটিকে নেস্টেড এসকিউএল দিয়ে কাজ করার জন্য পরিবর্তন করে। এটি পরীক্ষা করা হয় না।

global $wpdb;
$query = "
    SELECT p.*, (select pm.* From $wpdb->postmeta AS pm WHERE pm.post_id = p.ID)
    FROM $wpdb->posts p 
    WHERE p.post_type = 'product' and p.post_status = 'publish' 
";
$products = $wpdb->get_results($query);

-1

আমি একাধিক মান মেটা ক্ষেত্র সমস্যা হিসাবে দৌড়ে। সমস্যাটি ওয়ার্ডপ্রেস নিজেই। ডাব্লুপি-অন্তর্ভুক্ত / মেটা.এফপি দেখুন। এই লাইনটি দেখুন:

$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$meta_compare_string})", $meta_value );

সমস্যাটি CAST বিবৃতি নিয়ে। মেটা মানগুলির জন্য একটি ক্যোয়ারিতে, $ meta_type ভেরিয়েবলটি CHAR এ সেট করা আছে। CHAR এর মান কাস্ট করার পদ্ধতিটি সিরিয়ালযুক্ত স্ট্রিংকে কীভাবে প্রভাবিত করে সে সম্পর্কে আমি বিশদ জানি না, তবে এটি ঠিক করার জন্য, আপনি কাস্ট অপসারণ করতে পারেন যাতে এসকিউএল দেখতে এই রকম হয়:

$where[$k] = ' (' . $where[$k] . $wpdb->prepare( "$alias.meta_value {$meta_compare} {$meta_compare_string})", $meta_value );

এখন, যদিও এটি কাজ করে, আপনি ওয়ার্ডপ্রেস অভ্যন্তরীণ সাথে চটকাচ্ছেন, যাতে অন্যান্য জিনিসগুলি ভেঙে যেতে পারে, এবং এটি কোনও স্থায়ী সমাধান নয়, ধরে নেওয়া আপনার ওয়ার্ডপ্রেস আপগ্রেড করতে হবে।

আমি যেভাবে এটি স্থির করেছি তা হল আমি যে মেটা ক্যোয়ারী চাইছি তার জন্য ওয়ার্ডপ্রেস দ্বারা উত্পাদিত এসকিউএল অনুলিপি করা এবং তারপরে আমি যে মেটা_ভ্যালুগুলির সন্ধান করছি তার জন্য অতিরিক্ত এবং বিবৃতিগুলি সামলানোর জন্য কিছু পিএইচপি লিখি এবং $ wpdb-> get_results (q sql) ) চূড়ান্ত আউটপুট জন্য। হ্যাকি, কিন্তু এটি কাজ করে।


আমি এটি চেষ্টা করে দেখিনি, তবে get_meta_sqlএই লাইনটি অনুসরণ করে এমন ফিল্টারটি উত্তোলন করা অবশ্যই অবশ্যই মূল কোড হ্যাক করার চেয়ে পছন্দনীয়।
স্টিভ টেলর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.