Files
roi-theme/wp-content/plugins/wp-marketing-automations/includes/class-bwfan-dev-get-broadcast-timing.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

200 lines
7.5 KiB
PHP
Executable File

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
if ( ! class_exists( 'BWFAN_DEV_Get_Broadcast_Timing' ) ) {
final class BWFAN_DEV_Get_Broadcast_Timing {
private static $ins = null;
public function __construct() {
add_action( 'admin_head', [ $this, 'broadcast_details' ] );
}
public static function get_instance() {
if ( null === self::$ins ) {
self::$ins = new self();
}
return self::$ins;
}
public function broadcast_details() {
$bid = filter_input( INPUT_GET, 'admin_broadcast_id' );
if ( empty( $bid ) ) {
return;
}
$this->output_css();
$data = $this->get_broadcast_timing( $bid );
if ( empty( $data ) ) {
echo "<h3>No Broadcast details found.</h3>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit;
}
$start_time = ! empty( $data['start_time'] ) ? "Start time: " . $data['start_time'] : '';
if ( empty( $start_time ) ) {
echo "<h3>Broadcast not started yet.</h3>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit;
}
$end_time = ! empty( $data['start_time'] ) ? "End time: " . $data['end_time'] : '';
if ( empty( $end_time ) ) {
echo "<h3>Broadcast is not finished yet.</h3>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit;
}
$total_sent = ! empty( $data['sent'] ) ? "Total sent: " . $data['sent'] : '';
if ( empty( $total_sent ) ) {
echo "<h3>No emails sent yet.</h3>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
exit;
}
$total_time = strtotime( $data['end_time'] ) - strtotime( $data['start_time'] );
$per_sec = ( $total_time > 0 && $data['sent'] > 0 ) ? absint( $data['sent'] ) / $total_time : $data['sent'];
echo '<div class="broadcast_data_wrapper"><div class="broadcast_data"><div> '; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "$start_time<br>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "$end_time<br>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "$total_sent<br>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "Total time in secs: "; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo ( ! empty( $total_time ) ) ? $total_time : 1; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "<br>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
if ( ! empty( $total_time ) && ( $total_time > 60 ) ) {
echo "Total time in mins: " . intval( $total_time / 60 ) . "<br>";
}
echo "Emails in one second: $per_sec"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "<h3>Per second breakup</h3> </div>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$data = $this->get_broadcast_details( $bid );
echo '<div class="broadcast_table">'; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "<div><div>Date Time</div><div>Count</div></div>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$diff_start = '';
$diff_array = [];
foreach ( $data as $v ) {
if ( ! empty( $diff_start ) && ! empty( $v['created_at'] ) ) {
$startd = strtotime( $diff_start );
$endd = strtotime( $v['created_at'] );
$diff = $startd - $endd;
if ( ! empty( $diff ) && ( $diff > 1 ) ) {
$startd = $startd - 1;
$endd = $endd + 1;
$resdata = [
'difference' => $diff - 1,
'end_time' => '-',
];
if ( $startd !== $endd ) {
$resdata['end_time'] = date( 'Y-m-d H:i:s', $startd );
$resdata['start_time'] = date( 'Y-m-d H:i:s', $endd );
} else {
$resdata['start_time'] = date( 'Y-m-d H:i:s', $startd );
}
$diff_array[] = $resdata;
}
}
$diff_start = $v['created_at'];
echo "<div><div>{$v['created_at']}</div><div>{$v['count']}</div></div>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
echo '</div>'; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo '</div>'; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
if ( ! empty( $diff_array ) ) {
echo '<table class="broadcast_table_idel"><tbody>'; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo "<tr><td><b>Start Time</b></td><td><b>End Time</b></td><td><b>Time ( in sec )</b></td></tr>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
foreach ( $diff_array as $v ) {
echo "<tr><td>{$v['start_time']}</td><td>{$v['end_time']}</td><td>{$v['difference']}</td></tr>"; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
echo '</tbody></table>'; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
echo '</div>';
exit;
}
public function get_broadcast_timing( $oid ) {
global $wpdb;
$query = "SELECT MAX( created_at ) as end_time, MIN( created_at ) as start_time, COUNT( ID ) as sent FROM {$wpdb->prefix}bwfan_engagement_tracking WHERE `oid` = %d and `type` = %d";
return $wpdb->get_row( $wpdb->prepare( $query, $oid, 2 ), ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL
}
public function get_broadcast_details( $oid ) {
global $wpdb;
$limit = isset( $_GET['limit'] ) ? (int) $_GET['limit'] : 100;
$page = isset( $_GET['apage'] ) ? (int) $_GET['apage'] : 0;
$offset = ( 0 !== $page ) ? ( $page - 1 ) * $limit : 0;
$limit_query = " LIMIT 0, 100";
if ( ! empty( $limit ) ) {
$limit_query = " LIMIT {$offset}, {$limit}";
}
$query = "SELECT `created_at`, count(`created_at`) as `count` FROM `{$wpdb->prefix}bwfan_engagement_tracking` WHERE `type` = %d AND `oid` = %d GROUP BY `created_at` ORDER BY `created_at` DESC $limit_query";
return $wpdb->get_results( $wpdb->prepare( $query, 2, $oid ), ARRAY_A ); //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL
}
public function output_css() {
?>
<style>
h3 {
margin: 20px;
}
.broadcast_data_wrapper {
display: flex;
flex-wrap: wrap;
}
.broadcast_data {
padding: 20px;
font-size: 16px;
line-height: 2;
}
.broadcast_table {
width: 500px;
line-height: 2;
}
.broadcast_table > div {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
table.broadcast_table_idel {
border: 1px solid #ccc;
border-collapse: collapse;
font-size: 16px;
line-height: 1;
table-layout: fixed;
height: fit-content;
}
table.broadcast_table_idel, table.broadcast_table_idel tbody {
line-height: 1;
}
table.broadcast_table_idel tr {
height: 36px;
}
table.broadcast_table_idel td {
border-bottom: 1px solid #ccc;
min-width: 200px;
padding: 5px;
line-height: 1;
height: 36px;
}
</style>
<?php
}
}
BWFAN_DEV_Get_Broadcast_Timing::get_instance();
}