কীভাবে আমি ওয়ার্ডপ্রেস ব্যাকএন্ডে একটি ফাইল ডাউনলোড করতে বাধ্য করতে পারি?


30

আমি আমার ওয়ার্ডপ্রেস প্লাগইনগুলির একটিতে "ডাউনলোড করতে ক্লিক করুন" বোতামটি যুক্ত করতে চাই এবং কোন হুকটি ব্যবহার করতে হবে তা নিশ্চিত নই। এখনও অবধি, এই কোডটিতে 'অ্যাডমিন_ইনিট' হুক করা কার্যকর বলে মনে হচ্ছে:

 header("Content-type: application/x-msdownload");
 header("Content-Disposition: attachment; filename=data.csv");
 header("Pragma: no-cache");
 header("Expires: 0");
 echo 'data';
 exit();

এটি কাজ করে বলে মনে হচ্ছে, তবে আমি কেবল সেখানে দেখতে চাই যে এখানে কোনও সর্বোত্তম অনুশীলন রয়েছে।

ধন্যবাদ, ডেভ

উত্তর:


39

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি নিম্নলিখিত URL এর মতো কিছু থাকতে চান যার ব্রাউজারটির প্রতিক্রিয়া আপনার উত্পন্ন সামগ্রী, অর্থাত আপনার .CSVফাইল এবং ওয়ার্ডপ্রেস থেকে কোনও উত্পন্ন সামগ্রী নয়?

http://example.com/download/data.csv

আমি মনে করি আপনি 'template_redirect'হুক খুঁজছেন । আপনি জানতে পারেন 'template_redirect'/wp-includes/template-loader.phpযা কোনো ফাইল সব ওয়ার্ডপ্রেস ডেভেলপারদের সাথে পরিচিত হওয়া উচিত নয়; এটি সংক্ষিপ্ত এবং মিষ্টি এবং প্রতিটি প্রশাসনিক পৃষ্ঠা লোডকে ঘুরিয়ে দেয় তাই এটি একবার দেখে নিন।

শুধু আপনার থিমের নিচের টি যোগ functions.phpফাইল বা অন্য ফাইল যাতে আপনি সম্ভবত includeমধ্যে functions.php:

add_action('template_redirect','yoursite_template_redirect');
function yoursite_template_redirect() {
  if ($_SERVER['REQUEST_URI']=='/downloads/data.csv') {
    header("Content-type: application/x-msdownload",true,200);
    header("Content-Disposition: attachment; filename=data.csv");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo 'data';
    exit();
  }
}

'/downloads/data.csv'URL টি পরীক্ষা করে পরীক্ষা করে দেখুন $_SERVER['REQUEST_URI']। আপনি যেখানে সেট করেছেন সেখানে ,true,200আপনার header()কলটিতে যুক্ত হওয়াটিও নোট করুন Content-type; এটি কারণ URL টি স্বীকৃতি দেয় না বলে ওয়ার্ডপ্রেস 404 "পাওয়া যায়নি" স্থিতি কোডটি সেট করবে । যদিও ওয়ার্ডপ্রেসটি প্রতিস্থাপন করার trueকথা বলেছে header()এবং পরিবর্তে 404এইচটিটিপি 200 "ঠিক আছে" স্থিতি কোডটি ব্যবহার করার ক্ষেত্রে এটি কোনও সমস্যা নয় ।

এবং ফায়ারফক্সে এটি দেখতে কেমন তা এখানে দেখুন ( নোট করুন স্ক্রিনশটটির /downloads/ভার্চুয়াল ডিরেক্টরি নেই কারণ স্ক্রিনশটটি গ্রহণ এবং এনেটোট করার পরে এটি '/downloads/'ভার্চুয়াল ডিরেক্টরি যুক্ত করা ভাল ধারণা বলে মনে হয়েছিল ):

একটি সিএসভি ফাইলের জন্য ডাউনলোড URL এর স্ক্রিনশট
(সূত্র: মাইকসচিনেল.কম )

হালনাগাদ

আপনি যদি কোনও ইউআরএল থেকে ডাউনলোডটি হ্যান্ডল করে যেতে চান যা /wp-admin/ব্যবহারকারীকে ভিজ্যুয়াল ইঙ্গিত দেয় যে এটি লগইন দ্বারা সুরক্ষিত রয়েছে আপনি এটিও করতে পারেন; একটি উপায় বর্ণনা অনুসরণ।

