मैं वर्डप्रेस बैकएंड में एक फ़ाइल डाउनलोड को कैसे मजबूर कर सकता हूं?


30

मैं अपने एक वर्डप्रेस प्लगइन्स में "डाउनलोड करने के लिए क्लिक" बटन जोड़ना चाहूंगा, और मुझे यकीन नहीं है कि किस हुक का उपयोग करना है। अब तक, इस कोड को 'admin_init' हुक करना काम करने लगता है:

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

यह काम करने के लिए लगता है, लेकिन मैं सिर्फ यह देखना चाहता हूं कि क्या वहां एक अच्छा अभ्यास है।

धन्यवाद, डेव

जवाबों:


39

अगर मैं आपको सही ढंग से समझता हूं कि आप एक यूआरएल के लिए कुछ करना चाहते हैं, तो निम्न में से किसकी प्रतिक्रिया के लिए ब्राउज़र की सामग्री आपके द्वारा बनाई गई सामग्री होगी, अर्थात आपकी .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; ऐसा इसलिए है क्योंकि वर्डप्रेस ने 404 "Not Found" स्थिति कोड सेट कर दिया होगा क्योंकि यह URL को नहीं पहचानता है। हालांकि यह कोई समस्या नहीं है क्योंकि वर्डप्रेस ने प्रतिस्थापित करने के लिए trueकहता header()है 404और इसके बजाय HTTP 200 "ओके" स्थिति कोड का उपयोग किया है।

और यहाँ यह फ़ायरफ़ॉक्स में कैसा दिखता है ( ध्यान दें कि स्क्रीनशॉट में /downloads/वर्चुअल डायरेक्टरी नहीं है क्योंकि स्क्रीनशॉट लेने और एनोटेट करने के बाद यह सिर्फ '/downloads/'वर्चुअल डायरेक्टरी जोड़ने के लिए एक अच्छे विचार की तरह प्रतीत होता है ):

CSV फ़ाइल के लिए डाउनलोड URL का स्क्रीनशॉट
(स्रोत: mikeschinkel.com )

अद्यतन करें

यदि आप चाहते हैं कि डाउनलोड को उस URL से संभाला जाए जो उपसर्ग के साथ /wp-admin/उपयोक्ता को यह संकेत देने के लिए है कि यह एक लॉगिन द्वारा संरक्षित है तो आप ऐसा भी कर सकते हैं; एक मार्ग का वर्णन इस प्रकार है।

मैं एक वर्ग में इस बार समझाया, कहा जाता है DownloadCSV, और एक उपयोगकर्ता बनाया करने के लिए "क्षमता" कहा जाता है 'download_csv'के लिए 'administrator'भूमिका (भूमिकाओं और क्षमताओं के बारे में पढ़ा यहाँ ) तुम बस पूर्वनिर्धारित के बंद पिगीबैक सकता है 'export'की तरह है और यदि ऐसा है तो बस खोजें और बदलें यदि आप भूमिका 'download_csv'के साथ 'export'और register_activation_hook()कॉल और activate()फ़ंक्शन को हटा दें । वैसे, एक सक्रियण हुक की आवश्यकता एक कारण है कि मैंने इसे थीम की functions.phpफ़ाइल में रखने के बजाय एक प्लगइन में स्थानांतरित कर दिया है । *

मैंने "टूल्स" मेनू का उपयोग करके "डाउनलोड सीएसवी" मेनू विकल्प भी जोड़ा और इसे क्षमता से जोड़ा ।add_submenu_page()'download_csv'

अंत में मैंने 'plugins_loaded'हुक चुना क्योंकि यह सबसे उपयुक्त हुक था जिसका मैं उपयोग कर सकता था। आप उपयोग कर सकते हैं, 'admin_init'लेकिन वह हुक बहुत बाद में चलाया जाता है (1130 वीं हुक कॉल बनाम 3 डी हुक कॉल) तो क्यों वर्डप्रेस को जरूरत से ज्यादा फेंक-फेंक काम करना चाहिए? (मैंने अपने इंस्ट्रूमेंट हुक प्लग का इस्तेमाल किया, यह जानने के लिए कि कौन सा हुक इस्तेमाल करना है।)

हुक में मैं यह सुनिश्चित करने के लिए जांच करता हूं कि मेरा URL चर का /wp-admin/tools.phpनिरीक्षण करके शुरू होता है $pagenow, मैं इसे सत्यापित करता हूं current_user_can('download_csv')और यदि वह पास हो जाता है तो मैं $_GET['download']यह देखने के लिए परीक्षण करता हूं कि क्या आपके पास है data.csv; यदि हाँ, तो हम व्यावहारिक रूप से पहले जैसा ही कोड चलाते हैं। मैं पिछले उदाहरण में ,true,200कॉल से भी हटाता हूं header()क्योंकि यहां वर्डप्रेस जानता है कि यह एक अच्छा URL है इसलिए अभी तक 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();
}

