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.
77 lines
2.2 KiB
PHP
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
|
|
);
|
|
}
|
|
}
|