একটি [গ্যালারী] এ প্রদর্শিত সমস্ত চিত্র জিপ আপ করুন এবং ডাউনলোড লিঙ্ক হিসাবে অফার করুন


13

আমি আমার দর্শনার্থীদের প্রতিটি গ্যালারী পৃষ্ঠার নীচে প্রদর্শিত জিপ ফাইল হিসাবে পুরো ফটো গ্যালারী (উত্সর্গীকৃত [গ্যালারী] পৃষ্ঠাগুলিতে প্রদর্শিত) ডাউনলোড করার বিকল্পটি দিতে চাই। - পূর্ণ আকারের চিত্রটি অন্তর্ভুক্ত করতে হবে।

ডেভিড ওয়ালশ তার পোস্টে কিছু কোড দেওয়া হয়েছে এখানে ফাইল zip করতে কিন্তু আমি একীভূত যে ওয়ার্ডপ্রেস ফাংশন সঙ্গে যন্ত্রণার হচ্ছে।

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

উপরেরটি সম্পূর্ণ করার একটি বিকল্প (ম্যানুয়াল পদ্ধতি) সহ একই প্রশ্ন এখানে পাওয়া যাবে: সংযুক্ত মিডিয়া ফাইলগুলি ডাউনলোড করতে প্লাগইন?

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে। ধন্যবাদ।


ডেডিকেটেড গ্যালারী পৃষ্ঠাগুলি বলতে কী বোঝ?
NoBugs

স্ট্যান্ডার্ড পোস্টগুলি যা কেবল গ্যালারী শর্টকোড [গ্যালারী কলাম = "4" লিঙ্ক = "ফাইল"] এবং পৃষ্ঠায় কোনও সামগ্রী নেই। আমি বর্ণনায় অন্তর্ভুক্ত করেছি এটি কেবল বিকাশকারীদের সহায়তা করে।
পল থমসন

উত্তর:


14

প্রথমে আপনাকে ছবিগুলি পেতে হবে। কোনও গ্যালারির সমস্ত চিত্র কীভাবে পাবেন তা এখানে বর্ণিত হয়েছে

ওয়ার্ডপ্রেস ফাইল আনজিপিংয়ের জন্য দুটি ক্লাস ব্যবহার করে। পিএইচপি বিল্ট ইন ZipArchive()(ব্যবহার দেখুন ডেভিড ওয়ালশ)। এবং পিসিএলজিপ , আপনি এই ক্লাসটি খুঁজে পেতে পারেন wp-admin/includes/class-pclzip.php। আপনার যদি সমস্যা হয় ZipArchive()তবে প্লেসিপ জিপ ক্লাসটি ব্যবহার করে দেখুন।

এখন আপনি উভয় একসাথে আঠালো করতে হবে। হয়তো আমি পরে কিছু নমুনা কোড পোস্ট করতে পারি, বর্তমানে আমি আমার ডেস্কে নেই।

হালনাগাদ

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

সম্ভবত অন্যান্য সমাধান রয়েছে, তবে এই উদাহরণে আমি চিত্রগুলি পেতে একটি কাস্টম দিয়ে আসল গ্যালারী শর্টকোডটি প্রতিস্থাপন করি। কারণটি হ'ল, ওয়ার্ডপ্রেস কিছুটা v3.5-এ গ্যালারী পরিবর্তন করেছিল।
3.5 এর আগে, কোনও গ্যালারীটির চিত্রগুলি পোস্টের সংযুক্তি। 3.5 এর পরে, চিত্রগুলি একটি গুণ হিসাবে শর্টকোডে দেওয়া হয়। WP3.5 যেহেতু আমরা আর কোনও পোস্টের সংযুক্ত চিত্রগুলি পেতে পারি না, তাই আমাদের শর্টকোড বৈশিষ্ট্যগুলি থেকে তালিকাটি আনতে হবে। আমার কৌশলটি হ'ল মূল শর্টকোডটি একটি কাস্টম শর্টকোডের সাথে প্রতিস্থাপন করা, বৈশিষ্ট্যগুলি ধরা এবং গ্যালারী আউটপুট পেতে আসল শর্টকোডটি কল করা।

