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
*/