wip on category mapping

This commit is contained in:
André Menrath 2024-08-27 21:23:33 +02:00
parent 1f93f58760
commit 02fd6af960
8 changed files with 271 additions and 121 deletions

View file

@ -16,8 +16,19 @@ use function Activitypub\get_rest_url_by_path;
/** /**
* Base transformer for WordPress event post types to ActivityPub events. * Base transformer for WordPress event post types to ActivityPub events.
*
* Everything that transforming several WordPress post types that represent events
* have in common, as well as sane defaults for events should be defined here.
*/ */
class Event extends Post { class Event extends Post {
/**
* The WordPress event taxonomy.
*
* @var string
*/
protected $wp_taxonomy;
/** /**
* Returns the User-URL of the Author of the Post. * Returns the User-URL of the Author of the Post.
* *
@ -41,6 +52,19 @@ class Event extends Post {
return 'Event'; return 'Event';
} }
/**
* Set the event category, via the mapping setting.
*/
public function get_category() {
$current_category_mapping = \get_option( 'activitypub_event_extensions_event_category_mappings', array() );
$terms = \get_the_terms( $this->wp_object, $this->wp_taxonomy );
if ( ! is_wp_error( $terms ) && $terms ) {
return $current_category_mapping[ $terms[0]->slug ];
} else {
return \get_option( 'activitypub_event_extensions_default_event_category', 'MEETING' );
}
}
/** /**
* Generic function that converts an WP-Event object to an ActivityPub-Event object. * Generic function that converts an WP-Event object to an ActivityPub-Event object.
* *

View file

@ -11,43 +11,29 @@
namespace Activitypub_Event_Extensions\Admin; namespace Activitypub_Event_Extensions\Admin;
use Activitypub_Event_Extensions\Setup;
// Exit if accessed directly. // Exit if accessed directly.
defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore
/** /**
* Class responsible for Event Plugin related admin notices. * Class responsible for the ActivityPui Event Extension related Settings.
* *
* Notices for guiding to proper configuration of ActivityPub with event plugins. * Class responsible for the ActivityPui Event Extension related Settings.
* *
* @since 1.0.0 * @since 1.0.0
*/ */
class Settings_Page { class Settings_Page {
/**
* TODO:
* - [ ] create settings page
* - [ ] skeleton
* - [ ] Autoloader
* - [ ] Common settings?
* - [ ] Hook points
* - [ ] let transformers hook settings into the page
* - [ ] provide setting-type-classes for hooks
* - [ ] True/False
* - [ ] Number
* - [ ] advanced for mapping
*/
const STATIC = 'Activitypub_Event_Extensions\Admin\Settings_Page'; const STATIC = 'Activitypub_Event_Extensions\Admin\Settings_Page';
const SETTINGS_SLUG = 'activitypub-events'; const SETTINGS_SLUG = 'activitypub-event-extensions';
/** /**
* Warning if the plugin is Active and the ActivityPub plugin is not. * Warning if the plugin is Active and the ActivityPub plugin is not.
*/ */
public static function admin_menu() { public static function admin_menu() {
\add_options_page( \add_options_page(
'Activitypub Event Extension', 'Activitypub Event Extension',
'Activitypub Events', __( 'ActivityPub Events', 'activitypub_event_extensions' ),
'manage_options', 'manage_options',
self::SETTINGS_SLUG, self::SETTINGS_SLUG,
array( self::STATIC, 'settings_page' ) array( self::STATIC, 'settings_page' )
@ -70,59 +56,46 @@ class Settings_Page {
); );
} }
public static function settings_page() { /**
if ( empty( $_GET['tab'] ) ) { * Receive the event categories (terms) used by the event plugin.
$tab = 'general'; *
} else { * @param array $event_plugin Contains info about a certain event plugin.
$tab = sanitize_key( $_GET['tab'] ); *
} * @return array An array of Terms.
/*
submenu_options = {
tab => {name => ''
active => true|false}
}
*/ */
private static function get_event_terms( $event_plugin ) {
// TODO: generate this somehow. if ( isset( $event_plugin['taxonomy'] ) ) {
// Maybe with filters, similar as with the settings! $event_terms = get_terms(
$submenu_options = array( array(
'general' => array( 'taxonomy' => $event_plugin['taxonomy'],
'name' => 'General', 'hide_empty' => true,
'active' => false, )
),
'events_manager' => array(
'name' => 'Events Manager',
'active' => false,
),
'gatherpress' => array(
'name' => 'Gatherpress',
'active' => false,
),
'the_events_calendar' => array(
'name' => 'The Events Calendar',
'active' => false,
),
'vsel' => array(
'name' => 'VS Event',
'active' => false,
),
); );
return $event_terms;
} else {
return array();
}
}
$submenu_options[ $tab ]['active'] = true; /**
* Settings page.
*/
public static function settings_page() {
$plugin_setup = Setup::get_instance();
$event_plugins = $plugin_setup->get_active_event_plugins();
$event_terms = array();
foreach ( $event_plugins as $event_plugin_name => $events_plugin_info ) {
$event_terms[ $event_plugin_name ] = self::get_event_terms( $events_plugin_info );
}
$args = array( $args = array(
'slug' => self::SETTINGS_SLUG, 'slug' => self::SETTINGS_SLUG,
'options' => $submenu_options, 'event_terms' => $event_terms,
); );
switch ( $tab ) { \load_template( ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_DIR . 'templates/settings.php', true, $args );
case 'general':
\load_template( ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_DIR . 'templates/settings-general.php', true, $args );
break;
default:
\load_template( ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_DIR . 'templates/settings-extractor.php', true, $args );
break;
}
} }
} }

View file

@ -0,0 +1,65 @@
<?php
/**
* General settings class.
*
* This file contains the General class definition, which handles the "General" settings
* page for the ActivityPub Event Extension Plugin, providing options for configuring various general settings.
*
* @package Activitypub_Event_Extensions
* @since 1.0.0
*/
namespace Activitypub_Event_Extensions\Admin;
use Activitypub\Activity\Extended_Object\Event;
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore
/**
* Class responsible for the ActivityPui Event Extension related Settings.
*
* Class responsible for the ActivityPui Event Extension related Settings.
*
* @since 1.0.0
*/
class Settings {
const STATIC = 'Activitypub_Event_Extensions\Admin\Settings_Page';
const SETTINGS_SLUG = 'activitypub-event-extensions';
/**
* Register the settings for the ActivityPub Event Extensions plugin.
*/
public static function register_settings() {
\register_setting(
'activitypub-event-extensions',
'activitypub_event_extensions_default_event_category',
array(
'type' => 'string',
'description' => \__( 'Define your own custom post template', 'activitypub' ),
'show_in_rest' => true,
'default' => 'MEETING',
)
);
\register_setting(
'activitypub-event-extensions',
'activitypub_event_extensions_event_category_mappings',
array(
'type' => 'array',
'description' => \__( 'Define your own custom post template', 'activitypub' ),
'default' => array(),
'sanitize_callback' => function ( $event_category_mappings ) {
$allowed_mappings = Event::DEFAULT_EVENT_CATEGORIES;
foreach ( $event_category_mappings as $key => $value ) {
if ( ! in_array( $value, $allowed_mappings, true ) ) {
unset( $event_category_mappings[ $key ] );
}
}
return $event_category_mappings;
},
)
);
}
}

View file

@ -135,17 +135,18 @@ class Setup {
register_activation_hook( ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_FILE, array( $this, 'activate' ) ); register_activation_hook( ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_FILE, array( $this, 'activate' ) );
add_action( 'admin_init', array( $this, 'do_admin_notices' ) ); add_action( 'admin_init', array( $this, 'do_admin_notices' ) );
add_action( 'admin_init', array( Settings::class, 'register_settings' ) );
// If we don't have any active event plugins, or the ActivityPub plugin is not enabled, abort here. // If we don't have any active event plugins, or the ActivityPub plugin is not enabled, abort here.
if ( empty( $this->active_event_plugins ) || ! $this->activitypub_plugin_is_active ) { if ( empty( $this->active_event_plugins ) || ! $this->activitypub_plugin_is_active ) {
return; return;
} }
add_action( 'admin_menu', array( Settings_Page::STATIC, 'admin_menu' ) ); add_action( 'admin_menu', array( Settings_Page::class, 'admin_menu' ) );
add_filter( add_filter(
'plugin_action_links_' . ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_BASENAME, 'plugin_action_links_' . ACTIVITYPUB_EVENT_EXTENSIONS_PLUGIN_BASENAME,
array( Settings_Page::STATIC, 'settings_link' ) array( Settings_Page::class, 'settings_link' )
); );
add_filter( 'activitypub_transformer', array( $this, 'register_activitypub_event_transformer' ), 10, 3 ); add_filter( 'activitypub_transformer', array( $this, 'register_activitypub_event_transformer' ), 10, 3 );
} }