আমি একটি শ্রেণীর মধ্যে এই সময় encapsulated বলা DownloadCSV, এবং একটি ব্যবহারকারী তৈরি করতে "সামর্থ্য" নামক 'download_csv'জন্য 'administrator'ভূমিকা (ভূমিকা এবং কেপেবিলিটিস সম্পর্কে পড়তে এখানে ) আপনি শুধু পূর্বনির্ধারিত বন্ধ piggyback পারে 'export'মত এবং যদি তাই হয় মাত্র অনুসন্ধান & প্রতিস্থাপন যদি আপনি ভূমিকা 'download_csv'সঙ্গে 'export'এবং register_activation_hook()কল এবং activate()ফাংশন মুছে ফেলুন । যাইহোক, অ্যাক্টিভেশন হুকের প্রয়োজনীয়তার কারণ হ'ল আমি এটিকে থিমের functions.phpফাইল না রেখে প্লাগিনে স্থানান্তরিত করেছি *

আমি "সরঞ্জামগুলি" মেনুটি ব্যবহার করে " সিএসভি ডাউনলোড করুন" মেনু বিকল্পটি যুক্ত করে এটিকে সক্ষমতার সাথে যুক্ত করেছি ।add_submenu_page()'download_csv'

শেষ পর্যন্ত আমি হুকটি বেছে নিয়েছিলাম 'plugins_loaded'কারণ এটি ব্যবহার করা আমার পক্ষে প্রথম দিকের উপযুক্ত হুক। আপনি ব্যবহার করতে পারেন 'admin_init'তবে সেই হুকটি অনেক পরে চালানো হয় (১১৩০ তম হুক কল বনাম ৩ য় হুক কল) তাই ওয়ার্ডপ্রেসকে তার প্রয়োজনের চেয়ে আরও বেশি করে ফেলে দেওয়া হোক কেন? ( কোন হুকটি ব্যবহার করতে হবে তা নির্ধারণ করতে আমি আমার ইনস্ট্রুমেন্ট হুক্স প্লাগইন ব্যবহার করেছি।)

আমার ইউআরএলটি ভেরিয়েবলটি /wp-admin/tools.phpপরীক্ষা করে শুরু হয় কিনা তা নিশ্চিত করার জন্য আমি যে হুকটিতে পরীক্ষা করে দেখি $pagenow, আমি এটি যাচাই করি current_user_can('download_csv')এবং যদি এটি পাস হয় তবে আমি এটি পরীক্ষা করি $_GET['download']কিনা তা পরীক্ষা করে দেখি data.csv; যদি হ্যাঁ আমরা আগের মতো ব্যবহারিকভাবে একই কোডটি চালাই। আমি পূর্বের উদাহরণটিতে ,true,200কল থেকে header()কলটিও সরিয়েছি কারণ এখানে ওয়ার্ডপ্রেস জানে এটি একটি ভাল ইউআরএল তাই এখনও 404 স্থিতি সেট করে নি। সুতরাং এখানে আপনার কোড:

<?php
/*
Plugin Name: Download CSV
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
 */
if (!class_exists('DownloadCSV')) {
  class DownloadCSV {
    static function on_load() {
      add_action('plugins_loaded',array(__CLASS__,'plugins_loaded'));
      add_action('admin_menu',array(__CLASS__,'admin_menu'));
      register_activation_hook(__FILE__,array(__CLASS__,'activate'));
    }
    static function activate() {
      $role = get_role('administrator');
      $role->add_cap('download_csv');
    }
    static function admin_menu() {
      add_submenu_page('tools.php',    // Parent Menu
        'Download CSV',                // Page Title
        'Download CSV',                // Menu Option Label
        'download_csv',                // Capability
        'tools.php?download=data.csv');// Option URL relative to /wp-admin/
    }
    static function plugins_loaded() {
      global $pagenow;
      if ($pagenow=='tools.php' && 
          current_user_can('download_csv') && 
          isset($_GET['download'])  && 
          $_GET['download']=='data.csv') {
        header("Content-type: application/x-msdownload");
        header("Content-Disposition: attachment; filename=data.csv");
        header("Pragma: no-cache");
        header("Expires: 0");
        echo 'data';
        exit();
      }
    }
  }
  DownloadCSV::on_load();
}

এবং এখানে অ্যাক্টিভেটেড প্লাগইনটির একটি স্ক্রিনশট রয়েছে: (উত্স: mikechinkel.com )একটি সক্রিয় প্লাগইন দেখাচ্ছে প্লাগিন পৃষ্ঠার স্ক্রিনশট

এবং অবশেষে ডাউনলোডটি ট্রিগার করার একটি স্ক্রিনশট এখানে রয়েছে: (উত্স: mikechinkel.com )ওয়ার্ডপ্রেস অ্যাডমিনের সরঞ্জাম মেনুর একটি বিকল্প থেকে URL দ্বারা কোনও ফাইল ডাউনলোড করার স্ক্রিনশট


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

