Переопределение поведения WordPress по умолчанию в панели администратора для отправки заголовков с генерацией CSV

#php #wordpress

#php #wordpress

Вопрос:

Я создаю прототип плагина WP, используя шаблон плагина.Мне очень сложно создавать документы и переопределять панель администратора в WP IOT, создавать PDF-файлы / электронные таблицы и т. Д. Я уверен, что есть трюк, которого я не знаю.

Если для этого есть наилучшая практика, я хотел бы знать, поскольку традиционные подходы, которые я бы использовал (с другими фреймворками), похоже, не работают.

Сейчас я создаю страницу меню со страницей подменю. Страница подменю содержит ссылки для создания различных отчетов. После прочтения Кодекса предлагается добавить страницу меню подстраницы с родительским значением slug как null (поэтому он не указан, но доступен).

Код выглядит следующим образом:

 $this->plugin_screen_hook_suffix = add_submenu_page(
            null,
            __( 'Session', $this->plugin_slug. '-reports' ),
            __( 'Session Report', $this->plugin_slug. '-reports' ),
            'manage_options',
            $this->plugin_slug . '-report-session',
            array( $this, 'display_plugin_session_report_page' )
        );

public function display_plugin_session_report_page() {
        header('Content-Description: File Transfer');
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename=report.csv;');
        header('Pragma: no-cache');
        header('Expires: 0');
//push out csv...
}
  

Единственный способ, которым я работал с WP, — это ссылка на внешнюю страницу, например report.php , и вызов метода внутри него. Есть ли другой способ?

Ответ №1:

Вот решение, с которым я пошел, которое позволяет избежать настройки отдельной страницы скрипта:

В URL я добавляю следующее: amp;noheader=true , затем при вызове функции я очищаю выходной буфер с помощью ob_clean и генерирую свои собственные заголовки. Я не смог найти никакой надежной документации по настройке noheader, но обнаружил, что она применима только в admin.php звонки.

Я надеюсь, что это поможет другим разработчикам!