WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm creating a plugin with an admin page that needs to:

  • stream a file for download (set content-type & other headers)
  • display HTML without the admin menu etc

In both of these cases the 'pages' must be accessible only to logged in administrators. So far I've found one way to accomplish both of these, by including wp-blog-header.php in a php file, checking the user is an admin and doing things myself from then on, as below.


if (!current_user_can('administrator'))
    wp_die( __('You do not have sufficient permissions to access this page.') );

...set headers & stream file

Is there a better way of doing this?

Is there any reason I shouldn't do it this way?

Thanks :)

share|improve this question

I've done this two ways:

1) - a csv export function - detect that special content type handling is required BEFORE wp outputs anything.

add_action ('plugins_loaded',           'amr_meta_handle_csv');

function amr_meta_handle_csv ($csv, $suffix='csv') {
// chcek if there is a csv request on this page BEFORE we do anything else ?
if (( isset ($_POST['csv']) )) {
// do some stuff
      to_csv ($csv, $suffix)

function to_csv ($csv, $suffix) {
/* create a csv file for download */
    if (!isset($suffix)) $suffix = 'csv';
    $file = 'userlist-'.date('YmdHis').'.'.$suffix;
    header("Content-Description: File Transfer");
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$file");
    header("Pragma: no-cache");
    header("Expires: 0");
    echo $csv;
    exit(0);   /* Terminate the current script sucessfully */

Another way was more feed oriented, but same principle, except wp does the special handling detection (checks for ?feed=ics or ). Put the add_feed code in an init action.

add_feed('ics', 'ical_feed');

function 'ical_feed' then does the whole header etc.

share|improve this answer

Take a look at the WordPress HTTP API. http://core.trac.wordpress.org/browser/tags/3.3.2/wp-includes/http.php

As far as the rest of plugin development. Read the plugin API or about writing a plugin.

share|improve this answer
The HTTP API is for fetching external resources, not for sending pages. And the asker obviously knows already the plugin basics. – toscho May 22 '12 at 4:30

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.