feat: directly add oi-contest

This commit is contained in:
hanyixuanten
2026-08-06 18:40:59 +08:00
parent 3a435b38a0
commit 8611b00d04
9 changed files with 177 additions and 11 deletions
+9 -2
View File
@@ -9,7 +9,8 @@ Contest data is provided by [OI-contest-fetch](https://github.com/hanyixuanten/O
## Features
- Adds an **Upcoming OI Contests** widget to the WordPress dashboard.
- Provides the `[oi_contest_schedule]` shortcode for posts and pages.
- Provides an **OI Contest Schedule** block for posts and pages.
- Keeps the `[oi_contest_schedule]` shortcode available for compatibility and templates.
- Shows contest platform, title, start and end times, and a live countdown.
- Identifies contests that are currently running.
- Supports responsive and compact layouts.
@@ -37,9 +38,15 @@ Contest data is provided by [OI-contest-fetch](https://github.com/hanyixuanten/O
After activation, the dashboard widget appears automatically on **Dashboard > Home**.
## Editor Block
In the post or page editor, select **Add block**, search for **OI Contest Schedule**, and insert the block. Use the block settings sidebar to choose how many contests to display (1-50) and whether to use the compact layout.
The block is rendered dynamically, so contest data remains current without editing the post.
## Shortcode
Add a Shortcode block to a post or page and use:
For classic editors or templates, the shortcode remains available:
```text
[oi_contest_schedule]
+9 -2
View File
@@ -9,7 +9,8 @@ OI Contest Schedule 是一款轻量级 WordPress 插件,可在 WordPress 仪
## 功能特性
- 在 WordPress 仪表盘中添加“即将到来的 OI 赛事”小组件。
- 提供 `[oi_contest_schedule]` 短代码,可插入文章或页面。
- 提供“**OI 赛事日程**”区块,可直接插入文章或页面。
- 保留 `[oi_contest_schedule]` 短代码,兼容经典编辑器和模板。
- 展示比赛平台、标题、开始和结束时间,以及实时倒计时。
- 自动标记正在进行的比赛。
- 支持响应式布局和紧凑布局。
@@ -37,9 +38,15 @@ OI Contest Schedule 是一款轻量级 WordPress 插件,可在 WordPress 仪
启用后,赛事小组件会自动显示在 **仪表盘 > 首页** 中。
## 编辑器区块
在文章或页面编辑器中点击“**添加区块**”,搜索“**OI 赛事日程**”并插入。在区块设置侧栏中可以选择显示的赛事数量(1-50),也可以启用紧凑布局。
该区块使用动态渲染,无需重新编辑文章即可显示最新赛事数据。
## 短代码
在文章或页面中添加“短代码”区块,然后输入
经典编辑器或模板仍可使用以下短代码
```text
[oi_contest_schedule]
+65
View File
@@ -0,0 +1,65 @@
( function ( blocks, blockEditor, components, element, ServerSideRender ) {
'use strict';
var createElement = element.createElement;
var InspectorControls = blockEditor.InspectorControls;
var PanelBody = components.PanelBody;
var RangeControl = components.RangeControl;
var ToggleControl = components.ToggleControl;
var strings = window.oicsScheduleEditorL10n;
blocks.registerBlockType( 'oics/contest-schedule', {
apiVersion: 2,
title: strings.title,
description: strings.description,
icon: 'calendar-alt',
category: 'widgets',
attributes: {
limit: {
type: 'number',
default: 10
},
compact: {
type: 'boolean',
default: false
}
},
edit: function ( props ) {
return createElement(
element.Fragment,
null,
createElement(
InspectorControls,
null,
createElement(
PanelBody,
{ title: strings.settings },
createElement( RangeControl, {
label: strings.limit,
value: props.attributes.limit,
min: 1,
max: 50,
onChange: function ( value ) {
props.setAttributes( { limit: value } );
}
} ),
createElement( ToggleControl, {
label: strings.compact,
checked: props.attributes.compact,
onChange: function ( value ) {
props.setAttributes( { compact: value } );
}
} )
)
),
createElement( ServerSideRender, {
block: 'oics/contest-schedule',
attributes: props.attributes
} )
);
},
save: function () {
return null;
}
} );
} )( window.wp.blocks, window.wp.blockEditor, window.wp.components, window.wp.element, window.wp.serverSideRender );
+1
View File
@@ -58,6 +58,7 @@ build() {
unzip -Z1 "${archive_path}" | grep -q "^${plugin_slug}/includes/class-schedule-renderer.php$"
unzip -Z1 "${archive_path}" | grep -q "^${plugin_slug}/assets/css/schedule.css$"
unzip -Z1 "${archive_path}" | grep -q "^${plugin_slug}/assets/js/schedule.js$"
unzip -Z1 "${archive_path}" | grep -q "^${plugin_slug}/assets/js/schedule-editor.js$"
if unzip -Z1 "${archive_path}" | grep -Eq '/README(\.zh-CN)?\.md$'; then
printf 'Unexpected development README found in archive.\n' >&2
exit 1
+52 -1
View File
@@ -17,12 +17,56 @@ final class OICS_Plugin {
private function __construct() {
$this->renderer = new OICS_Schedule_Renderer( new OICS_Contest_Client() );
add_action( 'init', array( $this, 'register_block' ) );
add_action( 'wp_dashboard_setup', array( $this, 'register_dashboard_widget' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_assets' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
add_shortcode( 'oi_contest_schedule', array( $this, 'render_shortcode' ) );
}
public function register_block() {
$this->register_assets();
wp_register_script(
'oics-schedule-editor',
OICS_URL . 'assets/js/schedule-editor.js',
array( 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-element', 'wp-server-side-render' ),
OICS_VERSION,
true
);
wp_localize_script(
'oics-schedule-editor',
'oicsScheduleEditorL10n',
array(
'title' => __( 'OI Contest Schedule', 'oi-contest-schedule' ),
'description' => __( 'Display upcoming OI contests with local times and live countdowns.', 'oi-contest-schedule' ),
'settings' => __( 'Schedule settings', 'oi-contest-schedule' ),
'limit' => __( 'Number of contests', 'oi-contest-schedule' ),
'compact' => __( 'Compact layout', 'oi-contest-schedule' ),
)
);
register_block_type(
'oics/contest-schedule',
array(
'api_version' => 2,
'editor_script' => 'oics-schedule-editor',
'editor_style' => 'oics-schedule',
'style' => 'oics-schedule',
'attributes' => array(
'limit' => array(
'type' => 'number',
'default' => 10,
),
'compact' => array(
'type' => 'boolean',
'default' => false,
),
),
'render_callback' => array( $this, 'render_block' ),
)
);
}
private function register_assets() {
wp_register_style( 'oics-schedule', OICS_URL . 'assets/css/schedule.css', array(), OICS_VERSION );
wp_register_script( 'oics-schedule', OICS_URL . 'assets/js/schedule.js', array(), OICS_VERSION, true );
@@ -42,7 +86,7 @@ final class OICS_Plugin {
public function enqueue_frontend_assets() {
$post = get_post();
if ( ! $post || ! has_shortcode( $post->post_content, 'oi_contest_schedule' ) ) {
if ( ! $post || ( ! has_shortcode( $post->post_content, 'oi_contest_schedule' ) && ! has_block( 'oics/contest-schedule', $post ) ) ) {
return;
}
@@ -90,4 +134,11 @@ final class OICS_Plugin {
return $this->renderer->render( $limit, $compact );
}
public function render_block( $attributes ) {
$limit = isset( $attributes['limit'] ) ? min( 50, max( 1, absint( $attributes['limit'] ) ) ) : 10;
$compact = ! empty( $attributes['compact'] );
return $this->renderer->render( $limit, $compact );
}
}
+15
View File
@@ -16,6 +16,21 @@ msgstr ""
msgid "Upcoming OI Contests"
msgstr "即将到来的 OI 赛事"
msgid "OI Contest Schedule"
msgstr "OI 赛事日程"
msgid "Display upcoming OI contests with local times and live countdowns."
msgstr "显示即将到来的 OI 赛事、本地时间和实时倒计时。"
msgid "Schedule settings"
msgstr "日程设置"
msgid "Number of contests"
msgstr "赛事数量"
msgid "Compact layout"
msgstr "紧凑布局"
msgid "Running"
msgstr "进行中"
+15
View File
@@ -11,6 +11,21 @@ msgstr ""
msgid "Upcoming OI Contests"
msgstr ""
msgid "OI Contest Schedule"
msgstr ""
msgid "Display upcoming OI contests with local times and live countdowns."
msgstr ""
msgid "Schedule settings"
msgstr ""
msgid "Number of contests"
msgstr ""
msgid "Compact layout"
msgstr ""
msgid "Running"
msgstr ""
+1 -1
View File
@@ -2,7 +2,7 @@
/**
* Plugin Name: OI Contest Schedule
* Plugin URI: https://github.com/hanyixuanten/oi-contest-schedule
* Description: Display upcoming OI contests in a dashboard widget or on any page with a shortcode.
* Description: Display upcoming OI contests in a dashboard widget or with an editor block.
* Version: 0.1.0
* Requires at least: 6.4
* Requires PHP: 7.4
+10 -5
View File
@@ -1,6 +1,6 @@
=== OI Contest Schedule ===
Contributors: hanyixuanten
Tags: contest, schedule, shortcode, dashboard, competitive programming
Tags: contest, schedule, block, dashboard, competitive programming
Requires at least: 6.4
Tested up to: 6.9
Requires PHP: 7.4
@@ -8,13 +8,13 @@ Stable tag: 0.1.0
License: GPL-3.0-only
License URI: https://www.gnu.org/licenses/gpl-3.0.html
Display upcoming OI and competitive programming contests in the WordPress dashboard or on any page with a shortcode.
Display upcoming OI and competitive programming contests in the WordPress dashboard or with an editor block.
== Description ==
OI Contest Schedule displays upcoming competitive programming contests with local times and live countdowns.
The plugin adds an **Upcoming OI Contests** widget to the WordPress dashboard. To display the schedule on the front end, add the `[oi_contest_schedule]` shortcode to a post, page, or Shortcode block.
The plugin adds an **Upcoming OI Contests** widget to the WordPress dashboard. To display the schedule on the front end, add the **OI Contest Schedule** block to a post or page.
Features include:
@@ -25,9 +25,13 @@ Features include:
* A five-minute cache using the WordPress Transients API.
* English and Simplified Chinese translations.
= Block settings =
Add the **OI Contest Schedule** block from the block inserter. Its settings sidebar lets you display between 1 and 50 contests and enable the compact layout. The block is rendered dynamically so it always uses current contest data.
= Shortcode options =
The default shortcode displays up to 10 contests:
The shortcode remains available for classic editors and templates. By default it displays up to 10 contests:
`[oi_contest_schedule]`
@@ -44,7 +48,7 @@ Set `compact` to `true` to use the compact layout:
1. Upload the `oi-contest-schedule` directory to `/wp-content/plugins/`, or install the plugin ZIP through the WordPress Plugins screen.
2. Activate **OI Contest Schedule** through the Plugins screen.
3. Open the WordPress dashboard to see the contest widget.
4. To show the schedule on the front end, insert `[oi_contest_schedule]` into a post or page.
4. To show the schedule on the front end, add the **OI Contest Schedule** block to a post or page.
== Frequently Asked Questions ==
@@ -86,6 +90,7 @@ Service and data source:
= 0.1.0 =
* Added the upcoming contest dashboard widget.
* Added the **OI Contest Schedule** editor block with limit and compact layout settings.
* Added the `[oi_contest_schedule]` shortcode with `limit` and `compact` options.
* Added visitor-local time formatting and live countdowns.
* Added platform styling and responsive layouts.