Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,26 @@ function custom_tickets_additional_fields( $ticket_fields ) {
'description' => esc_html__( 'Insert the youtube embed of the video they have access to when they purchase the ticket.' ),
];

$ticket_fields['event_date'] = [
'type' => 'date',
'label' => esc_html__( 'Event date' ),
'description' => esc_html__( 'Insert the event date.' ),
];

$ticket_fields['event_type'] = [
'type' => 'select',
'label' => esc_html__( 'Event type' ),
'description' => esc_html__( 'Choose the event type.' ),
// value => label
'options' => [
'workshop' => esc_html__( 'Workshop' ),
'course' => esc_html__( 'Course'),
'webinar' => esc_html__( 'Webinar'),
],
// optional:
'placeholder' => esc_html__( 'Please choose…' ),
];

return $ticket_fields;
}

Expand Down Expand Up @@ -117,3 +137,5 @@ function my_custom_additional_field_shortcode_printing( $html, $ticket_id, $fiel
* `email` - Email (when being printed for the shortcode will add the HTML for the email link).
* `number` - Number.
* `checkbox` - Checkbox.
* `date` - HTML5 Date selector.
* `select` - Dropdown select. Requires an `options` array with `value => label` pairs.
76 changes: 76 additions & 0 deletions src/Tribe/Shortcodes/Tribe_Tickets_Additional_Field.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ public function get_additional_field( $ticket, $field ) {
case 'email':
$html = $this->get_email_render( $ticket_id, $field );
break;
case 'date':
$html = $this->get_date_render( $ticket_id, $field );
break;
case 'select':
$html = $this->get_select_render( $ticket_id, $field );
break;
default:
$html = $meta->get_field_value( $ticket_id, $meta->get_field_id( $field ), true );
}
Expand Down Expand Up @@ -132,4 +138,74 @@ public function get_email_render( $ticket_id, $field ) {
return '<a href="mailto:' . $email . '">' . $email . '</a>';
}

/**
* Gets the additional render, when it's Date type
*
* @param WP_Post|int $ticket the post/event we're viewing.
* @param string $field_id the additional field we want to retrieve.
*
* @return string The resulting HTML.
*/
public function get_date_render( $ticket_id, $field ) {
$meta = tribe( 'tickets.additional-fields.fields' );
$value = $meta->get_field_value( $ticket_id, $meta->get_field_id( $field ), true );
$value = is_string( $value ) ? trim( $value ) : '';

if ( $value !== '' && preg_match( '/^\d{4}-\d{2}-\d{2}$/', $value ) ) {
try {
$dt = new \DateTimeImmutable( $value, wp_timezone() );
$format = apply_filters( 'tribe_ext_tickets_additional_fields_date_display_format', 'd.m.Y' );
return esc_html( $dt->format( $format ) );
} catch ( \Exception $e ) {
return esc_html( $value );
}
} else {
return esc_html( $value );
}
}

/**
* Gets the additional render, when it's Select type.
*
* @param int|WP_Post $ticket The ticket.
* @param string $field Field key.
*
* @return string
*/
public function get_select_render( $ticket_id, $field ) {
$meta = tribe( 'tickets.additional-fields.fields' );

$field_id = $meta->get_field_id( $field );
$value = $meta->get_field_value( $ticket_id, $field_id, true );
$value = is_string( $value ) ? trim( $value ) : '';

if ( $value === '' ) {
return '';
}

// Feld-Definitionen über den bekannten Filter holen.
$fields = apply_filters( 'tribe_ext_tickets_additional_fields', [] );

if ( isset( $fields[ $field ]['options'][ $value ] ) ) {
$label = $fields[ $field ]['options'][ $value ]; // Label aus options
} else {
$label = $value; // Fallback: Key direkt
}

/**
* Filter the output of select field additional field.
*/
$label = apply_filters(
'tribe_ext_tickets_additional_fields_select_display',
$label,
$ticket_id,
$field,
$value
);

return esc_html( (string) $label );
}



}
32 changes: 32 additions & 0 deletions src/admin-views/editor/input-date.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php
/**
* Date input for Additional Ticket Field type "date".
*
* @var WP_Post $post
* @var array $field_data The field data.
* @var string $field_id The field ID.
* @var string $field_value The field value.
*/
if ( ! defined( 'ABSPATH' ) ) { exit; }

?>
<div class="tribe-ext-tickets-af-field tribe-ext-tickets-af-field--date">
<?php if ( ! empty( $field_data['label'] ) ) : ?>
<label for="<?php echo esc_attr( $field_id ); ?> class="ticket_form_label ticket_form_left"">
<?php echo esc_html( $field_data['label'] ); ?>
</label>
<?php endif; ?>

<input
id="<?php echo esc_attr( $field_id ); ?>"
class="regular-text ticket_field ticket_form_right"
type="date"
name="<?php echo esc_attr( $field_id ); ?>"
value="<?php echo esc_attr( $field_value ); ?>"
placeholder="YYYY-MM-DD"
/>

<?php if ( ! empty( $field_data['description'] ) ) : ?>
<p class="description"><?php echo esc_html( $field_data['description'] ); ?></p>
<?php endif; ?>
</div>
62 changes: 62 additions & 0 deletions src/admin-views/editor/input-select.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php
/**
* Select input for Additional Ticket Field type "select".
*
* @var WP_Post $post
* @var array $field_data The field data.
* @var string $field_id The field ID.
* @var string $field_value The field value.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}

// Optionen erwarten wir als value => label.
$options = [];
if ( ! empty( $field_data['options'] ) && is_array( $field_data['options'] ) ) {
$options = $field_data['options'];
}
?>
<div class="tribe-ext-tickets-af-field tribe-ext-tickets-af-field--select">
<?php if ( ! empty( $field_data['label'] ) ) : ?>
<label
for="<?php echo esc_attr( $field_id ); ?>"
class="ticket_form_label ticket_form_left"
>
<?php echo esc_html( $field_data['label'] ); ?>
</label>
<?php endif; ?>

<select
id="<?php echo esc_attr( $field_id ); ?>"
name="<?php echo esc_attr( $field_id ); ?>"
class="ticket_field ticket_form_right"
>
<?php
// Optional: leere Option vorne.
if ( ! empty( $field_data['placeholder'] ) ) :
?>
<option value="">
<?php echo esc_html( $field_data['placeholder'] ); ?>
</option>
<?php
endif;

foreach ( $options as $value => $label ) :
$value = (string) $value;
?>
<option
value="<?php echo esc_attr( $value ); ?>"
<?php selected( $field_value, $value ); ?>
>
<?php echo esc_html( $label ); ?>
</option>
<?php endforeach; ?>
</select>

<?php if ( ! empty( $field_data['description'] ) ) : ?>
<p class="description">
<?php echo esc_html( $field_data['description'] ); ?>
</p>
<?php endif; ?>
</div>