সমস্ত গ্যালারী সম্পর্কিত জিনিস একটি শ্রেণীর মধ্যে। একটি জিপ ফাইল তৈরি করতে, আমরা গ্যালারী শ্রেণীর আউটপুট হিসাবে ইনপুট হিসাবে গ্রহণ করে এমন একটি অন্য শ্রেণি ব্যবহার করতে পারি। একটি ক্লাস এবং একটি সাধারণ নির্মাণকারীর সাথে শুরু করা যাক।

class GalleryZip
{
    private static $instance = null;

    public static $images = array();

    public static function get_instance() {
        if ( ! session_id() )
          session_start();

        if ( null === self::$instance )
            self::$instance = new self();

        return self::$instance;
    }

    private final function __construct() {
        remove_shortcode( 'gallery' );
        add_shortcode( 'gallery', array( __CLASS__, 'gallery_zip_shortcode' ) );
    }
}

আমরা get_instance()হুক দিয়ে প্লাগইন পরে পদ্ধতিটি কল করব plugins_loaded। কনস্ট্রাক্টরে, আমরা মূল শর্টকোডটি সরিয়ে আমাদের কাস্টম শর্টকোড দিয়ে এটি প্রতিস্থাপন করি gallery_zip_shortcode()। এখন আমাদের শর্টকোড কলব্যাক দরকার

public static function gallery_zip_shortcode( $atts ) {

    $post = get_post();

    if ( ! function_exists( 'gallery_shortcode' ) )
      require_once ABSPATH . 'wp-includes/media.php';

    self::get_gallery_images_from_shortcode( $post->ID, $atts );
    $output = gallery_shortcode( $atts );

    $gallery_id = count( self::$images[$post->ID] ) - 1;

    $link = sprintf( '<div><a href="#" gallery-id="%d" post-id="%d" class="gallery-zip">%s</a></div>', $gallery_id, $post->ID, __( 'Get as Zip' ) );
    $output .= $link;

    return $output;

}

এই পদ্ধতির প্রথম জিনিসটি পোস্টটি পাওয়া কারণ আমাদের পোস্ট আইডি দরকার। আমরা অন্তর্ভুক্ত করার চেয়ে wp-includes/media.phpএই ফাইলটিতে মূল গ্যালারী শর্টকোডের জন্য কলব্যাক ফাংশন রয়েছে। এখন আমরা সমস্ত চিত্র সহ একটি অ্যারে পেতে একটি কল করি, মূল গ্যালারী কলব্যাক কল করে গ্যালারী আউটপুট তৈরি করি, একটি লিঙ্ক তৈরি করি এবং গ্যালারী আউটপুটটিতে লিঙ্ক যুক্ত করি। চিত্রগুলি নিজেই যথাক্রমে চিত্রগুলির প্যাথগুলি বর্গ ভেরিয়েবলে সংরক্ষণ করা হয় $images, পরে আমাদের এই অ্যারেটি দরকার।
ক্লাস ভেরিয়েবল $imageএকটি গ্যালারী সহ প্রতিটি পোস্টের জন্য একটি এন্ট্রি ধারণ করে, যাতে আমরা ফাংশনটি সম্মুখ পৃষ্ঠায় বা একক দৃশ্যে ব্যবহার করতে পারি। প্রতিটি এন্ট্রি প্রতিটি গ্যালারী জন্য একটি অ্যারে ধারণ করে, কারণ প্রতিটি পোস্টে একাধিক গ্যালারী থাকতে পারে।

প্লাগইনটির মূলটি হ'ল শর্টকোড থেকে চিত্রগুলি পাওয়ার পদ্ধতি the

protected static function get_gallery_images_from_shortcode( $id, $atts ) {

    // use the post ID if the attribute 'ids' is not set or empty
    $id = ( ! isset( $atts['ids'] ) || empty( $atts['ids'] ) ) ?
        (int) $id : $atts['ids'];

    $exclude = ( isset( $atts['exclude'] ) && ! empty( $atts['exclude'] ) ) ?
        $atts['exclude'] : '';

    if ( ! isset( self::$images[$id] ) || ! is_array( self::$images[$id] ) )
        self::$images[$id] = array();

    $images = self::get_gallery_images( $id, $exclude );

    array_push( self::$images[$id], $images );

    return $images;

}

