Files
sber-med-wordpress/med-diagnostics.php
T

180 lines
6.5 KiB
PHP

<?php
/**
* Plugin Name: Med Diagnostics
* Description: Интеграция сервиса «Диагностика по видео» (med.my-dpr.ru) в WordPress. Выводит вёрстку сервиса через шорткод [med_diagnostics].
* Version: 1.0.0
* Author: apuc
* License: GPL-2.0-or-later
* Text Domain: med-diagnostics
*
* Использование:
* [med_diagnostics] — вставить блок диагностики
* [med_diagnostics title="Мой заголовок"] — со своим заголовком
*
* URL API можно изменить в настройках: Настройки → Med Diagnostics.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Прямой доступ запрещён
}
define( 'MED_DIAG_VERSION', '1.0.0' );
define( 'MED_DIAG_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
/**
* URL API-бэкенда (Flask-приложение med.my-dpr.ru).
* Можно переопределить фильтром: add_filter('med_diag_api_url', fn() => 'https://...');
*/
function med_diag_api_url() {
$url = get_option( 'med_diag_api_url', 'https://med.my-dpr.ru' );
return apply_filters( 'med_diag_api_url', untrailingslashit( $url ) );
}
/* ─── Регистрация ассетов ─────────────────────────────────── */
add_action( 'wp_enqueue_scripts', 'med_diag_register_assets' );
function med_diag_register_assets() {
wp_register_style(
'med-diag-css',
MED_DIAG_PLUGIN_URL . 'assets/css/med-diag.css',
array(),
MED_DIAG_VERSION
);
wp_register_script(
'med-diag-js',
MED_DIAG_PLUGIN_URL . 'assets/js/med-diag.js',
array(),
MED_DIAG_VERSION,
true // в футере
);
wp_localize_script( 'med-diag-js', 'MED_DIAG', array(
'apiUrl' => med_diag_api_url(),
) );
}
/* ─── Шорткод ─────────────────────────────────────────────── */
add_shortcode( 'med_diagnostics', 'med_diag_shortcode' );
function med_diag_shortcode( $atts ) {
$atts = shortcode_atts(
array(
'title' => '🩺 Диагностика по видео',
),
$atts,
'med_diagnostics'
);
wp_enqueue_style( 'med-diag-css' );
wp_enqueue_script( 'med-diag-js' );
ob_start();
?>
<div class="med-diag" id="medDiagApp">
<h2 class="med-diag-title"><?php echo esc_html( $atts['title'] ); ?></h2>
<p class="med-diag-subtitle">Загрузите видео с лицом — получите оценку состояния здоровья</p>
<div class="med-card med-scan-section" id="scanSection">
<h3>📷 Сканирование</h3>
<p class="med-scan-desc">Наведите камеру на лицо — мы сделаем 300 кадров и проведём анализ</p>
<button class="med-scan-btn" id="scanBtn">📷 Сканировать</button>
</div>
<div class="med-card">
<h3>Загрузка видео</h3>
<div class="med-upload-area" id="uploadArea">
<div class="med-icon">📹</div>
<p><strong>Нажмите или перетащите видео сюда</strong></p>
<p class="med-hint">MP4, AVI, MOV, MKV • до 100 МБ • 10–15 секунд • лицо анфас</p>
<input type="file" id="fileInput" accept="video/*">
</div>
<div style="text-align:center">
<button class="med-btn" id="analyzeBtn" disabled>🔍 Анализировать</button>
</div>
<div class="med-progress-container" id="progressContainer">
<div class="med-progress-bar">
<div class="med-progress-fill" id="progressFill"></div>
</div>
<div class="med-progress-text" id="progressText">Подготовка...</div>
</div>
</div>
<div class="med-card med-result" id="resultCard">
<div class="med-result-header">
<h3 style="margin:0">📋 Результат анализа</h3>
<button class="med-btn-secondary" onclick="location.reload()">🔄 Новый анализ</button>
</div>
<div id="resultContent"></div>
</div>
</div>
<!-- Модал сканирования с камеры -->
<div class="med-scan-modal" id="scanModal">
<div class="med-scan-video-wrap">
<video class="med-scan-video" id="scanVideo" autoplay playsinline muted></video>
</div>
<div class="med-scan-progress">
<div id="scanProgressText">Кадров: 0 / 300 (0%)</div>
<div class="med-scan-progress-bar">
<div class="med-scan-progress-fill" id="scanProgressFill"></div>
</div>
</div>
<button class="med-scan-cancel" id="scanCancelBtn">✖ Отмена</button>
<div class="med-scan-hint">Держите лицо в круге, смотрите прямо в камеру, не двигайтесь</div>
</div>
<?php
return ob_get_clean();
}
/* ─── Настройки (Настройки → Med Diagnostics) ─────────────── */
add_action( 'admin_menu', 'med_diag_admin_menu' );
function med_diag_admin_menu() {
add_options_page(
'Med Diagnostics',
'Med Diagnostics',
'manage_options',
'med-diagnostics',
'med_diag_settings_page'
);
}
add_action( 'admin_init', 'med_diag_register_settings' );
function med_diag_register_settings() {
register_setting( 'med_diag_settings', 'med_diag_api_url', array(
'type' => 'string',
'sanitize_callback' => 'esc_url_raw',
'default' => 'https://med.my-dpr.ru',
) );
}
function med_diag_settings_page() {
?>
<div class="wrap">
<h1>Med Diagnostics</h1>
<form method="post" action="options.php">
<?php settings_fields( 'med_diag_settings' ); ?>
<table class="form-table" role="presentation">
<tr>
<th scope="row"><label for="med_diag_api_url">URL API-бэкенда</label></th>
<td>
<input type="url" id="med_diag_api_url" name="med_diag_api_url"
value="<?php echo esc_attr( med_diag_api_url() ); ?>" class="regular-text" />
<p class="description">Адрес Flask-приложения, которое выполняет анализ (по умолчанию https://med.my-dpr.ru).</p>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
<hr>
<h2>Использование</h2>
<p>Вставьте шорткод <code>[med_diagnostics]</code> в любую страницу или запись.</p>
<p>Дополнительные параметры: <code>[med_diagnostics title="Мой заголовок"]</code></p>
<p><strong>Важно:</strong> используйте шорткод один раз на странице.</p>
</div>
<?php
}