{"id":351343,"date":"2026-08-12T10:52:18","date_gmt":"2026-08-12T10:52:18","guid":{"rendered":"https:\/\/cn.wordpress.org\/plugins\/oi-contest-schedule\/"},"modified":"2026-08-12T10:51:50","modified_gmt":"2026-08-12T10:51:50","slug":"vblg-oi-contest-schedule","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/vblg-oi-contest-schedule\/","author":23539883,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.0","stable_tag":"0.2.0","tested":"7.0.4","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"vblg OI Contest Schedule","header_author":"hanyixuanten","header_description":"Display upcoming OI contests in a dashboard widget or with an editor block.","assets_banners_color":"","last_updated":"2026-08-12 10:51:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/hanyixuanten\/oi-contest-schedule","header_author_uri":"https:\/\/www.vblg.top","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.2.0":{"tag":"0.2.0","author":"hanyixuanten","date":"2026-08-12 10:51:50"}},"upgrade_notice":{"0.2.0":"<p>The plugin slug and shortcode have changed. Replace <code>[oi_contest_schedule]<\/code> with <code>[oics_oi_contest_schedule]<\/code> after upgrading.<\/p>","0.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"oics\/contest-schedule":{"name":"oics\/contest-schedule","title":"Oics Contest Schedule"}},"tagged_versions":["0.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[262246],"plugin_tags":[1220,275328,7232,434,4062],"plugin_category":[40],"plugin_contributors":[274014],"plugin_business_model":[],"class_list":["post-351343","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-block","plugin_tags-competitive-programming","plugin_tags-contest","plugin_tags-dashboard","plugin_tags-schedule","plugin_category-calendar-and-events","plugin_contributors-hanyixuanten","plugin_committers-hanyixuanten"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/vblg-oi-contest-schedule.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>vblg OI Contest Schedule displays currently running and upcoming competitive programming contests with local times and live countdowns. Contests that have ended are not displayed.<\/p>\n\n<p>The plugin adds an <strong>Upcoming OI Contests<\/strong> widget to the WordPress dashboard. To display the schedule on the front end, add the <strong>vblg OI Contest Schedule<\/strong> block to a post or page.<\/p>\n\n<p>Features include:<\/p>\n\n<ul>\n<li>Upcoming and currently running contests ordered by start time.<\/li>\n<li>Contest platform, title, start time, end time, and live countdown.<\/li>\n<li>Dates formatted in each visitor's client device time zone, rather than the time zone configured in WordPress, and identified by its IANA name (for example, <code>Asia\/Shanghai<\/code>).<\/li>\n<li>Responsive and compact layouts.<\/li>\n<li>A five-minute cache using the WordPress Transients API.<\/li>\n<li>English and Simplified Chinese translations.<\/li>\n<\/ul>\n\n<h4>Block settings<\/h4>\n\n<p>Add the <strong>vblg OI Contest Schedule<\/strong> 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.<\/p>\n\n<h4>Shortcode options<\/h4>\n\n<p>The shortcode remains available for classic editors and templates. By default it displays up to 10 contests:<\/p>\n\n<pre><code>[oics_oi_contest_schedule]\n<\/code><\/pre>\n\n<p>Use <code>limit<\/code> to display between 1 and 50 contests:<\/p>\n\n<pre><code>[oi_contest_schedule limit=\"20\"]\n<\/code><\/pre>\n\n<p>Set <code>compact<\/code> to <code>true<\/code> to use the compact layout:<\/p>\n\n<pre><code>[oi_contest_schedule limit=\"20\" compact=\"true\"]\n<\/code><\/pre>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to GitHub Raw Content to retrieve the public <code>contests_all.json<\/code> feed maintained by the OI-contest-fetch project. This connection is required to obtain current contest information and occurs when the five-minute WordPress transient cache has expired.<\/p>\n\n<p>The plugin does not send visitor content, WordPress account data, or cookies. The request includes a user-agent containing the plugin version and the site's home URL. Standard network metadata, including the server IP address, is visible to GitHub when the request is made.<\/p>\n\n<p>Service and data source:<\/p>\n\n<ul>\n<li>Contest feed: https:\/\/raw.githubusercontent.com\/hanyixuanten\/OI-contest-fetch\/master\/contests_all.json<\/li>\n<li>OI-contest-fetch project: https:\/\/github.com\/hanyixuanten\/OI-contest-fetch<\/li>\n<li>GitHub Terms of Service: https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service<\/li>\n<li>GitHub General Privacy Statement: https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-general-privacy-statement<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>vblg-oi-contest-schedule<\/code> directory to <code>\/wp-content\/plugins\/<\/code>, or install the plugin ZIP through the WordPress Plugins screen.<\/li>\n<li>Activate <strong>vblg OI Contest Schedule<\/strong> through the Plugins screen.<\/li>\n<li>Open the WordPress dashboard to see the contest widget.<\/li>\n<li>To show the schedule on the front end, add the <strong>vblg OI Contest Schedule<\/strong> block to a post or page.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20contests%20are%20shown%3F\"><h3>Which contests are shown?<\/h3><\/dt>\n<dd><p>The plugin shows contests whose end time is still in the future, including contests that are currently running. Finished contests and entries without a valid URL are omitted.<\/p><\/dd>\n<dt id=\"which%20time%20zone%20is%20used%3F\"><h3>Which time zone is used?<\/h3><\/dt>\n<dd><p>Dates are formatted in the visitor's client device time zone using the browser's internationalization API. The time zone configured in the WordPress site settings is not used.<\/p><\/dd>\n<dt id=\"how%20often%20is%20the%20contest%20data%20refreshed%3F\"><h3>How often is the contest data refreshed?<\/h3><\/dt>\n<dd><p>The remote response is cached by WordPress for five minutes. After the cache expires, the next schedule request retrieves fresh data.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20data%20source%20is%20unavailable%3F\"><h3>What happens if the data source is unavailable?<\/h3><\/dt>\n<dd><p>The schedule displays a temporary-unavailable notice instead of contest entries. WordPress pages and the dashboard continue to work normally.<\/p><\/dd>\n<dt id=\"can%20i%20use%20another%20data%20source%3F\"><h3>Can I use another data source?<\/h3><\/dt>\n<dd><p>Developers can replace the feed URL with the <code>oics_contest_data_url<\/code> filter. The replacement endpoint must return the same JSON structure as the default feed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Renamed the plugin, package slug, text domain, and distribution workflows to <strong>vblg OI Contest Schedule<\/strong>.<\/li>\n<li>Renamed the shortcode to <code>[oics_oi_contest_schedule]<\/code>.<\/li>\n<li>Changed the dashboard widget to use the standard responsive layout instead of the compact layout.<\/li>\n<li>Changed translation handling to use WordPress.org language packs and excluded translation sources from release packages.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Added the upcoming contest dashboard widget.<\/li>\n<li>Added the <strong>vblg OI Contest Schedule<\/strong> editor block with limit and compact layout settings.<\/li>\n<li>Added the <code>[oics_oi_contest_schedule]<\/code> shortcode with <code>limit<\/code> and <code>compact<\/code> options.<\/li>\n<li>Added visitor-local time formatting and live countdowns.<\/li>\n<li>Added platform styling and responsive layouts.<\/li>\n<li>Added five-minute transient caching for the contest feed.<\/li>\n<li>Added English and Simplified Chinese translations.<\/li>\n<\/ul>","raw_excerpt":"Display currently running and upcoming OI contests in the WordPress dashboard or with an editor block.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/351343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=351343"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hanyixuanten"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=351343"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=351343"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=351343"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=351343"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=351343"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=351343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}