প্রথমে আমরা সিদ্ধান্ত নিই যে এটি কোনও একক পোস্ট বা পোস্ট আইডির তালিকা। যদি এটি পোস্ট আইডির একটি তালিকা হয়, আমরা WP3.5 + থেকে একটি গ্যালারী হ্যান্ডেল করি। এর পরে, আমাদের excludeগুণাবলীটি পরিচালনা করতে হবে । সমস্ত বৈকল্পিক সেটআপ করার পরে, আমরা শেষ পর্যন্ত গ্যালারী থেকে চিত্রগুলি পেতে পারি। পুনরুদ্ধার করা চিত্রগুলি $imagesপরবর্তী ব্যবহারের জন্য শ্রেণীর ভারে ধাক্কা দেওয়া হবে।

protected static function get_gallery_images( $id, $exclude ) {
    $images     = array();
    $query_args = array(
            'post_status'    => 'inherit',
            'post_type'      => 'attachment',
            'post_mime_type' => 'image',
    );

    // handle gallery WP3.5+
    // if $id contains an comma, it is a list of post IDs
    if ( false !== strpos( $id, ',' ) ) {
        $query_args['include'] = $id;
    } elseif ( ! empty( $exclude ) ) {
        // handle excluding posts
        $query_args['post_parent'] = $id;
        $query_args['exclude']     = $exclude;
    } else {
        // handle gallery before WP3.5
        $query_args['post_parent'] = $id;
    }

    $attachments = get_posts( $query_args );

    $img_sizes = array_merge( array( 'full' ), get_intermediate_image_sizes() );

    $img_size = ( in_array( self::IMAGE_SIZE, $img_sizes ) ) ?
            self::IMAGE_SIZE : 'full';

    foreach ( $attachments as $key => $post ) {
        $img = wp_get_attachment_image_src( $post->ID, $img_size, false, false );
        $images[] = sprintf( '%s/%s', dirname( get_attached_file( $post->ID ) ), basename( $img[0] ) );
    }

    return $images;
}

এটি প্লাগইনের স্বর্ণ। সহজভাবে ক্যোয়ারী আর্গুমেন্টগুলির সাথে একটি অ্যারে সেটআপ করুন, সংযুক্তিগুলি পান get_posts()এবং পুনরুদ্ধারকৃত সংযুক্তিগুলির সাথে হাঁটুন। বিভিন্ন আকারের পরিচালনা করতে, আমরা সংযুক্তি চিত্র এবং ইউআরএলের স্ট্রিপ পাই। সংযুক্ত ফাইল থেকে, আমরা পথটি ফাইল ফাইলের সাথে একত্রে রাখি। অ্যারেতে $imagesএখন সমস্ত চিত্র এবং তাদের প্যাচগুলি গ্যালারী থেকে রয়েছে।

মূলত আপনার প্রশ্নের উত্তর এই সময়ে দেওয়া হয়। তবে আপনি চিত্রগুলি থেকে জিপ ফাইল তৈরি করতে চান। আপনি $imagesশেষ পদ্ধতিতে অ্যারে থেকে একটি জিপ ফাইল তৈরি করতে পারেন । তবে এই পদ্ধতিটি প্রতিবার বলা হয় যখন কোনও গ্যালারী প্রদর্শিত হয় এবং একটি জিপ ফাইল তৈরি করতে কিছুটা সময় নিতে পারে। আপনি এখানে যে জিপ ফাইলটি তৈরি করেছেন তার জন্য নুনি হয়ত অনুরোধ করবে না, এটি সম্পদের অপচয়।

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

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

আমি সম্পূর্ণ প্লাগইন কোড সহ গিটহাবে একটি সংগ্রহস্থল তৈরি করেছি । আমি আশা করি এটি আপনাকে সঠিক দিকে নির্দেশ করবে।


মনে রাখবেন যে আপনি যদি নতুন 3.5-স্টাইলের গ্যালারীগুলির সাথে কাজ করছেন তবে গ্যালারী থেকে চিত্রগুলি পুনরুদ্ধার করার পদ্ধতিটি আপনার পক্ষে কাজ নাও করতে পারে।
মিলো

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

