| Server IP : 104.21.21.239 / Your IP : 216.73.216.114 Web Server : Apache/2.4.68 (Amazon Linux) OpenSSL/3.5.5 System : Linux ip-172-31-69-123.ec2.internal 6.1.176-223.369.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jul 24 13:34:27 UTC 2026 x86_64 User : ec2-user ( 1000) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/mitzvahm/public_html/wp-content/plugins/simple-history/dropins/ |
Upload File : |
<?php
/**
* Dropin Name: Export
* Dropin Description: Adds a tab with export options
* Dropin URI: http://simple-history.com/
* Author: Pär Thernström
*/
class SimpleHistoryExportDropin
{
/**
* Simple History instance.
*
* @var $sh
*/
private $sh;
/**
* Constructor.
*
* @param instance $sh Simple History instance.
*/
public function __construct($sh)
{
$this->sh = $sh;
// Add tab to settings page.
$sh->registerSettingsTab(array(
'slug' => 'export',
'name' => _x('Export', 'Export dropin: Tab name on settings page', 'simple-history'),
'function' => array( $this, 'output' ),
));
add_action('init', array( $this, 'downloadExport' ));
}
public function downloadExport()
{
global $wpdb;
$table_name = $wpdb->prefix . SimpleHistory::DBTABLE;
$table_name_contexts = $wpdb->prefix . SimpleHistory::DBTABLE_CONTEXTS;
if (isset($_POST['simple-history-action']) && $_POST['simple-history-action'] === 'export-history') {
// Will die if nonce not valid
check_admin_referer(__CLASS__ . '-action-export');
$export_format = isset($_POST['format']) ? $_POST['format'] : 'json';
// Disable relative time output in header
add_filter('simple_history/header_time_ago_max_time', '__return_zero');
add_filter('simple_history/header_just_now_max_time', '__return_zero');
// Don't use "You" if event is initiated by the same user that does the export
add_filter('simple_history/header_initiator_use_you', '__return_false');
$query = new SimpleHistoryLogQuery();
$query_args = array(
'paged' => 1,
'posts_per_page' => 3000,
);
$events = $query->query($query_args);
// $events->total_row_count;
$pages_count = $events['pages_count'];
$page_current = $events['page_current'];
$fp = fopen('php://output', 'w');
$attachment_header_template = 'Content-Disposition: attachment; filename="%1$s"';
if ('csv' == $export_format) {
$filename = 'simple-history-export-' . time() . '.csv';
header('Content-Type: text/plain');
header(sprintf($attachment_header_template, $filename));
} elseif ('json' == $export_format) {
$filename = 'simple-history-export-' . time() . '.json';
header('Content-Type: application/json');
header(sprintf($attachment_header_template, $filename));
} elseif ('html' == $export_format) {
$filename = 'simple-history-export-' . time() . '.html';
header('Content-Type: text/html');
// header("Content-Disposition: attachment; filename='{$filename}'");
}
// Some formats need to output some stuff before the actual loops
if ('json' == $export_format) {
$json_row = '[';
fwrite($fp, $json_row);
} elseif ('html' == $export_format) {
$html = sprintf(
'
<!doctype html>
<meta charset="utf-8">
<title>Simple History export</title>
<ul>
'
);
fwrite($fp, $html);
}
// Paginate through all pages and all their rows.
$row_loop = 0;
while ($page_current <= $pages_count + 1) {
// if ($page_current > 1) { break; } # To debug/test
foreach ($events['log_rows'] as $one_row) {
// if ( $row_loop > 10) { break; } # To debug/test
set_time_limit(30);
if ('csv' == $export_format) {
$header_output = strip_tags(html_entity_decode($this->sh->getLogRowHeaderOutput($one_row), ENT_QUOTES, 'UTF-8'));
$header_output = trim(preg_replace('/\s\s+/', ' ', $header_output));
$message_output = strip_tags(html_entity_decode($this->sh->getLogRowPlainTextOutput($one_row), ENT_QUOTES, 'UTF-8'));
$user_email = empty($one_row->context['_user_email']) ? null : $one_row->context['_user_email'];
$user_login = empty($one_row->context['_user_login']) ? null : $one_row->context['_user_login'];
fputcsv($fp, array(
$one_row->date,
$one_row->logger,
$one_row->level,
$one_row->initiator,
$one_row->context_message_key,
$user_email,
$user_login,
$header_output,
$message_output,
$one_row->subsequentOccasions,
));
} elseif ('json' == $export_format) {
// If not first loop then add a comma between all json objects.
if ($row_loop == 0) {
$comma = "\n";
} else {
$comma = ",\n";
}
$json_row = $comma . $this->sh->json_encode($one_row);
fwrite($fp, $json_row);
} elseif ('html' == $export_format) {
$html = sprintf(
'
<li>
<div>%1$s</div>
<div>%2$s</div>
<div>%3$s</div>
</li>
',
$this->sh->getLogRowHeaderOutput($one_row),
$this->sh->getLogRowPlainTextOutput($one_row),
$this->sh->getLogRowDetailsOutput($one_row)
);
fwrite($fp, $html);
}// End if().
$row_loop++;
}// End foreach().
// echo "<br>memory_get_usage:<br>"; print_r(memory_get_usage());
// echo "<br>memory_get_peak_usage:<br>"; print_r(memory_get_peak_usage());
// echo "<br>fetch next page";
flush();
// Fetch next page
// @TODO: must take into consideration that new items can be added while we do the fetch
$page_current++;
$query_args['paged'] = $page_current;
$events = $query->query($query_args);
// echo "<br>did fetch next page";
// echo "<br>memory_get_usage:<br>"; print_r(memory_get_usage());
// echo "<br>memory_get_peak_usage:<br>"; print_r(memory_get_peak_usage());
}// End while().
if ('json' == $export_format) {
$json_row = ']';
fwrite($fp, $json_row);
} elseif ('html' == $export_format) {
$html = sprintf('</ul>');
fwrite($fp, $html);
}
fclose($fp);
flush();
exit;
// echo "<br>done";
}// End if().
}
public function output()
{
?>
<!-- <h2>Export</h2> -->
<p><?php _ex('The export function will export the full history.', 'Export dropin: introtext', 'simple-history') ?></p>
<form method="post">
<h3><?php _ex('Choose format to export to', 'Export dropin: format', 'simple-history') ?></h3>
<p>
<label>
<input type="radio" name="format" value="json" checked>
<?php _ex('JSON', 'Export dropin: export format', 'simple-history') ?>
</label>
</p>
<p>
<label>
<input type="radio" name="format" value="csv">
<?php _ex('CSV', 'Export dropin: export format', 'simple-history') ?>
</label>
</p>
<!-- <br> -->
<!--<label>
<input type="radio" name="format" value="html">
HTML
</label>
<br> -->
<!-- <label>
<input type="radio" name="format" value="xml">
XML
</label> -->
<p>
<button type="submit" class="button button-primary"><?php _ex('Download Export File', 'Export dropin: submit button', 'simple-history') ?></button>
<input type="hidden" name="simple-history-action" value="export-history">
</p>
<?php
wp_nonce_field(__CLASS__ . '-action-export');
?>
</form>
<?php
}
}