add_help_tab( array( 'id' => 'wpdo-help-overview', 'title' => __( '什麼是 WPDO', '2meet-data-optimizer' ), 'content' => self::content_overview(), ) ); // Per-tab help (matches whichever tab is active). $tab_help = array( 'dashboard' => array( __( '儀表板閱讀指南', '2meet-data-optimizer' ), 'content_dashboard' ), 'zones' => array( __( '4 個 Zone 是什麼', '2meet-data-optimizer' ), 'content_zones' ), 'classifier' => array( __( 'Classifier 解讀', '2meet-data-optimizer' ), 'content_classifier' ), 'snapshots' => array( __( '備份策略', '2meet-data-optimizer' ), 'content_snapshots' ), 'conflicts' => array( __( '衝突處理', '2meet-data-optimizer' ), 'content_conflicts' ), 'doctor' => array( __( '健康檢查解讀', '2meet-data-optimizer' ), 'content_doctor' ), 'logs' => array( __( '日誌使用', '2meet-data-optimizer' ), 'content_logs' ), 'rest-api' => array( __( 'REST API', '2meet-data-optimizer' ), 'content_rest_api' ), ); if ( isset( $tab_help[ $tab ] ) ) { [ $title, $cb ] = $tab_help[ $tab ]; $screen->add_help_tab( array( 'id' => 'wpdo-help-' . $tab, 'title' => $title, 'content' => call_user_func( array( __CLASS__, $cb ) ), ) ); } // Sidebar with persistent links. $screen->set_help_sidebar( '

' . esc_html__( '更多資源', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( 'Entity Bridge — 主維運入口', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( 'WP Site Health', '2meet-data-optimizer' ) . '

' . '

wp wpdo doctor
wp wpdo mode-audit
wp wpdo snapshot create

' ); } // ─── content templates ───────────────────────────────────────────── /** * Overview help content. * * @return string */ private static function content_overview(): string { return '

' . esc_html__( 'WP Data Optimizer 是反 EAV(meta 爆炸)的解方。', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( '核心概念:把 wp_postmeta 的高頻欄位(Hot)、TTL 暫存(Warm)、低頻欄位(Cold)、歷史資料(Archive)拆到 4 種專用表,讀寫快很多、autoload 不再爆。', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( '建議第一步:', '2meet-data-optimizer' ) . ' ' . esc_html__( '逛一遍儀表板了解現況 → 看 Entity Bridge tab 各 entity 健康卡片 → 從 1 個 entity 開始用 Migration Wizard 漸進升級 mode。', '2meet-data-optimizer' ) . '

'; } /** * Dashboard help content. * * @return string */ private static function content_dashboard(): string { return '

' . esc_html__( '儀表板顯示:', '2meet-data-optimizer' ) . '

' . ''; } /** * Zones help content. * * @return string */ private static function content_zones(): string { return '

' . esc_html__( '4 個 Zone 對應不同存取頻率與保留需求:', '2meet-data-optimizer' ) . '

' . '' . '

' . esc_html__( '不確定要哪種 → 用 Classifier,它會看 access pattern 給建議。', '2meet-data-optimizer' ) . '

'; } /** * Classifier help content. * * @return string */ private static function content_classifier(): string { return '

' . esc_html__( 'Classifier 分析 wp_postmeta 給每個 meta_key 一個 zone 建議:', '2meet-data-optimizer' ) . '

' . ''; } /** * Snapshots help content. * * @return string */ private static function content_snapshots(): string { return '

' . esc_html__( '快照保留政策(v2.2.0):', '2meet-data-optimizer' ) . '

' . '' . '

' . esc_html__( '災難還原 drill', '2meet-data-optimizer' ) . ':' . esc_html__( '建議每月做一次 dry-run 還原驗證 — wp wpdo snapshot restore (不加 --apply)即可預覽會還原什麼。', '2meet-data-optimizer' ) . '

'; } /** * Conflicts help content. * * @return string */ private static function content_conflicts(): string { return '

' . esc_html__( 'Hook 衝突偵測:當多個 plugin 在同一 WordPress 的 metadata filter 上掛 callback 時,可能造成資料寫入順序不確定 / 重複處理。', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( '常見原因:', '2meet-data-optimizer' ) . '

' . '' . '

' . esc_html__( '解法:先看 conflict-scan 詳情,必要時用 wp wpdo bridge-set off 暫停 Hook Bus 直到清理完。', '2meet-data-optimizer' ) . '

'; } /** * Doctor help content. * * @return string */ private static function content_doctor(): string { return '

' . esc_html__( '7 項自動健康檢查:', '2meet-data-optimizer' ) . '

' . '
    ' . '
  1. schema_drift — ' . esc_html__( '所有 v2 表是否存在', '2meet-data-optimizer' ) . '
  2. ' . '
  3. error_budget — ' . esc_html__( '7 天內 wp_wpdo_errors 行數', '2meet-data-optimizer' ) . '
  4. ' . '
  5. hook_conflicts — ' . esc_html__( '同上 conflicts tab', '2meet-data-optimizer' ) . '
  6. ' . '
  7. autoload_bloat — ' . esc_html__( 'wp_options autoload 大小 > 5MB 警告', '2meet-data-optimizer' ) . '
  8. ' . '
  9. postmeta_explosion — ' . esc_html__( 'wp_postmeta > 5M 行', '2meet-data-optimizer' ) . '
  10. ' . '
  11. orphan_zone_rows — ' . esc_html__( '已 idle 的 module 但 zone 表還有資料', '2meet-data-optimizer' ) . '
  12. ' . '
  13. missing_snapshot — ' . esc_html__( '在 cutover/cleanup/complete 但 7 天沒 snapshot', '2meet-data-optimizer' ) . '
  14. ' . '
' . '

' . esc_html__( '結果有 5 分鐘 transient cache,剛操作完想立刻看新值請等下個週期。', '2meet-data-optimizer' ) . '

'; } /** * Logs help content. * * @return string */ private static function content_logs(): string { return '

' . esc_html__( '日誌讀取:', '2meet-data-optimizer' ) . '

' . ''; } /** * REST API help content. * * @return string */ private static function content_rest_api(): string { return '

' . esc_html__( 'REST API 提供 zone 操作 + diagnostics endpoints。', '2meet-data-optimizer' ) . '

' . '

' . esc_html__( '所有 endpoint 用 X-WP-Nonce 認證;rate limit 預設 30/min。', '2meet-data-optimizer' ) . '

'; } }