আরে রাল্ফ, এটি কিছু চমত্কার কাজ! ভাগ করে নেওয়ার জন্য ধন্যবাদ. আমার গ্যালারী চিত্রগুলি সঠিকভাবে প্রদর্শনের জন্য আমাকে শর্টকোডে লিঙ্ক = "ফাইল" অন্তর্ভুক্ত করতে হবে যেমন: [গ্যালারী লিঙ্ক = "ফাইল"] আপনার কোডের মাধ্যমে শর্টকোডটি পুনরায় লিখিত হয়েছে বলে আমি মনে করি যে বাদ পড়েছে এবং একটি হিসাবে ফলাফল আমার গ্যালারী সঠিকভাবে প্রদর্শিত হচ্ছে না। আপনার কোডে সেই যুক্তি ঠিক করার কোনও উপায় আছে কি?
পল থমসন

সাধারণত এরিবিটগুলি কেবল মূল শর্টকোডের মধ্যে দিয়ে যায় এবং কোনও পরিবর্তন করা হবে না। গ্যালারীগুলি সাধারণ হিসাবে প্রদর্শিত হয়, তবে কিছু HTML সংযুক্ত করে। আমার পরীক্ষাগুলিতে (বিশ বিশ স্ট্যান্ড্রাড থিম সহ) গ্যালারীগুলি সঠিকভাবে প্রদর্শিত হয়।
রালফ 912

@ পলথমসন আমি গিথুব সংগ্রহশালায় কিছু সমস্যা সমাধান করেছি। কোডটি পরিষ্কার ছিল না।
রালফ 912

0

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

ক) এর শেষে নিম্নলিখিতটি যুক্ত করুন functions.php। এটি কেবল মিডিয়া.এফপি থেকে নেওয়া হয়েছে

remove_shortcode('gallery');
function gallery_with_download_links($attr) {
    $post = get_post();
    static $instance = 0;
    $instance++;
    if ( ! empty( $attr['ids'] ) ) {
        // 'ids' is explicitly ordered, unless you specify otherwise.
        if ( empty( $attr['orderby'] ) )
            $attr['orderby'] = 'post__in';
        $attr['include'] = $attr['ids'];
    }
    // Allow plugins/themes to override the default gallery template.
    $output = apply_filters('post_gallery', '', $attr);
    if ( $output != '' )
        return $output;
    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }

    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'thumbnail',
        'include'    => '',
        'exclude'    => ''
    ), $attr));

    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';

    if ( !empty($include) ) {
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );

        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }

    if ( empty($attachments) )
        return '';

    if ( is_feed() ) {
        $output = "\n";
        foreach ( $attachments as $att_id => $attachment )
            $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
        return $output;
    }

    $itemtag = tag_escape($itemtag);
    $captiontag = tag_escape($captiontag);
    $icontag = tag_escape($icontag);
    $valid_tags = wp_kses_allowed_html( 'post' );
    if ( ! isset( $valid_tags[ $itemtag ] ) )
        $itemtag = 'dl';
    if ( ! isset( $valid_tags[ $captiontag ] ) )
        $captiontag = 'dd';
    if ( ! isset( $valid_tags[ $icontag ] ) )
        $icontag = 'dt';

    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';

    $selector = "gallery-{$instance}";

    $gallery_style = $gallery_div = '';
    if ( apply_filters( 'use_default_gallery_style', true ) )
        $gallery_style = "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 10px;
                text-align: center;
                width: {$itemwidth}%;
            }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->";
    $size_class = sanitize_html_class( $size );
    $gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);

        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='wp-caption-text gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
// This is my addon which outputs a link to download the file through download.php . NB your file uri will be public! 
        $output .= '<br/ ><a href="'.get_template_directory_uri().'/download.php?file='.get_attached_file( $id ).'">Download image</a>';
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }

    $output .= "
            <br style='clear: both;' />
        </div>\n";

    return $output;
}
add_shortcode( 'gallery' , 'gallery_with_download_links' );

খ) download.phpথিমের বেস ডিরেক্টরিতে ডাকা একটি ফাইলের মধ্যে নিম্নলিখিতটি অনুলিপি করুন এবং আটকান ।

<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>

গ)। গ্যালারী ফাইল লিঙ্ক করতে ভুলবেন না !! গুরুত্বপূর্ণ!


আমি মনে করি না যে এটি একটি ভাল ধারণা, download.phpএবং $_GETপ্যারামিটারটি আমি চাইলে আপনার ওয়েব ফোল্ডার (নেটওয়ার্ক wp-config.php
শেয়ারেও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.