View file

@ -1,21 +0,0 @@
<!-- TODO css classes?
currently reusing activitypub classes which is kinda nice, because it has a consistent theme then, but also it cloud break if activitypub changes something
-->
<div class="activitypub-settings-header">
<div class="activitypub-settings-title-section">
<h1><?php \esc_html_e( 'Activitypub Events Plugin', $args['slug'] ); ?></h1>
</div>
<nav class="activitypub-settings-tabs-wrapper" aria-label="<?php \esc_attr_e( 'Secondary menu', $args['slug'] ); ?>">
<!-- todo loop through settings pages of Extractors -->
<?php foreach ( $args['options'] as $tabslug => $plugin ) { ?>
<a href="<?php echo \esc_url_raw( admin_url( 'options-general.php?page='. $args['slug'] .'&tab=' . $tabslug ) ); ?>" class="activitypub-settings-tab <?php echo \esc_attr( $plugin['active'] ? 'active' : '' ); ?>">
<?php \esc_html_e( $plugin['name'], $args['slug'] ); ?> <!-- Todo better name handling -->
</a>
<?php } ?>
</nav>
</div>
<hr class="wp-header-end">

View file

@ -1,13 +0,0 @@
<?php
// Is this check necessary? it's already enforced by admin_menu()
// it's "recommended" by https://developer.wordpress.org/plugins/administration-menus/sub-menus/
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
\load_template(
__DIR__ . '/admin-header.php',
true,
$args
);
?>

