4801682192
Tests / PHP Lint (pull_request) Successful in 7s
TMDO_Playlist::register() 舊版偵測 TMPL_Main 類別, 在 partner 外掛中並不存在(或載入太晚),偵測實際完全靠 file_exists() 後備 撐著——程式碼讀起來像在驗證「partner 已載入」,實際只驗證了「目錄存在」。 改用 TMPL_VERSION / TMPL_PLUGIN_DIR(保留確實存在的 TMPL_Plugin),兩者在 partner 主檔的檔案解析當下即 define,早於 plugins_loaded,故本 AddOn bootstrap 的 :6 時點確實可用。 file_exists() 後備保留不動,行為不變;但偵測不再是死碼,即使將來移除後備也 不會重演 infocards-addon 那種「整個 AddOn 靜默失效」的事故。 同一版本另含先前未提交的 schema 工作:補齊 expected_columns / indexes, 並將 registry 索引 config key 由 expected_indexes 更正為 indexes (wp_parse_args() 會靜默丟棄未知 key,索引期望值先前等同從未送達)。 實測驗證(mu-plugin 於 plugins_loaded:6 量測真實請求): 新常數 AVAILABLE;wp wpdo doctor 89 OK / 0 FAIL;表註冊欄位與索引 100% 完整。
159 lines
5.5 KiB
PHP
159 lines
5.5 KiB
PHP
<?php
|
||
/**
|
||
* TMDO_Playlist — integration with 2meet-playlist (Wave 3 / v2.2.0).
|
||
*
|
||
* 5 張表的歌單系統。註冊全部 + 含 fulltext index 的 2mpl_songs 適合
|
||
* benchmark / doctor 觀察。
|
||
*
|
||
* @package WP_Data_Optimizer
|
||
* @since 2.0.0
|
||
*/
|
||
|
||
if ( ! defined( 'ABSPATH' ) ) {
|
||
exit;
|
||
}
|
||
|
||
// phpcs:disable Squiz.Commenting.FunctionComment.Missing,Squiz.Commenting.InlineComment.InvalidEndChar,Generic.Commenting.DocComment.MissingShort,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.PHP.YodaConditions,Generic.CodeAnalysis.EmptyStatement -- v2.0.0 partner integrations: pure registration helpers + intentional silent catches.
|
||
|
||
/**
|
||
* 2meet-playlist 整合。
|
||
*/
|
||
final class TMDO_Playlist {
|
||
|
||
/**
|
||
* 偵測以常數優先:`TMPL_VERSION` / `TMPL_PLUGIN_DIR` 在 2meet-playlist 主檔的
|
||
* **檔案解析當下**(第 34/36 行)即 define,早於 `plugins_loaded`;本 AddOn
|
||
* bootstrap 掛在 `plugins_loaded:6`,故此時常數已可用。
|
||
*
|
||
* 舊版偵測的 `TMPL_Main` 類別在 2meet-playlist 中**並不存在**;`TMPL_Plugin` 雖存在,
|
||
* 但要到 `plugins_loaded:30`(`tmpl_run_plugin`)才 require,在 :6 當下必定 MISSING。
|
||
* 偵測實際完全靠 `file_exists()` 撐著。保留 file_exists 作最終後備,但常數檢查
|
||
* 現在真的有效——即使將來移除後備也不會像 infocards 那樣整個 AddOn 靜默失效。
|
||
*/
|
||
public static function register(): void {
|
||
$detected = defined( 'TMPL_VERSION' )
|
||
|| defined( 'TMPL_PLUGIN_DIR' )
|
||
|| class_exists( 'TMPL_Plugin' )
|
||
|| file_exists( WP_PLUGIN_DIR . '/2meet-playlist/2meet-playlist.php' );
|
||
if ( ! $detected ) {
|
||
return;
|
||
}
|
||
add_action( 'wpdo_register_custom_tables', array( __CLASS__, 'register_custom_tables' ) );
|
||
}
|
||
|
||
public static function register_custom_tables( TMDO_Custom_Table_Registry $registry ): void {
|
||
$tables = array(
|
||
'2mpl_singer_settings' => array(
|
||
'primary_key' => 'id',
|
||
'post_type_link' => 'hp_vendor',
|
||
'expected_columns' => array(
|
||
'id' => 'BIGINT',
|
||
'vendor_id' => 'BIGINT',
|
||
'is_accepting_requests' => 'TINYINT',
|
||
'show_queue_public' => 'TINYINT',
|
||
'request_limit_per_ip' => 'SMALLINT',
|
||
'request_limit_minutes' => 'SMALLINT',
|
||
'banner_text' => 'VARCHAR',
|
||
'enable_sound_notification' => 'TINYINT',
|
||
'push_subscription' => 'TEXT',
|
||
'created_at' => 'DATETIME',
|
||
'updated_at' => 'DATETIME',
|
||
),
|
||
'indexes' => array(
|
||
'vendor_id' => array( 'vendor_id' ),
|
||
),
|
||
),
|
||
'2mpl_songs' => array(
|
||
'primary_key' => 'id',
|
||
'post_type_link' => null,
|
||
'expected_columns' => array(
|
||
'id' => 'BIGINT',
|
||
'vendor_id' => 'BIGINT',
|
||
'title' => 'VARCHAR',
|
||
'artist' => 'VARCHAR',
|
||
'notes' => 'TEXT',
|
||
'is_visible' => 'TINYINT',
|
||
'is_deleted' => 'TINYINT',
|
||
'request_count' => 'INT',
|
||
'created_at' => 'DATETIME',
|
||
'updated_at' => 'DATETIME',
|
||
),
|
||
'indexes' => array(
|
||
'vendor_visible' => array( 'vendor_id', 'is_visible', 'is_deleted' ),
|
||
'vendor_requests' => array( 'vendor_id', 'request_count' ),
|
||
'ft_search' => array( 'title', 'artist' ),
|
||
),
|
||
),
|
||
'2mpl_queue' => array(
|
||
'primary_key' => 'id',
|
||
'post_type_link' => null,
|
||
'expected_columns' => array(
|
||
'id' => 'BIGINT',
|
||
'session_id' => 'BIGINT',
|
||
'vendor_id' => 'BIGINT',
|
||
'song_id' => 'BIGINT',
|
||
'display_title' => 'VARCHAR',
|
||
'display_artist' => 'VARCHAR',
|
||
'requester_name' => 'VARCHAR',
|
||
'requester_ip_hash' => 'CHAR',
|
||
'status' => 'VARCHAR',
|
||
'sort_order' => 'INT',
|
||
'vote_count' => 'INT',
|
||
'requested_at' => 'DATETIME',
|
||
'completed_at' => 'DATETIME',
|
||
),
|
||
'indexes' => array(
|
||
'vendor_status_order' => array( 'vendor_id', 'status', 'sort_order' ),
|
||
'vendor_status_time' => array( 'vendor_id', 'status', 'requested_at' ),
|
||
'song_id' => array( 'song_id' ),
|
||
'session_id' => array( 'session_id' ),
|
||
),
|
||
),
|
||
'2mpl_rate_limits' => array(
|
||
'primary_key' => 'id',
|
||
'post_type_link' => null,
|
||
'expected_columns' => array(
|
||
'id' => 'BIGINT',
|
||
'vendor_id' => 'BIGINT',
|
||
'ip_hash' => 'CHAR',
|
||
'request_count' => 'SMALLINT',
|
||
'window_start' => 'DATETIME',
|
||
),
|
||
'indexes' => array(
|
||
'vendor_ip_window' => array( 'vendor_id', 'ip_hash', 'window_start' ),
|
||
),
|
||
),
|
||
'2mpl_sessions' => array(
|
||
'primary_key' => 'id',
|
||
'post_type_link' => null,
|
||
'expected_columns' => array(
|
||
'id' => 'BIGINT',
|
||
'vendor_id' => 'BIGINT',
|
||
'event_id' => 'BIGINT',
|
||
'title' => 'VARCHAR',
|
||
'status' => 'VARCHAR',
|
||
'started_at' => 'DATETIME',
|
||
'ended_at' => 'DATETIME',
|
||
),
|
||
'indexes' => array(
|
||
'vendor_status' => array( 'vendor_id', 'status' ),
|
||
'vendor_started' => array( 'vendor_id', 'started_at' ),
|
||
'event_id' => array( 'event_id' ),
|
||
),
|
||
),
|
||
);
|
||
foreach ( $tables as $table_name => $meta ) {
|
||
$registry->register(
|
||
'2meet-playlist',
|
||
array(
|
||
'table_name' => $table_name,
|
||
'primary_key' => $meta['primary_key'],
|
||
'post_type_link' => $meta['post_type_link'],
|
||
'expected_columns' => $meta['expected_columns'],
|
||
'indexes' => $meta['indexes'],
|
||
)
|
||
);
|
||
}
|
||
}
|
||
}
|