Implementing automated compliance reporting for custom knowledge base document categories ledgers using custom PHP-Spreadsheet exports
function get_kb_compliance_data() {
global $wpdb;
$results = [];
// Define post type and taxonomy
$post_type = 'kb_document';
$taxonomy = 'kb_category';
// Base query for posts
$args = array(
'post_type' => $post_type,
'post_status' => 'publish', // Or 'any' depending on reporting needs
'posts_per_page' => -1, // Fetch all
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$post_id = get_the_ID();
$post_title = get_the_title();
$post_date = get_the_date('Y-m-d H:i:s');
$post_modified = get_the_modified_date('Y-m-d H:i:s');
$author_id = get_the_author_meta('ID');
$author_name = get_the_author_meta('display_name');
// Get terms for the custom taxonomy
$terms = get_the_terms( $post_id, $taxonomy );
$category_names = array();
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
$category_names[] = $term->name;
}
}
$categories_string = implode( ', ', $category_names );
// Example: Fetching a custom field (e.g., 'compliance_review_date')
$review_date = get_post_meta( $post_id, 'compliance_review_date', true );
if ( empty( $review_date ) ) {
$review_date = 'N/A';
}
$results[] = array(
'ID' => $post_id,
'Title' => $post_title,
'Published Date' => $post_date,
'Modified Date' => $post_modified,
'Categories' => $categories_string,
'Author' => $author_name,
'Review Date' => $review_date,
// Add more custom fields as needed
);
}
wp_reset_postdata();
}
return $results;
}
Generating the Spreadsheet with PHP-Spreadsheet
Now, let’s integrate the data retrieval with PHP-Spreadsheet to create an XLSX file. We’ll create a function that takes the data and generates the spreadsheet, then offers it for download.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
function generate_compliance_report_xlsx() {
// Ensure Composer autoloader is included
require_once __DIR__ . '/vendor/autoload.php';
// Fetch the data
$compliance_data = get_kb_compliance_data();
if ( empty( $compliance_data ) ) {
wp_die( 'No compliance data found to generate report.' );
}
// Create a new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set sheet title
$sheet->setTitle('KB Compliance Report');
// Prepare header row
$header_row = array_keys($compliance_data[0]);
$sheet->fromArray([$header_row], NULL, 'A1');
// Apply header styling
$header_style_array = [
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'argb' => 'FFD3D3D3', // Light grey
],
],
'borders' => [
'bottom' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$sheet->getStyle('A1:' . $sheet->getCellByColumnAndRow(count($header_row), 1)->getColumn() . '1')
->applyFromArray($header_style_array);
// Populate data rows
$row_num = 2; // Start from the second row
foreach ( $compliance_data as $row_data ) {
$sheet->fromArray(array_values($row_data), NULL, 'A' . $row_num);
$row_num++;
}
// Auto-size columns for better readability
foreach (range('A', $sheet->getHighestDataColumn()) as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
// Create a writer object
$writer = new Xlsx($spreadsheet);
// Set HTTP headers for download
$filename = 'kb_compliance_report_' . date('Ymd_His') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
// Output the file directly to the browser
$writer->save('php://output');
exit; // Important to stop further execution
}
// Example of how to hook this into WordPress (e.g., via an admin menu page or a shortcode)
// For an admin page:
/*
add_action('admin_menu', function() {
add_management_page(
'KB Compliance Report',
'KB Compliance Report',
'manage_options',
'kb-compliance-report',
'generate_compliance_report_xlsx' // This function will be called when the page is accessed
);
});
*/
// For a shortcode (less ideal for direct download, but possible):
/*
add_shortcode('kb_compliance_report_download', function() {
// This would typically redirect to a URL that triggers the generation
// Or, if you want to embed a link that *starts* the download:
$report_url = admin_url('admin-ajax.php?action=generate_kb_report');
return '<a href="' . esc_url($report_url) . '">Download Compliance Report</a>';
});
add_action('wp_ajax_generate_kb_report', 'generate_compliance_report_xlsx'); // For logged-in users
add_action('wp_ajax_nopriv_generate_kb_report', 'generate_kb_report_xlsx'); // For logged-out users (if needed)
*/
Implementation Considerations and Enhancements
Security: The `generate_compliance_report_xlsx` function should be protected by appropriate WordPress capabilities (e.g., `manage_options` for administrators). The example using `add_management_page` demonstrates this. If using AJAX, ensure proper nonces are implemented.
Performance: For knowledge bases with thousands of documents, fetching all data with `posts_per_page => -1` can be slow and memory-intensive. Consider implementing:
- Pagination in the data retrieval function.
- Date range filters for the report.
- Filtering by specific categories or authors.
- Caching mechanisms for frequently generated reports.
Error Handling: The current script uses `wp_die()` for basic error messages. In a production plugin, you’d want more graceful error handling, logging, and user feedback.
Custom Fields: The example shows fetching a single custom field. You can extend `get_kb_compliance_data` to include any number of custom fields relevant to your compliance needs. Ensure these fields are properly sanitized and validated.
Alternative Formats: PHP-Spreadsheet supports various formats beyond XLSX, including CSV, PDF, HTML, and ODS. You can easily switch the writer class (e.g., `use PhpOffice\PhpSpreadsheet\Writer\Csv;`) and adjust headers accordingly if other formats are required.
User Interface: For a better user experience, consider building a dedicated admin page with options for filtering and generating the report, rather than relying solely on direct URL access or simple shortcodes.
Conclusion
By integrating the powerful PHP-Spreadsheet library into your WordPress development workflow, you can automate the generation of detailed compliance reports for custom knowledge base content. This approach significantly reduces manual effort, minimizes errors, and ensures that your categorized data is readily available in a structured, professional format for audits and internal reviews. Remember to tailor the data retrieval and reporting logic to your specific WordPress setup and compliance requirements.
// In your plugin file or a dedicated reporting script require_once __DIR__ . '/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // ... other necessary use statements
Designing the Data Retrieval Logic
Our goal is to create a ledger of documents, their assigned categories, and relevant metadata for compliance. Let’s assume we have a custom post type named `kb_document` and a custom taxonomy named `kb_category`. We’ll need to query the WordPress database to fetch this information.
A typical compliance report might include:
- Document Title
- Document ID (Post ID)
- Date Published/Modified
- Assigned Category/Categories
- Author
- Any custom fields relevant to compliance (e.g., review date, approval status).
Here’s a PHP function that retrieves this data. For simplicity, this example fetches all documents and their categories. In a production environment, you’d likely add pagination, filtering, and date range selection.
function get_kb_compliance_data() {
global $wpdb;
$results = [];
// Define post type and taxonomy
$post_type = 'kb_document';
$taxonomy = 'kb_category';
// Base query for posts
$args = array(
'post_type' => $post_type,
'post_status' => 'publish', // Or 'any' depending on reporting needs
'posts_per_page' => -1, // Fetch all
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$post_id = get_the_ID();
$post_title = get_the_title();
$post_date = get_the_date('Y-m-d H:i:s');
$post_modified = get_the_modified_date('Y-m-d H:i:s');
$author_id = get_the_author_meta('ID');
$author_name = get_the_author_meta('display_name');
// Get terms for the custom taxonomy
$terms = get_the_terms( $post_id, $taxonomy );
$category_names = array();
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
$category_names[] = $term->name;
}
}
$categories_string = implode( ', ', $category_names );
// Example: Fetching a custom field (e.g., 'compliance_review_date')
$review_date = get_post_meta( $post_id, 'compliance_review_date', true );
if ( empty( $review_date ) ) {
$review_date = 'N/A';
}
$results[] = array(
'ID' => $post_id,
'Title' => $post_title,
'Published Date' => $post_date,
'Modified Date' => $post_modified,
'Categories' => $categories_string,
'Author' => $author_name,
'Review Date' => $review_date,
// Add more custom fields as needed
);
}
wp_reset_postdata();
}
return $results;
}
Generating the Spreadsheet with PHP-Spreadsheet
Now, let’s integrate the data retrieval with PHP-Spreadsheet to create an XLSX file. We’ll create a function that takes the data and generates the spreadsheet, then offers it for download.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
function generate_compliance_report_xlsx() {
// Ensure Composer autoloader is included
require_once __DIR__ . '/vendor/autoload.php';
// Fetch the data
$compliance_data = get_kb_compliance_data();
if ( empty( $compliance_data ) ) {
wp_die( 'No compliance data found to generate report.' );
}
// Create a new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set sheet title
$sheet->setTitle('KB Compliance Report');
// Prepare header row
$header_row = array_keys($compliance_data[0]);
$sheet->fromArray([$header_row], NULL, 'A1');
// Apply header styling
$header_style_array = [
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'argb' => 'FFD3D3D3', // Light grey
],
],
'borders' => [
'bottom' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$sheet->getStyle('A1:' . $sheet->getCellByColumnAndRow(count($header_row), 1)->getColumn() . '1')
->applyFromArray($header_style_array);
// Populate data rows
$row_num = 2; // Start from the second row
foreach ( $compliance_data as $row_data ) {
$sheet->fromArray(array_values($row_data), NULL, 'A' . $row_num);
$row_num++;
}
// Auto-size columns for better readability
foreach (range('A', $sheet->getHighestDataColumn()) as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
// Create a writer object
$writer = new Xlsx($spreadsheet);
// Set HTTP headers for download
$filename = 'kb_compliance_report_' . date('Ymd_His') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
// Output the file directly to the browser
$writer->save('php://output');
exit; // Important to stop further execution
}
// Example of how to hook this into WordPress (e.g., via an admin menu page or a shortcode)
// For an admin page:
/*
add_action('admin_menu', function() {
add_management_page(
'KB Compliance Report',
'KB Compliance Report',
'manage_options',
'kb-compliance-report',
'generate_compliance_report_xlsx' // This function will be called when the page is accessed
);
});
*/
// For a shortcode (less ideal for direct download, but possible):
/*
add_shortcode('kb_compliance_report_download', function() {
// This would typically redirect to a URL that triggers the generation
// Or, if you want to embed a link that *starts* the download:
$report_url = admin_url('admin-ajax.php?action=generate_kb_report');
return '<a href="' . esc_url($report_url) . '">Download Compliance Report</a>';
});
add_action('wp_ajax_generate_kb_report', 'generate_compliance_report_xlsx'); // For logged-in users
add_action('wp_ajax_nopriv_generate_kb_report', 'generate_kb_report_xlsx'); // For logged-out users (if needed)
*/
Implementation Considerations and Enhancements
Security: The `generate_compliance_report_xlsx` function should be protected by appropriate WordPress capabilities (e.g., `manage_options` for administrators). The example using `add_management_page` demonstrates this. If using AJAX, ensure proper nonces are implemented.
Performance: For knowledge bases with thousands of documents, fetching all data with `posts_per_page => -1` can be slow and memory-intensive. Consider implementing:
- Pagination in the data retrieval function.
- Date range filters for the report.
- Filtering by specific categories or authors.
- Caching mechanisms for frequently generated reports.
Error Handling: The current script uses `wp_die()` for basic error messages. In a production plugin, you’d want more graceful error handling, logging, and user feedback.
Custom Fields: The example shows fetching a single custom field. You can extend `get_kb_compliance_data` to include any number of custom fields relevant to your compliance needs. Ensure these fields are properly sanitized and validated.
Alternative Formats: PHP-Spreadsheet supports various formats beyond XLSX, including CSV, PDF, HTML, and ODS. You can easily switch the writer class (e.g., `use PhpOffice\PhpSpreadsheet\Writer\Csv;`) and adjust headers accordingly if other formats are required.
User Interface: For a better user experience, consider building a dedicated admin page with options for filtering and generating the report, rather than relying solely on direct URL access or simple shortcodes.
Conclusion
By integrating the powerful PHP-Spreadsheet library into your WordPress development workflow, you can automate the generation of detailed compliance reports for custom knowledge base content. This approach significantly reduces manual effort, minimizes errors, and ensures that your categorized data is readily available in a structured, professional format for audits and internal reviews. Remember to tailor the data retrieval and reporting logic to your specific WordPress setup and compliance requirements.
composer require phpoffice/phpspreadsheet
This will download the library and its dependencies into a `vendor` directory. You’ll then need to include Composer’s autoloader in your PHP script:
// In your plugin file or a dedicated reporting script require_once __DIR__ . '/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // ... other necessary use statements
Designing the Data Retrieval Logic
Our goal is to create a ledger of documents, their assigned categories, and relevant metadata for compliance. Let’s assume we have a custom post type named `kb_document` and a custom taxonomy named `kb_category`. We’ll need to query the WordPress database to fetch this information.
A typical compliance report might include:
- Document Title
- Document ID (Post ID)
- Date Published/Modified
- Assigned Category/Categories
- Author
- Any custom fields relevant to compliance (e.g., review date, approval status).
Here’s a PHP function that retrieves this data. For simplicity, this example fetches all documents and their categories. In a production environment, you’d likely add pagination, filtering, and date range selection.
function get_kb_compliance_data() {
global $wpdb;
$results = [];
// Define post type and taxonomy
$post_type = 'kb_document';
$taxonomy = 'kb_category';
// Base query for posts
$args = array(
'post_type' => $post_type,
'post_status' => 'publish', // Or 'any' depending on reporting needs
'posts_per_page' => -1, // Fetch all
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$post_id = get_the_ID();
$post_title = get_the_title();
$post_date = get_the_date('Y-m-d H:i:s');
$post_modified = get_the_modified_date('Y-m-d H:i:s');
$author_id = get_the_author_meta('ID');
$author_name = get_the_author_meta('display_name');
// Get terms for the custom taxonomy
$terms = get_the_terms( $post_id, $taxonomy );
$category_names = array();
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
$category_names[] = $term->name;
}
}
$categories_string = implode( ', ', $category_names );
// Example: Fetching a custom field (e.g., 'compliance_review_date')
$review_date = get_post_meta( $post_id, 'compliance_review_date', true );
if ( empty( $review_date ) ) {
$review_date = 'N/A';
}
$results[] = array(
'ID' => $post_id,
'Title' => $post_title,
'Published Date' => $post_date,
'Modified Date' => $post_modified,
'Categories' => $categories_string,
'Author' => $author_name,
'Review Date' => $review_date,
// Add more custom fields as needed
);
}
wp_reset_postdata();
}
return $results;
}
Generating the Spreadsheet with PHP-Spreadsheet
Now, let’s integrate the data retrieval with PHP-Spreadsheet to create an XLSX file. We’ll create a function that takes the data and generates the spreadsheet, then offers it for download.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
function generate_compliance_report_xlsx() {
// Ensure Composer autoloader is included
require_once __DIR__ . '/vendor/autoload.php';
// Fetch the data
$compliance_data = get_kb_compliance_data();
if ( empty( $compliance_data ) ) {
wp_die( 'No compliance data found to generate report.' );
}
// Create a new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set sheet title
$sheet->setTitle('KB Compliance Report');
// Prepare header row
$header_row = array_keys($compliance_data[0]);
$sheet->fromArray([$header_row], NULL, 'A1');
// Apply header styling
$header_style_array = [
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'argb' => 'FFD3D3D3', // Light grey
],
],
'borders' => [
'bottom' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$sheet->getStyle('A1:' . $sheet->getCellByColumnAndRow(count($header_row), 1)->getColumn() . '1')
->applyFromArray($header_style_array);
// Populate data rows
$row_num = 2; // Start from the second row
foreach ( $compliance_data as $row_data ) {
$sheet->fromArray(array_values($row_data), NULL, 'A' . $row_num);
$row_num++;
}
// Auto-size columns for better readability
foreach (range('A', $sheet->getHighestDataColumn()) as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
// Create a writer object
$writer = new Xlsx($spreadsheet);
// Set HTTP headers for download
$filename = 'kb_compliance_report_' . date('Ymd_His') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
// Output the file directly to the browser
$writer->save('php://output');
exit; // Important to stop further execution
}
// Example of how to hook this into WordPress (e.g., via an admin menu page or a shortcode)
// For an admin page:
/*
add_action('admin_menu', function() {
add_management_page(
'KB Compliance Report',
'KB Compliance Report',
'manage_options',
'kb-compliance-report',
'generate_compliance_report_xlsx' // This function will be called when the page is accessed
);
});
*/
// For a shortcode (less ideal for direct download, but possible):
/*
add_shortcode('kb_compliance_report_download', function() {
// This would typically redirect to a URL that triggers the generation
// Or, if you want to embed a link that *starts* the download:
$report_url = admin_url('admin-ajax.php?action=generate_kb_report');
return '<a href="' . esc_url($report_url) . '">Download Compliance Report</a>';
});
add_action('wp_ajax_generate_kb_report', 'generate_compliance_report_xlsx'); // For logged-in users
add_action('wp_ajax_nopriv_generate_kb_report', 'generate_kb_report_xlsx'); // For logged-out users (if needed)
*/
Implementation Considerations and Enhancements
Security: The `generate_compliance_report_xlsx` function should be protected by appropriate WordPress capabilities (e.g., `manage_options` for administrators). The example using `add_management_page` demonstrates this. If using AJAX, ensure proper nonces are implemented.
Performance: For knowledge bases with thousands of documents, fetching all data with `posts_per_page => -1` can be slow and memory-intensive. Consider implementing:
- Pagination in the data retrieval function.
- Date range filters for the report.
- Filtering by specific categories or authors.
- Caching mechanisms for frequently generated reports.
Error Handling: The current script uses `wp_die()` for basic error messages. In a production plugin, you’d want more graceful error handling, logging, and user feedback.
Custom Fields: The example shows fetching a single custom field. You can extend `get_kb_compliance_data` to include any number of custom fields relevant to your compliance needs. Ensure these fields are properly sanitized and validated.
Alternative Formats: PHP-Spreadsheet supports various formats beyond XLSX, including CSV, PDF, HTML, and ODS. You can easily switch the writer class (e.g., `use PhpOffice\PhpSpreadsheet\Writer\Csv;`) and adjust headers accordingly if other formats are required.
User Interface: For a better user experience, consider building a dedicated admin page with options for filtering and generating the report, rather than relying solely on direct URL access or simple shortcodes.
Conclusion
By integrating the powerful PHP-Spreadsheet library into your WordPress development workflow, you can automate the generation of detailed compliance reports for custom knowledge base content. This approach significantly reduces manual effort, minimizes errors, and ensures that your categorized data is readily available in a structured, professional format for audits and internal reviews. Remember to tailor the data retrieval and reporting logic to your specific WordPress setup and compliance requirements.
Leveraging PHP-Spreadsheet for Automated Compliance Reporting of Custom Knowledge Base Categories
Many WordPress sites evolve beyond simple blogging to become sophisticated knowledge bases, often with custom post types and taxonomies to categorize content. Ensuring compliance, whether for internal audits, regulatory requirements, or client reporting, necessitates a robust method for tracking and presenting this categorized information. Manually generating reports from custom database tables or complex query outputs is time-consuming and error-prone. This guide details how to implement automated compliance reporting by exporting custom knowledge base document category ledgers directly into spreadsheet formats using the PHP-Spreadsheet library.
Prerequisites and Setup
Before we begin, ensure you have the following:
- A WordPress installation with custom post types and taxonomies representing your knowledge base documents and their categories.
- Composer installed for managing PHP dependencies.
- Basic understanding of WordPress plugin development and SQL queries.
First, we need to install the PHP-Spreadsheet library. The most straightforward way to do this in a WordPress context is via Composer within a custom plugin or a theme’s `functions.php` file (though a plugin is highly recommended for maintainability). Navigate to your plugin’s directory (or create one) and run:
composer require phpoffice/phpspreadsheet
This will download the library and its dependencies into a `vendor` directory. You’ll then need to include Composer’s autoloader in your PHP script:
// In your plugin file or a dedicated reporting script require_once __DIR__ . '/vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // ... other necessary use statements
Designing the Data Retrieval Logic
Our goal is to create a ledger of documents, their assigned categories, and relevant metadata for compliance. Let’s assume we have a custom post type named `kb_document` and a custom taxonomy named `kb_category`. We’ll need to query the WordPress database to fetch this information.
A typical compliance report might include:
- Document Title
- Document ID (Post ID)
- Date Published/Modified
- Assigned Category/Categories
- Author
- Any custom fields relevant to compliance (e.g., review date, approval status).
Here’s a PHP function that retrieves this data. For simplicity, this example fetches all documents and their categories. In a production environment, you’d likely add pagination, filtering, and date range selection.
function get_kb_compliance_data() {
global $wpdb;
$results = [];
// Define post type and taxonomy
$post_type = 'kb_document';
$taxonomy = 'kb_category';
// Base query for posts
$args = array(
'post_type' => $post_type,
'post_status' => 'publish', // Or 'any' depending on reporting needs
'posts_per_page' => -1, // Fetch all
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$post_id = get_the_ID();
$post_title = get_the_title();
$post_date = get_the_date('Y-m-d H:i:s');
$post_modified = get_the_modified_date('Y-m-d H:i:s');
$author_id = get_the_author_meta('ID');
$author_name = get_the_author_meta('display_name');
// Get terms for the custom taxonomy
$terms = get_the_terms( $post_id, $taxonomy );
$category_names = array();
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
$category_names[] = $term->name;
}
}
$categories_string = implode( ', ', $category_names );
// Example: Fetching a custom field (e.g., 'compliance_review_date')
$review_date = get_post_meta( $post_id, 'compliance_review_date', true );
if ( empty( $review_date ) ) {
$review_date = 'N/A';
}
$results[] = array(
'ID' => $post_id,
'Title' => $post_title,
'Published Date' => $post_date,
'Modified Date' => $post_modified,
'Categories' => $categories_string,
'Author' => $author_name,
'Review Date' => $review_date,
// Add more custom fields as needed
);
}
wp_reset_postdata();
}
return $results;
}
Generating the Spreadsheet with PHP-Spreadsheet
Now, let’s integrate the data retrieval with PHP-Spreadsheet to create an XLSX file. We’ll create a function that takes the data and generates the spreadsheet, then offers it for download.
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
function generate_compliance_report_xlsx() {
// Ensure Composer autoloader is included
require_once __DIR__ . '/vendor/autoload.php';
// Fetch the data
$compliance_data = get_kb_compliance_data();
if ( empty( $compliance_data ) ) {
wp_die( 'No compliance data found to generate report.' );
}
// Create a new Spreadsheet object
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Set sheet title
$sheet->setTitle('KB Compliance Report');
// Prepare header row
$header_row = array_keys($compliance_data[0]);
$sheet->fromArray([$header_row], NULL, 'A1');
// Apply header styling
$header_style_array = [
'font' => [
'bold' => true,
],
'fill' => [
'fillType' => Fill::FILL_SOLID,
'startColor' => [
'argb' => 'FFD3D3D3', // Light grey
],
],
'borders' => [
'bottom' => [
'borderStyle' => Border::BORDER_THIN,
'color' => ['argb' => 'FF000000'],
],
],
];
$sheet->getStyle('A1:' . $sheet->getCellByColumnAndRow(count($header_row), 1)->getColumn() . '1')
->applyFromArray($header_style_array);
// Populate data rows
$row_num = 2; // Start from the second row
foreach ( $compliance_data as $row_data ) {
$sheet->fromArray(array_values($row_data), NULL, 'A' . $row_num);
$row_num++;
}
// Auto-size columns for better readability
foreach (range('A', $sheet->getHighestDataColumn()) as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
// Create a writer object
$writer = new Xlsx($spreadsheet);
// Set HTTP headers for download
$filename = 'kb_compliance_report_' . date('Ymd_His') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
// Output the file directly to the browser
$writer->save('php://output');
exit; // Important to stop further execution
}
// Example of how to hook this into WordPress (e.g., via an admin menu page or a shortcode)
// For an admin page:
/*
add_action('admin_menu', function() {
add_management_page(
'KB Compliance Report',
'KB Compliance Report',
'manage_options',
'kb-compliance-report',
'generate_compliance_report_xlsx' // This function will be called when the page is accessed
);
});
*/
// For a shortcode (less ideal for direct download, but possible):
/*
add_shortcode('kb_compliance_report_download', function() {
// This would typically redirect to a URL that triggers the generation
// Or, if you want to embed a link that *starts* the download:
$report_url = admin_url('admin-ajax.php?action=generate_kb_report');
return '<a href="' . esc_url($report_url) . '">Download Compliance Report</a>';
});
add_action('wp_ajax_generate_kb_report', 'generate_compliance_report_xlsx'); // For logged-in users
add_action('wp_ajax_nopriv_generate_kb_report', 'generate_kb_report_xlsx'); // For logged-out users (if needed)
*/
Implementation Considerations and Enhancements
Security: The `generate_compliance_report_xlsx` function should be protected by appropriate WordPress capabilities (e.g., `manage_options` for administrators). The example using `add_management_page` demonstrates this. If using AJAX, ensure proper nonces are implemented.
Performance: For knowledge bases with thousands of documents, fetching all data with `posts_per_page => -1` can be slow and memory-intensive. Consider implementing:
- Pagination in the data retrieval function.
- Date range filters for the report.
- Filtering by specific categories or authors.
- Caching mechanisms for frequently generated reports.
Error Handling: The current script uses `wp_die()` for basic error messages. In a production plugin, you’d want more graceful error handling, logging, and user feedback.
Custom Fields: The example shows fetching a single custom field. You can extend `get_kb_compliance_data` to include any number of custom fields relevant to your compliance needs. Ensure these fields are properly sanitized and validated.
Alternative Formats: PHP-Spreadsheet supports various formats beyond XLSX, including CSV, PDF, HTML, and ODS. You can easily switch the writer class (e.g., `use PhpOffice\PhpSpreadsheet\Writer\Csv;`) and adjust headers accordingly if other formats are required.
User Interface: For a better user experience, consider building a dedicated admin page with options for filtering and generating the report, rather than relying solely on direct URL access or simple shortcodes.
Conclusion
By integrating the powerful PHP-Spreadsheet library into your WordPress development workflow, you can automate the generation of detailed compliance reports for custom knowledge base content. This approach significantly reduces manual effort, minimizes errors, and ensures that your categorized data is readily available in a structured, professional format for audits and internal reviews. Remember to tailor the data retrieval and reporting logic to your specific WordPress setup and compliance requirements.