web-dev-qa-db-fra.com

Admin plugin, comment puis-je générer un type de contenu différent?

Je crée un plugin avec une page d'administration qui doit:

  • diffuser un fichier à télécharger (définir le type de contenu et d'autres en-têtes)
  • afficher le HTML sans le menu administrateur, etc.

Dans ces deux cas, les "pages" doivent ne sont accessibles qu'aux administrateurs connectés. Jusqu'à présent, j'ai trouvé un moyen d'accomplir ces deux choses, en incluant wp-blog-header.php dans un fichier php, en vérifiant que l'utilisateur est un administrateur et en procédant moi-même, comme indiqué ci-dessous.

require('../../../wp-blog-header.php');

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

...set headers & stream file

Existe-t-il une meilleure façon de le faire?

Y a-t-il une raison pour laquelle je ne devrais pas le faire de cette façon?

Merci :)

5
JimmyCricket

J'ai fait ça de deux manières:

1) - une fonction d’exportation csv - détecte que le traitement de type de contenu spécial est requis AVANT que wp n’émette quoi que ce soit.

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 */
}       

Un autre moyen était plus orienté vers l'alimentation, mais le même principe, sauf que wp effectue la détection de manipulation spéciale (recherche? Feed = ics ou). Placez le code add_feed dans une action init.

add_feed('ics', 'ical_feed');

la fonction 'ical_feed' fait alors tout l'en-tête, etc.

2
anmari