View file

@ -1,13 +0,0 @@
<?php
// Is this check necessary? it's already enforced by admin_menu()
// it's "recommended" by https://developer.wordpress.org/plugins/administration-menus/sub-menus/
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
\load_template(
__DIR__ . '/admin-header.php',
true,
$args
);
?>

134
templates/settings.php Normal file
View file

@ -0,0 +1,134 @@
<?php
/**
* Template for ActivityPub Event Extensions settings pages.
*
* This template is used to display and manage settings for the ActivityPub Event Extensions plugin.
*
* @package ActivityPub_Event_Extensions
* @since 1.0.0
*
* @param array $args An array of arguments for the settings page.
*/
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit; // @codeCoverageIgnore
use Activitypub\Activity\Extended_Object\Event;
if ( ! isset( $args ) ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$event_terms = get_terms(
array(
'taxonomy' => 'tribe_events_cat',
'hide_empty' => true,
)
);
$default_event_category_strings = array(
'ARTS' => __( 'Arts', 'activitypub-event-extensions' ),
'BOOK_CLUBS' => __( 'Book clubs', 'activitypub-event-extensions' ),
'BUSINESS' => __( 'Business', 'activitypub-event-extensions' ),
'CAUSES' => __( 'Causes', 'activitypub-event-extensions' ),
'COMEDY' => __( 'Comedy', 'activitypub-event-extensions' ),
'CRAFTS' => __( 'Crafts', 'activitypub-event-extensions' ),
'FOOD_DRINK' => __( 'Food & Drink', 'activitypub-event-extensions' ),
'HEALTH' => __( 'Health', 'activitypub-event-extensions' ),
'MUSIC' => __( 'Music', 'activitypub-event-extensions' ),
'AUTO_BOAT_AIR' => __( 'Auto, boat and air', 'activitypub-event-extensions' ),
'COMMUNITY' => __( 'Community', 'activitypub-event-extensions' ),
'FAMILY_EDUCATION' => __( 'Family & Education', 'activitypub-event-extensions' ),
'FASHION_BEAUTY' => __( 'Fashion & Beauty', 'activitypub-event-extensions' ),
'FILM_MEDIA' => __( 'Film & Media', 'activitypub-event-extensions' ),
'GAMES' => __( 'Games', 'activitypub-event-extensions' ),
'LANGUAGE_CULTURE' => __( 'Language & Culture', 'activitypub-event-extensions' ),
'LEARNING' => __( 'Learning', 'activitypub-event-extensions' ),
'LGBTQ' => __( 'LGBTQ', 'activitypub-event-extensions' ),
'MOVEMENTS_POLITICS' => __( 'Movements and politics', 'activitypub-event-extensions' ),
'NETWORKING' => __( 'Networking', 'activitypub-event-extensions' ),
'PARTY' => __( 'Party', 'activitypub-event-extensions' ),
'PERFORMING_VISUAL_ARTS' => __( 'Performing & Visual Arts', 'activitypub-event-extensions' ),
'PETS' => __( 'Pets', 'activitypub-event-extensions' ),
'PHOTOGRAPHY' => __( 'Photography', 'activitypub-event-extensions' ),
'OUTDOORS_ADVENTURE' => __( 'Outdoors & Adventure', 'activitypub-event-extensions' ),
'SPIRITUALITY_RELIGION_BELIEFS' => __( 'Spirituality, Religion & Beliefs', 'activitypub-event-extensions' ),
'SCIENCE_TECH' => __( 'Science & Tech', 'activitypub-event-extensions' ),
'SPORTS' => __( 'Sports', 'activitypub-event-extensions' ),
'THEATRE' => __( 'Theatre', 'activitypub-event-extensions' ),
'MEETING' => __( 'Meeting', 'activitypub-event-extensions' ), // Default value in federation.
'DEFAULT' => __( 'Default', 'activitypub-event-extensions' ), // Internal default for overrides.
);
$selected_default_event_category = \get_option( 'activitypub_event_extensions_default_event_category', 'MEETING' );
$current_category_mapping = \get_option( 'activitypub_event_extensions_event_category_mappings', array() );
?>
<div class="activitypub-settings activitypub-settings-page hide-if-no-js">
<form method="post" action="options.php">
<?php \settings_fields( 'activitypub-event-extensions' ); ?>
<div class="box">
<h2> <?php esc_html_e( 'Default ActivityPub Event Category', 'activitypub-event-extensions' ); ?> </h2>
<p> <?php esc_html_e( 'The community defined an arbitrary set of basic event categories in order to allow events from multiple organizers to be grouped in a useful way. Please specify the category most common for your events.' ); ?> </p>
<table class="form-table">
<tr>
<th scope="row"> <?php esc_html_e( 'Default Category', 'activitypub-event-extensions' ); ?> </th>
<td>
<select id="activitypub_event_extensions_default_event_category" name="activitypub_event_extensions_default_event_category">';
<?php
foreach ( $default_event_category_strings as $value => $label ) {
echo '<option value="' . esc_attr( $value ) . '" ' . selected( $selected_default_event_category, $value, false ) . '>' . esc_html( $label ) . '</option>';
}
?>
</select>
</td>
</tr>
</table>
<h2> <?php esc_html_e( 'Specific mapping of Event Categories', 'activitypub-event-extensions' ); ?> </h2>
<p> <?php esc_html_e( 'Here you can assign each of your event categories in use to the basic category set used in ActivityPub .' ); ?> </p>
<table class="form-table">
<?php foreach ( $event_terms as $event_term ) { ?>
<tr>
<th scope="row"> <?php echo esc_html( $event_term->name ); ?> </th>
<td>
<select name="activitypub_event_extensions_event_category_mappings[<?php echo esc_attr( $event_term->slug ); ?>]">
<?php
$current_mapping_is_set = false;
if ( ! empty( $current_category_mapping ) ) {
$current_mapping_is_set = array_key_exists( $event_term->slug, $current_category_mapping );
}
if ( $current_mapping_is_set ) {
$mapping = $current_category_mapping[ $event_term->slug ];
} else {
$mapping = 'DEFAULT';
}
if ( 'DEFAULT' === $mapping ) {
echo '<option value="' . esc_attr( $mapping ) . '"> -- ' . esc_html( $default_event_category_strings[ $mapping ] ) . ' -- </option>';
} else {
echo '<option value="' . esc_attr( $mapping ) . '">' . esc_html( $default_event_category_strings[ $mapping ] ) . '</option>';
}
echo '<option value="DEFAULT" ' . selected( $selected_default_event_category, 'DEFAULT', false ) . '> -- ' . esc_html__( 'Default', 'activitypub-event-extensions' ) . ' -- </option>';
foreach ( Event::DEFAULT_EVENT_CATEGORIES as $event_category ) {
echo '<option value="' . esc_attr( $event_category ) . '" ' . selected( $mappings[ $event_term->slug ] ?? '', $event_category, false ) . '>' . esc_html( $default_event_category_strings[ $event_category ] ) . '</option>';
}
?>
</select>
</td>
</tr>
<?php } ?>
</table>
</div>
<?php \submit_button(); ?>
</form>
</div>