@ ডেভ মরিস - "ব্যাক এন্ড" দ্বারা আপনি কী বোঝাতে চেয়েছেন ? আপনি সার্ভার মানে? যদি হ্যাঁ, তবে 'template_redirect'অবশ্যই সার্ভারে চলে। যদি তা না হয়, আমি সম্পূর্ণ বিভ্রান্ত ছিলাম; আপনি উদ্বেগ স্পষ্ট করতে পারেন? আগাম ধন্যবাদ.
মাইকচিন্কেল

@ ডেভ: আপনি যদি "ব্যাক এন্ড" দ্বারা প্রশাসক অঞ্চলটি বোঝায় তবে এটি এখনও কার্যকর হবে। ডাউনলোড ইউআরএল শুরু হয় /downloads/data.csvযা একটি বিদ্যমান ফাইল নয়, তাই ওয়ার্ডপ্রেস "ফ্রন্ট এন্ড" এই অনুরোধটি পরিচালনা করবে এবং শেষ পর্যন্ত পৌঁছে যাবে template-redirect। আপনি কেবল অ্যাডমিন অঞ্চলে একটি লিঙ্ক তৈরি করেন যা এই ফ্রন্টসাইড URL টি নির্দেশ করে points (এটি অবশ্যই বলা উচিত যে এইভাবে, আপনি বিনা মূল্যে অ্যাডমিন লগইন সুরক্ষা পান না - যে কেউ ইউআরএল জানেন সে ফাইলটি ডাউনলোড করতে পারেন, তবে এটি ঠিক করার কোনও সহজ উপায় আছে?)
জান ফ্যাব্রি

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

হ্যাঁ, আমি ক্ষমাপ্রার্থী, আমি এই সাইট থেকে ইমেল সতর্কতা গ্রহণ করছি না, যাতে এটির জবাব দেওয়ার ক্ষেত্রে আমার দেরি ব্যাখ্যা করে। আমি "ব্যাকএন্ড" বলার সময় আমি প্রকৃতপক্ষে ওয়ার্ডপ্রেসের প্রশাসক অঞ্চলটি উল্লেখ করেছিলাম। এর জন্যে দুঃখিত. আমি টেমপ্লেট_ডাইরেক্টটি ব্যবহার করে চেষ্টা করব এবং কী হবে তা দেখুন। ধন্যবাদ! Ave ডেভ
ডেভ মরিস

3

সিএসভিতে রফতানি করার জন্য আরও একটি দরকারী প্লাগইন। কারও কারও কাজে লাগতে পারে

    <?php

class CSVExport
{
/**
* Constructor
*/
public function __construct()
{
if(isset($_GET['download_report']))
{
$csv = $this->generate_csv();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"report.csv\";" );
header("Content-Transfer-Encoding: binary");

echo $csv;
exit;
}

// Add extra menu items for admins
add_action('admin_menu', array($this, 'admin_menu'));

// Create end-points
add_filter('query_vars', array($this, 'query_vars'));
add_action('parse_request', array($this, 'parse_request'));
}

/**
* Add extra menu items for admins
*/
public function admin_menu()
{
add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report'));
}

/**
* Allow for custom query variables
*/
public function query_vars($query_vars)
{
$query_vars[] = 'download_report';
return $query_vars;
}

/**
* Parse the request
*/
public function parse_request(&$wp)
{
if(array_key_exists('download_report', $wp->query_vars))
{
$this->download_report();
exit;
}
}

/**
* Download report
*/
public function download_report()
{
echo '<div class="wrap">';
echo '<div id="icon-tools" class="icon32">
</div>';
echo '<h2>Download Report</h2>';
//$url = site_url();

echo '<p>Export the Users';
}

/**
* Converting data to CSV
*/
public function generate_csv()
{
$csv_output = '';
$table = 'users';

$result = mysql_query("SHOW COLUMNS FROM ".$table."");

$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output = $csv_output . $row['Field'].",";
$i++;
}
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j].",";
}
$csv_output .= "\n";
}

return $csv_output;
}
}

// Instantiate a singleton of this plugin
$csvExport = new CSVExport();

2

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

আপনি ওয়ার্ডপ্রেস কোডেক্সে লোড- (পৃষ্ঠা) হুক পরীক্ষা করতে পারেন

আপনি যদি অ্যাডমিন_নিট হুক ব্যবহার করছেন তবে চেক_অ্যাডমিন_রেফারার বা অন্য স্ক্রিপ্ট ব্যবহার করে ননস যাচাই করা নিশ্চিত করুন শর্তটি পাস হতে পারে আপনার ডাউনলোড ফাইল আউটপুট পাবে।

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