From d2ddf227fd575868d13cd4bc4164678b08b68d52 Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Fri, 6 Jun 2025 12:09:30 -0500 Subject: [PATCH 1/7] Improve Open Graph metadata for sports events - Added `asc_generate_sp_event_title()` to format event titles using team names. - Added `asc_generate_short_date()` for consistent date/time representation. - Refined title/description to reflect event status (postponed, cancelled, etc.) and venue. - Handled special outcomes like Technical Forfeit or Forfeit in title. --- includes/open-graph-tags.php | 96 ++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 9 deletions(-) diff --git a/includes/open-graph-tags.php b/includes/open-graph-tags.php index a87b512..8ac9cb0 100644 --- a/includes/open-graph-tags.php +++ b/includes/open-graph-tags.php @@ -8,6 +8,55 @@ Author: Your Name add_action('wp_head', 'custom_open_graph_tags_with_sportspress_integration'); +function asc_generate_sp_event_title( $post ) { + // See https://github.com/ThemeBoy/SportsPress/blob/770fa8c6654d7d6648791e877709c2428677635b/includes/admin/post-types/class-sp-admin-cpt-event.php#L99C40-L99C55 + if ( is_numeric( $post ) ) { + $post = get_post( $post ); + } + if ( ! $post || $post->post_type !== 'sp_event' ) { + return get_the_title(); + } + + $teams = get_post_meta( $post->ID, 'sp_team', false ); + $teams = array_filter( $teams ); + + $team_names = array(); + foreach ( $teams as $team ) { + while ( is_array( $team ) ) { + $team = array_shift( array_filter( $team ) ); + } + if ( $team > 0 ) { + $team_names[] = sp_team_short_name( $team ); + } + } + + $team_names = array_unique( $team_names ); + + if ( get_option( 'sportspress_event_reverse_teams', 'no' ) === 'yes' ) { + $team_names = array_reverse( $team_names ); + } + + $delimiter = ' ' . get_option( 'sportspress_event_teams_delimiter', 'vs' ) . ' '; + + return implode( $delimiter, $team_names ); +} + +function asc_generate_short_date( $post, $withTime = true ) { + $formatted_date = get_the_date('D n/j/y', $post); + + if (!$withTime){ + return $formatted_date; + } + + if ( get_the_date('i', $post) == "00") { + $formatted_time = get_the_date('gA', $post); + } else { + $formatted_time = get_the_date('g:iA', $post); + } + return $formatted_date . " " . $formatted_time ; + +} + function custom_open_graph_tags_with_sportspress_integration() { if (is_single()) { global $post; @@ -18,16 +67,22 @@ function custom_open_graph_tags_with_sportspress_integration() { // Fetch details using SP_Event methods $publish_date = get_the_date('F j, Y', $post); $venue_terms = get_the_terms($post->ID, 'sp_venue'); - $venue_name = $venue_terms ? $venue_terms[0]->name : 'No Venue Specified'; + $venue_name = $venue_terms ? $venue_terms[0]->name : 'Venue TBD'; $results = $event->results(); // Using SP_Event method - $title = get_the_title() . " " . "(" . $publish_date . ")"; + $title = asc_generate_sp_event_title($post); $sp_status = get_post_meta( $post->ID, 'sp_status', true ); $status = $event->status(); // Using SP_Event method $publish_date_and_time = get_the_date('F j, Y g:i A', $post); $description = "{$publish_date_and_time} at {$venue_name}."; - if ( 'postponed' == $sp_status ) { - $description = "POSTPONED" . " - " . $description; - $title = "POSTPONED" . " - " . $title; + + if ( 'postponed' == $sp_status || 'cancelled' == $sp_status || 'tbd' == $sp_status) { + $description = strtoupper($sp_status) . " — " . $description; + $title = strtoupper($sp_status) . " — " . $title . " — " . asc_generate_short_date($post) . " — " . $venue_name; + } + + if ( 'future' == $status ) { + $description = $description; + $title = $title . " — " . asc_generate_short_date($post) . " — " . $venue_name; } if ( 'results' == $status ) { // checks if there is a final score @@ -76,6 +131,7 @@ function custom_open_graph_tags_with_sportspress_integration() { unset( $result['outcome'] ); $team_name = sp_team_short_name( $team_id ); + $team_abbreviation = sp_team_abbreviation( $team_id ); $outcome_abbreviation = get_post_meta( $the_outcome->ID, 'sp_abbreviation', true ); if ( ! $outcome_abbreviation ) { @@ -87,15 +143,37 @@ function custom_open_graph_tags_with_sportspress_integration() { "outcome" => $the_outcome->post_title, "outcome_abbreviation" => $outcome_abbreviation, "team_name" => $team_name, + "team_abbreviation" => $team_abbreviation ] ); $i++; endforeach; - $publish_date = get_the_date('F j, Y', $post); - $title = "{$teams_result_array[0]['team_name']} {$teams_result_array[0]['result']['r']}-{$teams_result_array[1]['result']['r']} {$teams_result_array[1]['team_name']} ({$publish_date})"; - $description .= " " . "{$teams_result_array[0]['team_name']} ({$teams_result_array[0]['outcome']}), {$teams_result_array[1]['team_name']} ({$teams_result_array[1]['outcome']}).";; + $publish_date = asc_generate_short_date($post, false); + + $special_result_suffix_abbreviation = ''; + $special_result_suffix= ''; + + foreach ( $teams_result_array as $team ) { + $outcome_abbreviation = strtoupper( $team['outcome_abbreviation'] ); // Normalize case + + if ( $outcome_abbreviation === 'TF-W' ) { + $special_result_suffix_abbreviation = 'TF-W'; + $special_result_suffix = 'Technical Forfeit Win'; + break; + } elseif ( $outcome_abbreviation === 'TF-L' ) { + $special_result_suffix_abbreviation = 'TF'; + $special_result_suffix = 'Technical Forfeit'; + break; + } elseif ( $outcome_abbreviation === 'F-W' || $outcome_abbreviation === 'F-L' ) { + $special_result_suffix_abbreviation = 'Forfeit'; + $special_result_suffix = 'Forfeit'; + break; + } + } + + $title = "{$teams_result_array[0]['team_name']} {$teams_result_array[0]['result']['r']}-{$teams_result_array[1]['result']['r']} {$teams_result_array[1]['team_name']} — {$publish_date}" . ($special_result_suffix ? "({$special_result_suffix_abbreviation})" : ""); + $description .= " " . "{$teams_result_array[0]['team_name']} ({$teams_result_array[0]['outcome']}), {$teams_result_array[1]['team_name']} ({$teams_result_array[1]['outcome']})." ; } - $description .= " " . $post->post_content; $image = get_site_url() . "/head-to-head?post={$post->ID}"; echo '' . "\n"; From 377cdbffb0ed924d372a9975fb2f64c3302767bf Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Fri, 6 Jun 2025 12:19:40 -0500 Subject: [PATCH 2/7] update readme and version --- readme.txt | 124 ++++++----------------------- tonys-sportspress-enhancements.php | 2 +- 2 files changed, 24 insertions(+), 102 deletions(-) diff --git a/readme.txt b/readme.txt index 8adf1d1..85f84d5 100644 --- a/readme.txt +++ b/readme.txt @@ -1,115 +1,37 @@ -=== Tonys Sportspress Enhancements === -Contributors: (this should be a list of wordpress.org userid's) -Donate link: https://example.com/ -Tags: comments, spam -Requires at least: 4.5 -Tested up to: 6.5.3 -Requires PHP: 5.6 -Stable tag: 0.1.0 -License: GPLv2 or later -License URI: https://www.gnu.org/licenses/gpl-2.0.html +# Tony's SportsPress Enhancements -Here is a short description of the plugin. This should be no more than 150 characters. No markup here. +Suite of enhancements for the SportsPress plugin, including custom event permalinks, Open Graph tags, and automatic featured image generation for events. -== Description == +## Description -This is the long description. No limit, and you can use Markdown (as well as in the following sections). +Tony's SportsPress Enhancements is a collection of add-ons for the [SportsPress](https://wordpress.org/plugins/sportspress/) plugin. It provides: -For backwards compatibility, if this section is missing, the full length of the short description will be used, and -Markdown parsed. +- **Custom event permalinks** for `sp_event` post types, including season and team slugs. +- **Open Graph meta tags** for events, with dynamic titles, descriptions, and images. +- **Automatic featured image generation** for events, combining team colors and logos into a shareable image. -A few notes about the sections above: +## Features -* "Contributors" is a comma separated list of wp.org/wp-plugins.org usernames -* "Tags" is a comma separated list of tags that apply to the plugin -* "Requires at least" is the lowest version that the plugin will work on -* "Tested up to" is the highest version that you've *successfully used to test the plugin*. Note that it might work on -higher versions... this is just the highest one you've verified. -* Stable tag should indicate the Subversion "tag" of the latest stable version, or "trunk," if you use `/trunk/` for -stable. +- Custom rewrite rules and permalinks for SportsPress events. +- Open Graph integration for better social sharing. +- Dynamic, cached event images based on team data. +- Compatible with WordPress 4.5+ and PHP 5.6+. - Note that the `readme.txt` of the stable tag is the one that is considered the defining one for the plugin, so -if the `/trunk/readme.txt` file says that the stable tag is `4.3`, then it is `/tags/4.3/readme.txt` that'll be used -for displaying information about the plugin. In this situation, the only thing considered from the trunk `readme.txt` -is the stable tag pointer. Thus, if you develop in trunk, you can update the trunk `readme.txt` to reflect changes in -your in-development version, without having that information incorrectly disclosed about the current stable version -that lacks those changes -- as long as the trunk's `readme.txt` points to the correct stable tag. +## Installation - If no stable tag is provided, it is assumed that trunk is stable, but you should specify "trunk" if that's where -you put the stable version, in order to eliminate any doubt. +1. Upload the plugin files to the `/wp-content/plugins/tonys-sportspress-enhancements/` directory, or install via the WordPress plugin repository. +2. Activate the plugin through the 'Plugins' menu in WordPress. +3. Make sure the [SportsPress](https://wordpress.org/plugins/sportspress/) plugin is installed and activated. -== Installation == +## Frequently Asked Questions -This section describes how to install the plugin and get it working. +**Q: Does this plugin require SportsPress?** +A: Yes, it extends the functionality of the SportsPress plugin. -e.g. +**Q: How are event images generated?** +A: When an event is viewed or shared, a featured image is generated using the primary colors and logos of the participating teams. -1. Upload `plugin-name.php` to the `/wp-content/plugins/` directory -1. Activate the plugin through the 'Plugins' menu in WordPress -1. Place `` in your templates -== Frequently Asked Questions == +--- -= A question that someone might have = - -An answer to that question. - -= What about foo bar? = - -Answer to foo bar dilemma. - -== Screenshots == - -1. This screen shot description corresponds to screenshot-1.(png|jpg|jpeg|gif). Note that the screenshot is taken from -the /assets directory or the directory that contains the stable readme.txt (tags or trunk). Screenshots in the /assets -directory take precedence. For example, `/assets/screenshot-1.png` would win over `/tags/4.3/screenshot-1.png` -(or jpg, jpeg, gif). -2. This is the second screen shot - -== Changelog == - -= 1.0 = -* A change since the previous version. -* Another change. - -= 0.5 = -* List versions from most recent at top to oldest at bottom. - -== Upgrade Notice == - -= 1.0 = -Upgrade notices describe the reason a user should upgrade. No more than 300 characters. - -= 0.5 = -This version fixes a security related bug. Upgrade immediately. - -== Arbitrary section == - -You may provide arbitrary sections, in the same format as the ones above. This may be of use for extremely complicated -plugins where more information needs to be conveyed that doesn't fit into the categories of "description" or -"installation." Arbitrary sections will be shown below the built-in sections outlined above. - -== A brief Markdown Example == - -Ordered list: - -1. Some feature -1. Another feature -1. Something else about the plugin - -Unordered list: - -* something -* something else -* third thing - -Here's a link to [WordPress](https://wordpress.org/ "Your favorite software") and one to [Markdown's Syntax Documentation][markdown syntax]. -Titles are optional, naturally. - -[markdown syntax]: https://daringfireball.net/projects/markdown/syntax - "Markdown is what the parser uses to process much of the readme file" - -Markdown uses email style notation for blockquotes and I've been told: -> Asterisks for *emphasis*. Double it up for **strong**. - -`` +*This plugin is not affiliated with or endorsed by ThemeBoy or the official SportsPress plugin.* \ No newline at end of file diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index fc426f7..d1ed59d 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -7,7 +7,7 @@ * Author URI: YOUR SITE HERE * Text Domain: tonys-sportspress-enhancements * Domain Path: /languages - * Version: 0.1.0 + * Version: 0.1.1 * * @package Tonys_Sportspress_Enhancements */ From f59273d78831c13435ac6500d163459996620aa6 Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Fri, 6 Jun 2025 12:22:33 -0500 Subject: [PATCH 3/7] rename readme as markdwon, update manifest --- readme.txt => readme.md | 0 tonys-sportspress-enhancements.php | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename readme.txt => readme.md (100%) diff --git a/readme.txt b/readme.md similarity index 100% rename from readme.txt rename to readme.md diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index d1ed59d..c7b2ba2 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -1,10 +1,10 @@ Date: Fri, 6 Jun 2025 12:24:36 -0500 Subject: [PATCH 4/7] typo --- tonys-sportspress-enhancements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index c7b2ba2..5145bf5 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -4,7 +4,7 @@ * Plugin URI: https://github.com/anthonyscorrea/tonys-sportspress-enhancements * Description: Suite of SportsPress Enhancements * Author: Tony Correa - * Author URI: Yhttps://github.com/anthonyscorrea/ + * Author URI: https://github.com/anthonyscorrea/ * Text Domain: tonys-sportspress-enhancements * Domain Path: /languages * Version: 0.1.1 From e0af498a3f9f56f79e47cb07e7015d603ec112d1 Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Tue, 17 Feb 2026 14:53:52 -0600 Subject: [PATCH 5/7] add github actions --- .github/workflows/release.yml | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..231a361 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,37 @@ +name: Release Plugin Zip + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build plugin zip + id: build + run: | + set -euo pipefail + PLUGIN_SLUG="${GITHUB_REPOSITORY##*/}" + TAG="${GITHUB_REF_NAME}" + ZIP_NAME="${PLUGIN_SLUG}-${TAG}.zip" + + mkdir -p dist + git archive --format=zip --prefix="${PLUGIN_SLUG}/" -o "dist/${ZIP_NAME}" HEAD + + echo "zip_path=dist/${ZIP_NAME}" >> "$GITHUB_OUTPUT" + echo "zip_name=${ZIP_NAME}" >> "$GITHUB_OUTPUT" + + - name: Create or update release and upload zip + uses: softprops/action-gh-release@v2 + with: + files: ${{ steps.build.outputs.zip_path }} + fail_on_unmatched_files: true From cb05d5352278d1595723b0d39d7beb6854f5e89a Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Tue, 17 Feb 2026 14:57:14 -0600 Subject: [PATCH 6/7] add week filter --- includes/sp-event-admin-week-filter.php | 220 ++++++++++++++++++++++++ tonys-sportspress-enhancements.php | 2 +- 2 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 includes/sp-event-admin-week-filter.php diff --git a/includes/sp-event-admin-week-filter.php b/includes/sp-event-admin-week-filter.php new file mode 100644 index 0000000..69a8443 --- /dev/null +++ b/includes/sp-event-admin-week-filter.php @@ -0,0 +1,220 @@ + $year, + 'week' => $week, + ); +} + +/** + * Render week filter control in event admin list. + * + * @param string $post_type Current post type. + */ +function tony_sportspress_render_admin_week_filter( $post_type ) { + if ( 'sp_event' !== $post_type ) { + return; + } + + $value = ''; + if ( ! empty( $_GET['sp_week_filter'] ) ) { + $value = sanitize_text_field( wp_unslash( $_GET['sp_week_filter'] ) ); + } + + $summary_text = __( 'Select a week', 'tonys-sportspress-enhancements' ); + $parsed = tony_sportspress_parse_admin_week_filter(); + if ( is_array( $parsed ) ) { + $timezone = wp_timezone(); + $monday = ( new DateTimeImmutable( 'now', $timezone ) )->setISODate( $parsed['year'], $parsed['week'], 1 )->setTime( 0, 0, 0 ); + $sunday = $monday->modify( '+6 days' )->setTime( 23, 59, 59 ); + /* translators: 1: Monday label/date, 2: Sunday label/date. */ + $summary_text = sprintf( + __( '%1$s to %2$s', 'tonys-sportspress-enhancements' ), + wp_date( 'D M j, Y', $monday->getTimestamp(), $timezone ), + wp_date( 'D M j, Y', $sunday->getTimestamp(), $timezone ) + ); + } + ?> + + + + id ) { + return; + } + ?> + + id ) { + return; + } + ?> + + is_main_query() ) { + return; + } + + $post_type = $query->get( 'post_type' ); + if ( 'sp_event' !== $post_type ) { + return; + } + + $parsed = tony_sportspress_parse_admin_week_filter(); + if ( null === $parsed ) { + return; + } + + $timezone = wp_timezone(); + $monday = ( new DateTimeImmutable( 'now', $timezone ) )->setISODate( $parsed['year'], $parsed['week'], 1 )->setTime( 0, 0, 0 ); + $sunday = $monday->modify( '+6 days' )->setTime( 23, 59, 59 ); + + $date_query = $query->get( 'date_query' ); + if ( ! is_array( $date_query ) ) { + $date_query = array(); + } + + $date_query[] = array( + 'after' => array( + 'year' => (int) $monday->format( 'Y' ), + 'month' => (int) $monday->format( 'n' ), + 'day' => (int) $monday->format( 'j' ), + ), + 'before' => array( + 'year' => (int) $sunday->format( 'Y' ), + 'month' => (int) $sunday->format( 'n' ), + 'day' => (int) $sunday->format( 'j' ), + ), + 'inclusive' => true, + ); + + $query->set( 'date_query', $date_query ); +} +add_action( 'pre_get_posts', 'tony_sportspress_apply_admin_week_filter' ); diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index 5145bf5..d6f2685 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -16,4 +16,4 @@ // Include other files here require_once plugin_dir_path(__FILE__) . 'includes/open-graph-tags.php'; require_once plugin_dir_path(__FILE__) . 'includes/featured-image-generator.php'; -require_once plugin_dir_path(__FILE__) . 'includes/sp-event-permalink.php'; \ No newline at end of file +require_once plugin_dir_path(__FILE__) . 'includes/sp-event-permalink.php';require_once plugin_dir_path(__FILE__) . 'includes/sp-event-admin-week-filter.php'; From 0696d821b5bd3184e586b17ce44711c4b8ae0b5d Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Tue, 17 Feb 2026 15:23:48 -0600 Subject: [PATCH 7/7] version 0.1.2 --- tonys-sportspress-enhancements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tonys-sportspress-enhancements.php b/tonys-sportspress-enhancements.php index d6f2685..a35d4cc 100644 --- a/tonys-sportspress-enhancements.php +++ b/tonys-sportspress-enhancements.php @@ -7,7 +7,7 @@ * Author URI: https://github.com/anthonyscorrea/ * Text Domain: tonys-sportspress-enhancements * Domain Path: /languages - * Version: 0.1.1 + * Version: 0.1.2 * * @package Tonys_Sportspress_Enhancements */