Compare commits
No commits in common. "custom_summary" and "main" have entirely different histories.
custom_sum
...
main
13 changed files with 36 additions and 559 deletions
|
@ -75,12 +75,6 @@ jobs:
|
||||||
if: steps.cache-wordpress.outputs.cache-hit != 'false'
|
if: steps.cache-wordpress.outputs.cache-hit != 'false'
|
||||||
run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wordpress-version }} false true true true
|
run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 ${{ matrix.wordpress-version }} false true true true
|
||||||
|
|
||||||
|
|
||||||
- name: Run General Tests
|
|
||||||
run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=activitypub_event_bridge
|
|
||||||
env:
|
|
||||||
PHP_VERSION: ${{ matrix.php-version }}
|
|
||||||
|
|
||||||
- name: Run Integration tests for The Events Calendar
|
- name: Run Integration tests for The Events Calendar
|
||||||
run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=the_events_calendar
|
run: cd /workspace/Event-Federation/wordpress-activitypub-event-bridge/ && ./vendor/bin/phpunit --filter=the_events_calendar
|
||||||
env:
|
env:
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Plugin Name: ActivityPub Event Bridge
|
* Plugin Name: ActivityPub Event Bridge
|
||||||
* Description: Integrating popular event plugins with the ActivityPub plugin.
|
* Description: Integrating popular event plugins with the ActivityPub plugin.
|
||||||
* Plugin URI: https://event-federation.eu/
|
* Plugin URI: https://event-federation.eu/
|
||||||
* Version: 0.2.1.4
|
* Version: 0.2.1
|
||||||
* Author: André Menrath
|
* Author: André Menrath
|
||||||
* Author URI: https://graz.social/@linos
|
* Author URI: https://graz.social/@linos
|
||||||
* Text Domain: activitypub-event-bridge
|
* Text Domain: activitypub-event-bridge
|
||||||
|
@ -27,8 +27,6 @@ define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
||||||
define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_VERSION', current( get_file_data( __FILE__, array( 'Version' ), 'plugin' ) ) );
|
define( 'ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_VERSION', current( get_file_data( __FILE__, array( 'Version' ), 'plugin' ) ) );
|
||||||
define( 'ACTIVITYPUB_EVENT_BRIDGE_DOMAIN', 'activitypub-event-bridge' );
|
define( 'ACTIVITYPUB_EVENT_BRIDGE_DOMAIN', 'activitypub-event-bridge' );
|
||||||
define( 'ACTIVITYPUB_EVENT_BRIDGE_ACTIVITYPUB_PLUGIN_MIN_VERSION', '3.2.2' );
|
define( 'ACTIVITYPUB_EVENT_BRIDGE_ACTIVITYPUB_PLUGIN_MIN_VERSION', '3.2.2' );
|
||||||
define( 'ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY', "<ul>\n <li>[ap_start_time]</li>\n <li>[ap_end_time]</li>\n <li>[ap_location]</li>\n</ul>\n[ap_hashcats][ap_hashtags]" );
|
|
||||||
define( 'ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE', 'preset' );
|
|
||||||
|
|
||||||
// Include and register the autoloader class for automatic loading of plugin classes.
|
// Include and register the autoloader class for automatic loading of plugin classes.
|
||||||
require_once ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_DIR . '/includes/class-autoloader.php';
|
require_once ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_DIR . '/includes/class-autoloader.php';
|
||||||
|
|
|
@ -177,7 +177,3 @@ code.activitypub-event-bridge-settings-example-url {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
#activitypub_summary_type_custom-details {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
|
@ -11,23 +11,4 @@ jQuery( function( $ ) {
|
||||||
$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
|
$( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Function to toggle visibility of custom details based on selected radio button.
|
|
||||||
function toggleCustomDetailsForSummary() {
|
|
||||||
if ($("#activitypub_summary_type_custom").is(':checked')) {
|
|
||||||
$("#activitypub_summary_type_custom-details").show();
|
|
||||||
} else {
|
|
||||||
$("#activitypub_summary_type_custom-details").hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the toggle function on page load.
|
|
||||||
$(document).ready(function() {
|
|
||||||
toggleCustomDetailsForSummary(); // Set the correct state on load.
|
|
||||||
|
|
||||||
// Listen for changes on the radio buttons
|
|
||||||
$("input[name=activitypub_summary_type]").change(function() {
|
|
||||||
toggleCustomDetailsForSummary(); // Update visibility on change.
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} );
|
} );
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
],
|
],
|
||||||
"test-debug": [
|
"test-debug": [
|
||||||
"@prepare-test",
|
"@prepare-test",
|
||||||
"@test-activitypub-event-bridge-shortcodes"
|
"@test-gatherpress"
|
||||||
],
|
],
|
||||||
"test-vs-event-list": "phpunit --filter=vs_event_list",
|
"test-vs-event-list": "phpunit --filter=vs_event_list",
|
||||||
"test-the-events-calendar": "phpunit --filter=the_events_calendar",
|
"test-the-events-calendar": "phpunit --filter=the_events_calendar",
|
||||||
|
@ -67,7 +67,6 @@
|
||||||
"test-wp-event-manager": "phpunit --filter=wp_event_manager",
|
"test-wp-event-manager": "phpunit --filter=wp_event_manager",
|
||||||
"test-eventin": "phpunit --filter=eventin",
|
"test-eventin": "phpunit --filter=eventin",
|
||||||
"test-modern-events-calendar-lite": "phpunit --filter=modern_events_calendar_lite",
|
"test-modern-events-calendar-lite": "phpunit --filter=modern_events_calendar_lite",
|
||||||
"test-activitypub-event-bridge-shortcodes": "phpunit --filter=activitypub_event_bridge_shortcodes",
|
|
||||||
"test-all": "phpunit"
|
"test-all": "phpunit"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,7 @@ defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore
|
||||||
|
|
||||||
use Activitypub\Activity\Extended_Object\Event as Event_Object;
|
use Activitypub\Activity\Extended_Object\Event as Event_Object;
|
||||||
use Activitypub\Activity\Extended_Object\Place;
|
use Activitypub\Activity\Extended_Object\Place;
|
||||||
use Activitypub\Shortcodes;
|
|
||||||
use Activitypub\Transformer\Post;
|
use Activitypub\Transformer\Post;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -150,14 +148,14 @@ abstract class Event extends Post {
|
||||||
*
|
*
|
||||||
* This is mandatory and must be implemented in the final event transformer class.
|
* This is mandatory and must be implemented in the final event transformer class.
|
||||||
*/
|
*/
|
||||||
abstract public function get_start_time(): string;
|
abstract protected function get_start_time(): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the end time.
|
* Get the end time.
|
||||||
*
|
*
|
||||||
* This is not mandatory and therefore just return null by default.
|
* This is not mandatory and therefore just return null by default.
|
||||||
*/
|
*/
|
||||||
public function get_end_time(): ?string {
|
protected function get_end_time(): ?string {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,14 +164,14 @@ abstract class Event extends Post {
|
||||||
*
|
*
|
||||||
* This should be overridden in the actual event transformer.
|
* This should be overridden in the actual event transformer.
|
||||||
*/
|
*/
|
||||||
public function get_location(): ?Place {
|
protected function get_location(): ?Place {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default value for the event status.
|
* Default value for the event status.
|
||||||
*/
|
*/
|
||||||
public function get_status(): ?string {
|
protected function get_status(): ?string {
|
||||||
return 'CONFIRMED';
|
return 'CONFIRMED';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +194,7 @@ abstract class Event extends Post {
|
||||||
*
|
*
|
||||||
* @param ?string $time The time which needs to be formatted.
|
* @param ?string $time The time which needs to be formatted.
|
||||||
*/
|
*/
|
||||||
protected static function format_time( $time ) {
|
private static function format_time( $time ) {
|
||||||
if ( is_null( $time ) ) {
|
if ( is_null( $time ) ) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@ -207,160 +205,24 @@ abstract class Event extends Post {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates output for the 'ap_start_time' shortcode.
|
* Format a human readable address.
|
||||||
*
|
|
||||||
* @param ?array $atts The shortcode's attributes.
|
|
||||||
* @return string The formatted start date and time of the event.
|
|
||||||
*/
|
*/
|
||||||
public function shortcode_start_time( $atts ) {
|
protected function format_address(): string {
|
||||||
$start_timestamp = $this->get_start_time();
|
|
||||||
return $this->generate_time_output( $start_timestamp, $atts, '🗓️', __( 'Start', 'activitypub-event-bridge' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates output for the 'ap_end_time' shortcode.
|
|
||||||
*
|
|
||||||
* @param ?array $atts The shortcode's attributes.
|
|
||||||
* @return string The formatted end date and time of the event.
|
|
||||||
*/
|
|
||||||
public function shortcode_end_time( $atts ) {
|
|
||||||
$end_timestamp = $this->get_end_time();
|
|
||||||
return $this->generate_time_output( $end_timestamp, $atts, '⏳', __( 'End', 'activitypub-event-bridge' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the formatted time output for a shortcode.
|
|
||||||
*
|
|
||||||
* @param int|null $timestamp The timestamp for the event time.
|
|
||||||
* @param array $atts The shortcode attributes.
|
|
||||||
* @param string $icon The icon to display.
|
|
||||||
* @param string $label The label to display (e.g., 'Start', 'End').
|
|
||||||
* @return string The formatted date and time, or an empty string if the timestamp is invalid.
|
|
||||||
*/
|
|
||||||
private function generate_time_output( $timestamp, $atts, $icon, $label ) {
|
|
||||||
if ( ! $timestamp ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$args = shortcode_atts(
|
|
||||||
array(
|
|
||||||
'icon' => 'true',
|
|
||||||
'label' => 'true',
|
|
||||||
),
|
|
||||||
$atts
|
|
||||||
);
|
|
||||||
|
|
||||||
$args['icon'] = filter_var( $args['icon'], FILTER_VALIDATE_BOOLEAN );
|
|
||||||
$args['label'] = filter_var( $args['label'], FILTER_VALIDATE_BOOLEAN );
|
|
||||||
|
|
||||||
$output = array();
|
|
||||||
|
|
||||||
if ( $args['icon'] ) {
|
|
||||||
$output[] = $icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $args['label'] ) {
|
|
||||||
$output[] = $label . ':';
|
|
||||||
}
|
|
||||||
|
|
||||||
$output[] = self::format_time( $timestamp );
|
|
||||||
|
|
||||||
return implode( ' ', $output );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates output for the 'ap_location' shortcode.
|
|
||||||
*
|
|
||||||
* @param ?array $atts The shortcode's attributes.
|
|
||||||
* @return string The formatted location/address of the event.
|
|
||||||
*/
|
|
||||||
public function shortcode_location( $atts ) {
|
|
||||||
$args = shortcode_atts(
|
|
||||||
array(
|
|
||||||
'icon' => 'true',
|
|
||||||
'label' => 'true',
|
|
||||||
'country' => 'true',
|
|
||||||
'zip' => 'true',
|
|
||||||
'city' => 'true',
|
|
||||||
'street' => 'true',
|
|
||||||
'name' => 'true',
|
|
||||||
),
|
|
||||||
$atts,
|
|
||||||
'ap_location'
|
|
||||||
);
|
|
||||||
|
|
||||||
// Convert attributes to booleans.
|
|
||||||
$args = array_map(
|
|
||||||
function ( $value ) {
|
|
||||||
return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
|
|
||||||
},
|
|
||||||
$args
|
|
||||||
);
|
|
||||||
|
|
||||||
$location = $this->get_location();
|
$location = $this->get_location();
|
||||||
if ( ! $location ) {
|
if ( is_null( $location ) ) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
$address = $location->get_address();
|
||||||
$output = array();
|
if ( ! $address ) {
|
||||||
if ( $args['icon'] ) {
|
return $location->get_name();
|
||||||
$output[] = '📍';
|
|
||||||
}
|
}
|
||||||
if ( $args['label'] ) {
|
|
||||||
$output[] = esc_html__( 'Location', 'activitypub-event-bridge' ) . ':';
|
|
||||||
}
|
|
||||||
|
|
||||||
$output[] = self::format_address( $location->get_address(), $args );
|
|
||||||
|
|
||||||
// Join output array into a single string with spaces and return.
|
|
||||||
return implode( ' ', array_filter( $output ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Formats the address based on provided arguments.
|
|
||||||
*
|
|
||||||
* @param mixed $address The address data, either as a string or an array.
|
|
||||||
* @param array $args The arguments for which components to include.
|
|
||||||
* @return string The formatted address.
|
|
||||||
*/
|
|
||||||
protected static function format_address( $address, $args = null ) {
|
|
||||||
if ( is_string( $address ) ) {
|
if ( is_string( $address ) ) {
|
||||||
return esc_html( $address );
|
return $address;
|
||||||
}
|
}
|
||||||
|
if ( ! is_array( $address ) ) {
|
||||||
if ( is_null( $args ) ) {
|
return '';
|
||||||
$args = array(
|
|
||||||
'icon' => 'true',
|
|
||||||
'title' => 'true',
|
|
||||||
'country' => 'true',
|
|
||||||
'zip' => 'true',
|
|
||||||
'city' => 'true',
|
|
||||||
'street' => 'true',
|
|
||||||
'name' => 'true',
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
return isset( $address['locality'] ) ? $address['locality'] : '';
|
||||||
if ( is_array( $address ) ) {
|
|
||||||
$address_parts = array();
|
|
||||||
|
|
||||||
$components = array(
|
|
||||||
'name' => 'name',
|
|
||||||
'street' => 'streetAddress',
|
|
||||||
'zip' => 'postalCode',
|
|
||||||
'city' => 'addressLocality',
|
|
||||||
'country' => 'addressCountry',
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( $components as $arg_key => $address_key ) {
|
|
||||||
if ( $args[ $arg_key ] && ! empty( $address[ $address_key ] ) ) {
|
|
||||||
$address_parts[] = esc_html( $address[ $address_key ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return implode( ', ', $address_parts );
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -393,68 +255,6 @@ abstract class Event extends Post {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the shortcodes.
|
|
||||||
*/
|
|
||||||
public function register_shortcodes() {
|
|
||||||
foreach ( get_class_methods( self::class ) as $function ) {
|
|
||||||
if ( 'shortcode_' === substr( $function, 0, 10 ) ) {
|
|
||||||
add_shortcode( 'ap_' . substr( $function, 10, strlen( $function ) ), array( $this, $function ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the shortcodes.
|
|
||||||
*/
|
|
||||||
public function unregister_shortcodes() {
|
|
||||||
foreach ( get_class_methods( self::class ) as $function ) {
|
|
||||||
if ( 'shortcode_' === substr( $function, 0, 10 ) ) {
|
|
||||||
remove_shortcode( 'ap_' . substr( $function, 10, strlen( $function ) ), array( $this, $function ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the summary.
|
|
||||||
*/
|
|
||||||
public function get_summary(): ?string {
|
|
||||||
if ( 'preset' === get_option( 'activitypub_summary_type', 'preset' ) ) {
|
|
||||||
return $this->format_preset_summary();
|
|
||||||
}
|
|
||||||
|
|
||||||
// phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
|
|
||||||
$post = $this->wp_object;
|
|
||||||
$summary = $this->get_event_summary_template();
|
|
||||||
|
|
||||||
// It seems that shortcodes are only applied to published posts.
|
|
||||||
if ( is_preview() ) {
|
|
||||||
$post->post_status = 'publish';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register our shortcodes just in time.
|
|
||||||
|
|
||||||
Shortcodes::register();
|
|
||||||
$this->register_shortcodes();
|
|
||||||
|
|
||||||
// Fill in the shortcodes.
|
|
||||||
\setup_postdata( $post );
|
|
||||||
$summary = \do_shortcode( $summary );
|
|
||||||
\wp_reset_postdata();
|
|
||||||
|
|
||||||
$summary = \wpautop( $summary );
|
|
||||||
$summary = \preg_replace( '/[\n\r\t]/', '', $summary );
|
|
||||||
$summary = \trim( $summary );
|
|
||||||
|
|
||||||
$summary = \apply_filters( 'activitypub_event_bridge_the_summary', $summary, $post );
|
|
||||||
|
|
||||||
// Unregister the shortcodes.
|
|
||||||
Shortcodes::unregister();
|
|
||||||
$this->unregister_shortcodes();
|
|
||||||
|
|
||||||
return $summary;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a custom summary.
|
* Create a custom summary.
|
||||||
*
|
*
|
||||||
|
@ -463,7 +263,7 @@ abstract class Event extends Post {
|
||||||
*
|
*
|
||||||
* @return string $summary The custom event summary.
|
* @return string $summary The custom event summary.
|
||||||
*/
|
*/
|
||||||
public function format_preset_summary(): ?string {
|
public function get_summary(): ?string {
|
||||||
add_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ), 2, 2 );
|
add_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ), 2, 2 );
|
||||||
$excerpt = $this->retrieve_excerpt();
|
$excerpt = $this->retrieve_excerpt();
|
||||||
// BeforeFirstRelease: decide whether this should be a admin setting.
|
// BeforeFirstRelease: decide whether this should be a admin setting.
|
||||||
|
@ -474,13 +274,9 @@ abstract class Event extends Post {
|
||||||
remove_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ) );
|
remove_filter( 'activitypub_object_content_template', array( self::class, 'remove_ap_permalink_from_template' ) );
|
||||||
|
|
||||||
$category = $this->format_categories();
|
$category = $this->format_categories();
|
||||||
$start_time = $this->get_start_time();
|
$start_time = $this->format_start_time();
|
||||||
$end_time = $this->get_end_time();
|
$end_time = $this->format_end_time();
|
||||||
$address = $this->format_address( $this->get_location() );
|
$address = $this->format_address();
|
||||||
$time_atts = array(
|
|
||||||
'icon' => true,
|
|
||||||
'label' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
$formatted_items = array();
|
$formatted_items = array();
|
||||||
if ( ! empty( $category ) ) {
|
if ( ! empty( $category ) ) {
|
||||||
|
@ -488,11 +284,11 @@ abstract class Event extends Post {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $start_time ) ) {
|
if ( ! empty( $start_time ) ) {
|
||||||
$formatted_items[] = $this->generate_time_output( $start_time, $time_atts, '🗓️', __( 'Start', 'activitypub-event-bridge' ) );
|
$formatted_items[] = '🗓️ ' . __( 'Start', 'activitypub-event-bridge' ) . ': ' . $start_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $end_time ) ) {
|
if ( ! empty( $end_time ) ) {
|
||||||
$formatted_items[] = $this->generate_time_output( $end_time, $time_atts, '⏳', __( 'End', 'activitypub-event-bridge' ) );
|
$formatted_items[] = '⏳ ' . __( 'End', 'activitypub-event-bridge' ) . ': ' . $end_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $address ) ) {
|
if ( ! empty( $address ) ) {
|
||||||
|
@ -512,18 +308,6 @@ abstract class Event extends Post {
|
||||||
return $summary;
|
return $summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the template to use to generate the summary of the ActivityStreams representation of an event post.
|
|
||||||
*
|
|
||||||
* @return string The Template.
|
|
||||||
*/
|
|
||||||
protected function get_event_summary_template() {
|
|
||||||
$summary = \get_option( 'activitypub_event_bridge_custom_summary', ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY );
|
|
||||||
$template = $summary ?? ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY;
|
|
||||||
|
|
||||||
return apply_filters( 'activitypub_event_bridge_summary_template', $template, $this->wp_object );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* By default set the timezone of the WordPress site.
|
* By default set the timezone of the WordPress site.
|
||||||
*
|
*
|
||||||
|
|
|
@ -73,14 +73,14 @@ final class GatherPress extends Event {
|
||||||
/**
|
/**
|
||||||
* Get the end time from the event object.
|
* Get the end time from the event object.
|
||||||
*/
|
*/
|
||||||
public function get_end_time(): ?string {
|
protected function get_end_time(): ?string {
|
||||||
return $this->gp_event->get_datetime_end( 'Y-m-d\TH:i:s\Z' );
|
return $this->gp_event->get_datetime_end( 'Y-m-d\TH:i:s\Z' );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the end time from the event object.
|
* Get the end time from the event object.
|
||||||
*/
|
*/
|
||||||
public function get_start_time(): string {
|
protected function get_start_time(): string {
|
||||||
return $this->gp_event->get_datetime_start( 'Y-m-d\TH:i:s\Z' );
|
return $this->gp_event->get_datetime_start( 'Y-m-d\TH:i:s\Z' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ final class The_Events_Calendar extends Event {
|
||||||
/**
|
/**
|
||||||
* Get the end time from the event object.
|
* Get the end time from the event object.
|
||||||
*/
|
*/
|
||||||
public function get_end_time(): ?string {
|
protected function get_end_time(): ?string {
|
||||||
if ( empty( $this->tribe_event->end_date ) ) {
|
if ( empty( $this->tribe_event->end_date ) ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ final class The_Events_Calendar extends Event {
|
||||||
/**
|
/**
|
||||||
* Get the end time from the event object.
|
* Get the end time from the event object.
|
||||||
*/
|
*/
|
||||||
public function get_start_time(): string {
|
protected function get_start_time(): string {
|
||||||
$date = date_create( $this->tribe_event->start_date, wp_timezone() );
|
$date = date_create( $this->tribe_event->start_date, wp_timezone() );
|
||||||
return \gmdate( 'Y-m-d\TH:i:s\Z', $date->getTimestamp() );
|
return \gmdate( 'Y-m-d\TH:i:s\Z', $date->getTimestamp() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ final class VS_Event_List extends Event_Transformer {
|
||||||
/**
|
/**
|
||||||
* Get the end time from the events metadata.
|
* Get the end time from the events metadata.
|
||||||
*/
|
*/
|
||||||
public function get_end_time(): ?string {
|
protected function get_end_time(): ?string {
|
||||||
if ( 'yes' === get_post_meta( $this->wp_object->ID, 'event-hide-end-time', true ) ) {
|
if ( 'yes' === get_post_meta( $this->wp_object->ID, 'event-hide-end-time', true ) ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ final class VS_Event_List extends Event_Transformer {
|
||||||
/**
|
/**
|
||||||
* Get the end time from the events metadata.
|
* Get the end time from the events metadata.
|
||||||
*/
|
*/
|
||||||
public function get_start_time(): string {
|
protected function get_start_time(): string {
|
||||||
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
|
$start_time = get_post_meta( $this->wp_object->ID, 'event-start-date', true );
|
||||||
return \gmdate( 'Y-m-d\TH:i:s\Z', $start_time );
|
return \gmdate( 'Y-m-d\TH:i:s\Z', $start_time );
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,28 +71,6 @@ class Settings {
|
||||||
'default' => 1,
|
'default' => 1,
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
\register_setting(
|
|
||||||
'activitypub-event-bridge',
|
|
||||||
'activitypub_summary_type',
|
|
||||||
array(
|
|
||||||
'type' => 'string',
|
|
||||||
'description' => \__( 'Summary type to use for ActivityStreams', 'activitypub-event-bridge' ),
|
|
||||||
'show_in_rest' => true,
|
|
||||||
'default' => 'preset',
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
\register_setting(
|
|
||||||
'activitypub-event-bridge',
|
|
||||||
'activitypub_event_bridge_custom_summary',
|
|
||||||
array(
|
|
||||||
'type' => 'string',
|
|
||||||
'description' => \__( 'Define your own custom summary template for events', 'activitypub-event-bridge' ),
|
|
||||||
'show_in_rest' => true,
|
|
||||||
'default' => ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -42,52 +42,6 @@ $current_category_mapping = \get_option( 'activitypub_event_bridge_event_
|
||||||
<div class="activitypub-event-bridge-settings activitypub-event-bridge-settings-page hide-if-no-js">
|
<div class="activitypub-event-bridge-settings activitypub-event-bridge-settings-page hide-if-no-js">
|
||||||
<form method="post" action="options.php">
|
<form method="post" action="options.php">
|
||||||
<?php \settings_fields( 'activitypub-event-bridge' ); ?>
|
<?php \settings_fields( 'activitypub-event-bridge' ); ?>
|
||||||
<div class="box">
|
|
||||||
<h2> <?php esc_html_e( 'Event Summary Text', 'activitypub-event-bridge' ); ?> </h2>
|
|
||||||
<p><?php esc_html_e( 'Many Fediverse applications (e.g., Mastodon) don\'t fully support events, instead they will show a summary text along with the events title and the URL to your Website.', 'activitypub-event-bridge' ); ?></p>
|
|
||||||
<p>
|
|
||||||
<label for="activitypub_summary_type_preset">
|
|
||||||
<input type="radio" name="activitypub_summary_type" id="activitypub_summary_type_preset" value="preset" <?php echo \checked( 'preset', \get_option( 'activitypub_summary_type', ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE ) ); ?> />
|
|
||||||
<?php \esc_html_e( 'Automatic (default)', 'activitypub' ); ?>
|
|
||||||
-
|
|
||||||
<span class="description">
|
|
||||||
<?php \esc_html_e( 'Let the plugin compose a summary for you. ', 'activitypub-event-bridge' ); ?>
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<label for="activitypub_summary_type_custom">
|
|
||||||
<input type="radio" name="activitypub_summary_type" id="activitypub_summary_type_custom" value="custom" <?php echo \checked( 'custom', \get_option( 'activitypub_summary_type', ACTIVITYPUB_EVENT_BRIDGE_DEFAULT_SUMMARY_TYPE ) ); ?> />
|
|
||||||
<?php \esc_html_e( 'Custom', 'activitypub-event-bridge' ); ?>
|
|
||||||
-
|
|
||||||
<span class="description">
|
|
||||||
<?php \esc_html_e( 'For advanced users: compose your custom summary via shortcodes.', 'activitypub-event-bridge' ); ?>
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</p>
|
|
||||||
<div id="activitypub_summary_type_custom-details">
|
|
||||||
<textarea name="activitypub_event_bridge_custom_summary" id="activitypub_event_bridge_custom_summary" rows="10" cols="50" class="large-text" placeholder="<?php echo wp_kses( ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY, 'post' ); ?>"><?php echo esc_textarea( wp_kses( \get_option( 'activitypub_event_bridge_custom_summary', ACTIVITYPUB_EVENT_BRIDGE_CUSTOM_SUMMARY ), 'post' ) ); ?></textarea>
|
|
||||||
<details>
|
|
||||||
<summary><?php esc_html_e( 'See a list Template Tags available for the summary.', 'activitypub' ); ?></summary>
|
|
||||||
<div class="description">
|
|
||||||
<dl>
|
|
||||||
<dt><code>[ap_start_time]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events title.', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
<dt><code>[ap_end_time]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events content.', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
<dt><code>[ap_location]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events location.', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
<dt><code>[ap_hashtags]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events tags as hashtags.', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
<dt><code>[ap_excerpt]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events excerpt (may be truncated).', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
<dt><code>[ap_content]</code><dt>
|
|
||||||
<dd><?php \esc_html_e( 'The events description.', 'activitypub-event-bridge' ); ?></dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h2> <?php esc_html_e( 'ActivityPub Event Category', 'activitypub-event-bridge' ); ?> </h2>
|
<h2> <?php esc_html_e( 'ActivityPub Event Category', 'activitypub-event-bridge' ); ?> </h2>
|
||||||
|
|
|
@ -25,21 +25,6 @@ if ( ! file_exists( "{$_tests_dir}/includes/functions.php" ) ) {
|
||||||
// Give access to tests_add_filter() function.
|
// Give access to tests_add_filter() function.
|
||||||
require_once "{$_tests_dir}/includes/functions.php";
|
require_once "{$_tests_dir}/includes/functions.php";
|
||||||
|
|
||||||
/**
|
|
||||||
* Function to manually load an event plugin.
|
|
||||||
*
|
|
||||||
* @param string $plugin_file The main plugin file of the event plugin.
|
|
||||||
*/
|
|
||||||
function _manually_load_event_plugin( $plugin_file ) {
|
|
||||||
$plugin_dir = ABSPATH . '/wp-content/plugins/';
|
|
||||||
require_once $plugin_dir . $plugin_file;
|
|
||||||
update_option( 'purchase_history_table_structure_migration_done', true );
|
|
||||||
$current = get_option( 'active_plugins', array() );
|
|
||||||
$current[] = $plugin_file;
|
|
||||||
sort( $current );
|
|
||||||
update_option( 'active_plugins', $current );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manually load the plugin being tested and its integrations.
|
* Manually load the plugin being tested and its integrations.
|
||||||
*/
|
*/
|
||||||
|
@ -89,12 +74,13 @@ function _manually_load_plugin() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $plugin_file ) {
|
if ( $plugin_file ) {
|
||||||
_manually_load_event_plugin( $plugin_file );
|
// Manually load the event plugin.
|
||||||
} else {
|
require_once $plugin_dir . $plugin_file;
|
||||||
// For all other tests we mainly use the Events Calendar as a reference.
|
update_option( 'purchase_history_table_structure_migration_done', true );
|
||||||
_manually_load_event_plugin( 'the-events-calendar/the-events-calendar.php' );
|
$current = get_option( 'active_plugins', array() );
|
||||||
_manually_load_event_plugin( 'very-simple-event-list/vsel.php' );
|
$current[] = $plugin_file;
|
||||||
|
sort( $current );
|
||||||
|
update_option( 'active_plugins', $current );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hot fix that allows using Events Manager within unit tests, because the em_init() is later not run as admin.
|
// Hot fix that allows using Events Manager within unit tests, because the em_init() is later not run as admin.
|
||||||
|
|
|
@ -1,193 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Test file for Activitypub Shortcodes.
|
|
||||||
*
|
|
||||||
* @package ActivityPub_Event_Bridge
|
|
||||||
* @license AGPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Activitypub\Shortcodes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Activitypub Shortcodes.
|
|
||||||
*
|
|
||||||
* @coversDefaultClass \Activitypub\Shortcodes
|
|
||||||
*/
|
|
||||||
class Test_Activitypub_Event_Bridge_Shortcodes extends WP_UnitTestCase {
|
|
||||||
/**
|
|
||||||
* Override the setup function, so that tests don't run if the Events Calendar is not active.
|
|
||||||
*/
|
|
||||||
public function set_up() {
|
|
||||||
parent::set_up();
|
|
||||||
|
|
||||||
if ( ! class_exists( '\Tribe__Events__Main' ) ) {
|
|
||||||
self::markTestSkipped( 'The Events Calendar plugin is needed to test Event Shortcodes' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that ActivityPub support is enabled for The Events Calendar.
|
|
||||||
$aec = \ActivityPub_Event_Bridge\Setup::get_instance();
|
|
||||||
$aec->activate_activitypub_support_for_active_event_plugins();
|
|
||||||
|
|
||||||
// Delete all posts afterwards.
|
|
||||||
_delete_all_posts();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the shortcode for rendering the events start time.
|
|
||||||
*/
|
|
||||||
public function test_start_time() {
|
|
||||||
// Create a The Events Calendar Event without content.
|
|
||||||
$wp_object = tribe_events()
|
|
||||||
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
|
|
||||||
->create();
|
|
||||||
|
|
||||||
// Call the transformer Factory.
|
|
||||||
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
|
|
||||||
|
|
||||||
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transformer->register_shortcodes();
|
|
||||||
|
|
||||||
$summary = '[ap_start_time]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '🗓️ Start: December 1, 2024 3:00 pm', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_start_time icon="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'Start: December 1, 2024 3:00 pm', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_start_time icon="false" label="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'December 1, 2024 3:00 pm', $summary );
|
|
||||||
|
|
||||||
$transformer->unregister_shortcodes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the shortcode for rendering the events end time.
|
|
||||||
*/
|
|
||||||
public function test_end_time() {
|
|
||||||
// Create a The Events Calendar Event without content.
|
|
||||||
$wp_object = tribe_events()
|
|
||||||
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
|
|
||||||
->create();
|
|
||||||
|
|
||||||
// Call the transformer Factory.
|
|
||||||
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
|
|
||||||
|
|
||||||
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transformer->register_shortcodes();
|
|
||||||
|
|
||||||
$summary = '[ap_end_time]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '⏳ End: December 1, 2024 4:00 pm', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_end_time icon="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'End: December 1, 2024 4:00 pm', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_end_time icon="false" label="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'December 1, 2024 4:00 pm', $summary );
|
|
||||||
|
|
||||||
$transformer->unregister_shortcodes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the shortcode for rendering the events location when no location is set.
|
|
||||||
*/
|
|
||||||
public function test_location_when_no_location_is_set() {
|
|
||||||
// Create a The Events Calendar Event without content.
|
|
||||||
$wp_object = tribe_events()
|
|
||||||
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['minimal_event'] )
|
|
||||||
->create();
|
|
||||||
|
|
||||||
// Call the transformer Factory.
|
|
||||||
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
|
|
||||||
|
|
||||||
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transformer->register_shortcodes();
|
|
||||||
|
|
||||||
$summary = '[ap_location]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '', $summary );
|
|
||||||
|
|
||||||
$transformer->unregister_shortcodes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the shortcode for rendering the events location when location is set.
|
|
||||||
*/
|
|
||||||
public function test_location_when_location_is_set() {
|
|
||||||
// Create Venue.
|
|
||||||
$venue = tribe_venues()->set_args( Test_The_Events_Calendar::MOCKUP_VENUS['minimal_venue'] )->create();
|
|
||||||
// Create a The Events Calendar Event.
|
|
||||||
$wp_object = tribe_events()
|
|
||||||
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['complex_event'] )
|
|
||||||
->set( 'venue', $venue->ID )
|
|
||||||
->create();
|
|
||||||
|
|
||||||
// Call the transformer Factory.
|
|
||||||
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
|
|
||||||
|
|
||||||
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transformer->register_shortcodes();
|
|
||||||
|
|
||||||
$summary = '[ap_location]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '📍 Location: Minimal Venue', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_location icon="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'Location: Minimal Venue', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_location icon="false" label="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( 'Minimal Venue', $summary );
|
|
||||||
|
|
||||||
$transformer->unregister_shortcodes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the shortcode for rendering the events location when location with detailed address is set.
|
|
||||||
*/
|
|
||||||
public function test_location_when_detailed_location_is_set() {
|
|
||||||
// Create Venue.
|
|
||||||
$venue = tribe_venues()->set_args( Test_The_Events_Calendar::MOCKUP_VENUS['complex_venue'] )->create();
|
|
||||||
// Create a The Events Calendar Event.
|
|
||||||
$wp_object = tribe_events()
|
|
||||||
->set_args( Test_The_Events_Calendar::MOCKUP_EVENTS['complex_event'] )
|
|
||||||
->set( 'venue', $venue->ID )
|
|
||||||
->create();
|
|
||||||
|
|
||||||
// Call the transformer Factory.
|
|
||||||
$transformer = \Activitypub\Transformer\Factory::get_transformer( $wp_object );
|
|
||||||
|
|
||||||
if ( ! $transformer instanceof \ActivityPub_Event_Bridge\Activitypub\Transformer\Event ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$transformer->register_shortcodes();
|
|
||||||
|
|
||||||
$summary = '[ap_location]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '📍 Location: Complex Venue, Venue address, Venue zip, Venue city, Venue country', $summary );
|
|
||||||
|
|
||||||
$summary = '[ap_location country="false"]';
|
|
||||||
$summary = do_shortcode( $summary );
|
|
||||||
$this->assertEquals( '📍 Location: Complex Venue, Venue address, Venue zip, Venue city', $summary );
|
|
||||||
|
|
||||||
$transformer->unregister_shortcodes();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue