eventbrite-for-the-events-c.../includes/class-eb4tec-qr-code.php
Laurence Horrocks-Barlow f3bc795d9a Initial release of Eventbrite for The Events Calendar (v1.0.0)
Bidirectional sync between Eventbrite and The Events Calendar, with
WooCommerce ticket purchasing that bypasses Eventbrite's processing
fees by registering buyers as free attendees via API. Includes venue/
organizer sync, QR code ticket generation, attendee management with
CSV export, scheduled sync via WP-Cron, and real-time Eventbrite
webhooks.
2026-05-17 08:48:04 +01:00

77 lines
2.2 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
final class EB4TEC_QR_Code {
public function generate( string $data, int $size = 0 ): string|WP_Error {
if ( $size <= 0 ) {
$size = (int) get_option( 'eb4tec_qr_size', 200 );
}
$hash = md5( $data );
$uploads = wp_upload_dir();
$dir = trailingslashit( $uploads['basedir'] ) . 'eb4tec-qr/';
$file = $dir . $hash . '.png';
$url = trailingslashit( $uploads['baseurl'] ) . 'eb4tec-qr/' . $hash . '.png';
if ( file_exists( $file ) ) {
return $url;
}
// Create directory if needed.
if ( ! wp_mkdir_p( $dir ) ) {
return new WP_Error( 'eb4tec_qr_dir', __( 'Could not create QR code directory.', 'eb4tec' ) );
}
// Fetch from Google Chart API (no API key required for QR endpoint).
$api_url = add_query_arg( [
'cht' => 'qr',
'chs' => "{$size}x{$size}",
'chl' => rawurlencode( $data ),
'choe' => 'UTF-8',
], 'https://chart.googleapis.com/chart' );
$response = wp_remote_get( $api_url, [ 'timeout' => 15 ] );
if ( is_wp_error( $response ) ) {
return $response;
}
$code = wp_remote_retrieve_response_code( $response );
if ( $code !== 200 ) {
return new WP_Error( 'eb4tec_qr_fetch', __( 'QR code generation failed.', 'eb4tec' ), [ 'status' => $code ] );
}
$body = wp_remote_retrieve_body( $response );
// phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
if ( false === file_put_contents( $file, $body ) ) {
return new WP_Error( 'eb4tec_qr_write', __( 'Could not save QR code image.', 'eb4tec' ) );
}
return $url;
}
public function get_attendee_qr_data( string $attendee_id, string $order_id, string $event_id ): string {
return "EB4TEC:{$attendee_id}:{$order_id}:{$event_id}";
}
public function render_qr_html( string $url, string $attendee_id = '', int $size = 0 ): string {
if ( $size <= 0 ) {
$size = (int) get_option( 'eb4tec_qr_size', 200 );
}
$alt = $attendee_id
? sprintf( __( 'Ticket QR code for attendee %s', 'eb4tec' ), esc_attr( $attendee_id ) )
: __( 'Ticket QR code', 'eb4tec' );
return sprintf(
'<img src="%s" alt="%s" width="%d" height="%d" class="eb4tec-qr-code" style="display:block;margin:8px 0;">',
esc_url( $url ),
esc_attr( $alt ),
$size,
$size
);
}
}