और यहाँ सक्रिय प्लगइन का एक स्क्रीनशॉट है: (स्रोत: mikeschinkel.com )एक सक्रिय प्लगइन दिखा प्लगइन पृष्ठ का स्क्रीनशॉट

और अंत में यहाँ डाउनलोड को ट्रिगर करने का एक स्क्रीनशॉट है: (स्रोत: mikeschinkel.com )WordPress व्यवस्थापक के उपकरण मेनू के एक विकल्प से URL द्वारा एक फ़ाइल डाउनलोड करने का स्क्रीनशॉट


माइक, आपकी मदद के लिए धन्यवाद। इस सुविधा के साथ एकमात्र पकड़ यह है कि मैं चाहूंगा कि फ़ाइल बैकएंड से डाउनलोड की जाए। ऐसा लग रहा है कि template_redirect बैकएंड पर काम नहीं करता है, और अगर मुझे admin_init का उपयोग नहीं करना है, तो मुझे आश्चर्य है कि मैं इसके बजाय क्या उपयोग कर सकता हूं। admin_init अब मेरे लिए काम करता है, मैं कम से कम अवधि के लिए इसके साथ रह सकता हूं। यह एक मामूली विशेषता है जिसका उपयोग केवल कुछ लोग ही करने वाले हैं।
डेव मॉरिस

@ डेड मॉरिस - क्या आप परिभाषित कर सकते हैं कि "बैक एंड" से आपका क्या मतलब है ? क्या आपका मतलब सर्वर पर है? यदि हाँ, तो 'template_redirect'निश्चित रूप से सर्वर पर चलता है। यदि नहीं, तो मैं पूरी तरह से भ्रमित हूँ; क्या आप चिंता को स्पष्ट कर सकते हैं? अग्रिम में धन्यवाद।
माइकस्किंकेल

@ क्या: यदि आप "बैक एंड" द्वारा व्यवस्थापक क्षेत्र का मतलब है, यह अभी भी काम करेगा। डाउनलोड URL से शुरू होता है /downloads/data.csv, जो एक गैर-मौजूदा फ़ाइल है, इसलिए वर्डप्रेस "फ्रंट एंड" इस अनुरोध को संभाल लेगा और अंततः पहुंच जाएगा template-redirect। आप केवल उस व्यवस्थापक क्षेत्र में एक लिंक बनाते हैं जो इस फ़ॉर्नेटसाइड URL की ओर इशारा करता है। (यह कहा जाना चाहिए कि इस तरह, आपको व्यवस्थापक लॉगिन सुरक्षा मुफ्त में नहीं मिलती है - कोई भी व्यक्ति जो URL जानता है वह फ़ाइल डाउनलोड कर सकता है, लेकिन शायद इसे ठीक करने का एक आसान तरीका है?)
Jan Fabry

@ जान फेब्री - आह, मैं अब समझ गया हूं। द्वारा "वापस अंत" वह सही, व्यवस्थापक के भीतर से मतलब था? वह current_user_can()उपरोक्त कोड के साथ फ़ंक्शन का उपयोग कर सकता है या दूसरा दृष्टिकोण ले सकता है। इस टिप्पणी के बाद मैं अपने उत्तर में एक अद्यतन जोड़ूंगा।
माइकस्किंकल

हां, मैं माफी मांगता हूं, मुझे इस साइट से ईमेल अलर्ट प्राप्त नहीं हो रहे हैं, ताकि वापस जवाब देने में मेरी देरी के बारे में बताया जाए। मैं वास्तव में वर्डप्रेस के व्यवस्थापक क्षेत्र का उल्लेख कर रहा था जब मैंने "बैकएंड" कहा था। उसके लिए माफ़ करना। मैं template_redirect का उपयोग करने की कोशिश करूंगा और देखूंगा कि क्या होता है। धन्यवाद! ~ डेव
डेव मॉरिस

3

CSV में निर्यात करने के लिए एक और उपयोगी प्लगइन। कुछ एक के लिए उपयोगी हो सकता है

    <?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

admin_init हुक या लोड- (पेज) हुक काम करने लगता है, इस राज्य में वर्डप्रेस को हेडर सेट नहीं किया गया है। मैं लोड- (पेज) हुक का उपयोग कर रहा हूं क्योंकि यह तब चलता है जब एक प्रशासन मेनू पेज लोड होता है। आप विशिष्ट पृष्ठ के लिए अपनी स्क्रिप्ट लोड कर सकते हैं।

आप वर्डप्रेस कोडेक्स पर लोड- (पेज) हुक की जांच कर सकते हैं

यदि आप admin_init हुक का उपयोग कर रहे हैं, तो सुनिश्चित करें कि check_admin_referer या अन्य स्क्रिप्ट का उपयोग करते हुए गैर-सत्यापित करना संभव है, इस शर्त को पास करें कि आउटपुट आपकी डाउनलोड फ़ाइल प्राप्त करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.