FILE: /var/www/html/wp-includes/build/pages/options-connectors/page-wp-admin.php
SIZE: 10290 bytes
MODIFIED: 2026-08-26 05:34:27
CONTENT:
<?php
/**
* Page: options-connectors (wp-admin integrated)
* Auto-generated by build process.
* Do not edit this file manually.
*
* This version integrates with the standard WordPress admin interface,
* keeping the wp-admin sidebar and scripts/styles intact.
*
* @package wp
*/
// Global storage for options-connectors routes and menu items
global $wp_options_connectors_wp_admin_routes, $wp_options_connectors_wp_admin_menu_items;
$wp_options_connectors_wp_admin_routes = array();
$wp_options_connectors_wp_admin_menu_items = array();
/**
* Register a route for the options-connectors-wp-admin page.
*
* @param string $path Route path (e.g., '/types/$type/edit/$id').
* @param string|null $content_module Script module ID for content (stage/inspector).
* @param string|null $route_module Script module ID for route lifecycle hooks.
*/
function wp_register_options_connectors_wp_admin_route( $path, $content_module = null, $route_module = null ) {
global $wp_options_connectors_wp_admin_routes;
$route = array( 'path' => $path );
if ( ! empty( $content_module ) ) {
$route['content_module'] = $content_module;
}
if ( ! empty( $route_module ) ) {
$route['route_module'] = $route_module;
}
$wp_options_connectors_wp_admin_routes[] = $route;
}
/**
* Register a menu item for the options-connectors-wp-admin page.
* Note: Menu items are registered but not displayed in single-page mode.
*
* @param string $id Menu item ID.
* @param string $label Display label.
* @param string $to Route path to navigate to.
* @param string $parent_id Optional. Parent menu item ID.
*/
function wp_register_options_connectors_wp_admin_menu_item( $id, $label, $to, $parent_id = '' ) {
global $wp_options_connectors_wp_admin_menu_items;
$menu_item = array(
'id' => $id,
'label' => $label,
'to' => $to,
);
if ( ! empty( $parent_id ) ) {
$menu_item['parent'] = $parent_id;
}
$wp_options_connectors_wp_admin_menu_items[] = $menu_item;
}
/**
* Get all registered routes for the options-connectors-wp-admin page.
*
* @return array Array of route objects.
*/
function wp_get_options_connectors_wp_admin_routes() {
global $wp_options_connectors_wp_admin_routes;
return $wp_options_connectors_wp_admin_routes ?? array();
}
/**
* Get all registered menu items for the options-connectors-wp-admin page.
*
* @return array Array of menu item objects.
*/
function wp_get_options_connectors_wp_admin_menu_items() {
global $wp_options_connectors_wp_admin_menu_items;
return $wp_options_connectors_wp_admin_menu_items ?? array();
}
/**
* Preload REST API data for the options-connectors-wp-admin page.
* Automatically called during page rendering.
*/
function wp_options_connectors_wp_admin_preload_data() {
// Define paths to preload - same for all pages
// This must exactly match the _fields list in packages/core-data/src/entities.js,
// same fields in the same order, or the preload is never consumed.
$preload_paths = array(
'/?_fields=description,gmt_offset,home,image_max_bit_depth,image_sizes,image_size_threshold,image_strip_meta,name,site_icon,site_icon_url,site_logo,timezone_string,url,page_for_posts,page_on_front,show_on_front',
array( '/wp/v2/settings', 'OPTIONS' ),
);
// Use rest_preload_api_request to gather the preloaded data
$preload_data = array_reduce(
$preload_paths,
'rest_preload_api_request',
array()
);
// Register the preloading middleware with wp-api-fetch
wp_add_inline_script(
'wp-api-fetch',
sprintf(
'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
wp_json_encode( $preload_data )
),
'after'
);
}
/**
* Enqueue scripts and styles for the options-connectors-wp-admin page.
* Hooked to admin_enqueue_scripts.
*
* @param string $hook_suffix The current admin page.
*/
function wp_options_connectors_wp_admin_enqueue_scripts( $hook_suffix ) {
// Check all possible ways this page can be accessed:
// 1. Menu page via admin.php?page=options-connectors-wp-admin (plugin)
// 2. Direct file via options-connectors.php (Core) - screen ID will be 'options-connectors'
$current_screen = get_current_screen();
$is_our_page = (
( isset( $_GET['page'] ) && 'options-connectors-wp-admin' === $_GET['page'] ) || // phpcs:ignore WordPress.Security.NonceVerification.Recommended
( $current_screen && 'options-connectors' === $current_screen->id )
);
if ( ! $is_our_page ) {
return;
}
// Load build constants
$build_constants = require __DIR__ . '/../../constants.php';
/**
* Fires when the options-connectors admin page is initialized so extensions can register routes and menu items.
*/
do_action( 'options-connectors-wp-admin_init' );
// Preload REST API data
wp_options_connectors_wp_admin_preload_data();
// Get all registered routes
$routes = wp_get_options_connectors_wp_admin_routes();
// Get boot module asset file for dependencies
$asset_file = ABSPATH . WPINC . '/js/dist/script-modules/boot/index.min.asset.php';
if ( file_exists( $asset_file ) ) {
$asset = require $asset_file;
// This script serves two purposes:
// 1. It ensures all the globals that are made available to the modules are loaded.
// 2. It initializes the boot module as an inline script.
wp_register_script( 'options-connectors-wp-admin-prerequisites', '', $asset['dependencies'], $asset['version'], true );
$init_modules = [];
/*
* Add inline script to initialize the app using initSinglePage (no menuItems).
* The dynamic import is deferred until DOMContentLoaded so that all classic
* script dependencies of @wordpress/boot (wp-private-apis, wp-components,
* wp-theme, etc.) have finished parsing and executing before the boot module
* evaluates. Otherwise, a modulepreloaded @wordpress/boot can win the race
* against the classic-script-printing pass on fast CDN-fronted hosts in
* Chrome, evaluating before wp.theme.privateApis is defined and throwing
* "Cannot unlock an undefined object". See <https://core.trac.wordpress.org/ticket/65103>.
*/
$init_js_function = <<<'JS'
( mountId, routes, initModules ) => {
const run = async () => {
const mod = await import( "@wordpress/boot" );
mod.initSinglePage( { mountId, routes, initModules } );
};
if ( document.readyState === "loading" ) {
document.addEventListener( "DOMContentLoaded", run );
} else {
run();
}
}
JS;
wp_add_inline_script(
'options-connectors-wp-admin-prerequisites',
sprintf(
'( %s )( %s, %s, %s );',
$init_js_function,
wp_json_encode( 'options-connectors-wp-admin-app', JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $routes, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ),
wp_json_encode( $init_modules, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
)
);
// Register prerequisites style by filtering script dependencies to find registered styles
$style_dependencies = array_filter(
$asset['dependencies'],
function ( $handle ) {
return wp_style_is( $handle, 'registered' );
}
);
wp_register_style( 'options-connectors-wp-admin-prerequisites', false, $style_dependencies, $asset['version'] );
// Build dependencies for options-connectors-wp-admin module
$boot_dependencies = array(
array(
'import' => 'static',
'id' => '@wordpress/boot',
),
);
// Add init modules as static dependencies
// No init modules configured
// Add all registered routes as dependencies
foreach ( $routes as $route ) {
if ( isset( $route['route_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'static',
'id' => $route['route_module'],
);
}
if ( isset( $route['content_module'] ) ) {
$boot_dependencies[] = array(
'import' => 'dynamic',
'id' => $route['content_module'],
);
}
}
/**
* Filters the boot script-module dependencies for the
* options-connectors-wp-admin page.
*
* Surfaces extending this page can append entries to the boot
* dependency list. Each entry is an array with 'import' (string
* 'static' or 'dynamic') and 'id' (script-module handle) keys.
*
* @param array $boot_dependencies Boot dependencies for the page.
*/
$boot_dependencies = apply_filters(
'options-connectors-wp-admin_boot_dependencies',
$boot_dependencies
);
// Dummy script module to ensure dependencies are loaded
wp_register_script_module(
'options-connectors-wp-admin',
$build_constants['build_url'] . 'pages/options-connectors/loader.js',
$boot_dependencies
);
// Enqueue the boot scripts and styles
wp_enqueue_script( 'options-connectors-wp-admin-prerequisites' );
wp_enqueue_script_module( 'options-connectors-wp-admin' );
wp_enqueue_style( 'options-connectors-wp-admin-prerequisites' );
}
}
/**
* Render the options-connectors-wp-admin page.
* Call this function from add_menu_page or add_submenu_page.
* This renders within the normal WordPress admin interface.
*/
function wp_options_connectors_wp_admin_render_page() {
?>
<style>
/* Critical styles to prevent layout shifts - inlined for immediate application */
#wpwrap {
overflow-y: auto;
}
body.js {
background: #fff;
}
/* Reset wp-admin padding */
body.js #wpcontent {
padding-inline-start: 0;
}
body.js #wpbody-content {
padding-bottom: 0;
}
/* Hide legacy admin elements */
body.js #wpbody-content > div:not(.boot-layout-container):not(#screen-meta) {
display: none;
}
body.js #wpfooter {
display: none;
}
/* Accessibility regions */
.a11y-speak-region {
inset-inline-start: -1px;
top: -1px;
}
/* Admin menu indicators */
ul#adminmenu a.wp-has-current-submenu::after,
ul#adminmenu > li.current > a.current::after {
border-inline-end-color: #fff;
}
/* Media frame fix */
.media-frame select.attachment-filters:last-of-type {
width: auto;
max-width: 100%;
}
/* Responsive overflow fix for #wpwrap */
@media (min-width: 782px) {
#wpwrap {
overflow-y: initial;
}
}
</style>
<div id="options-connectors-wp-admin-app" class="boot-layout-container"></div>
<?php
}
// Hook the enqueue function to admin_enqueue_scripts
add_action( 'admin_enqueue_scripts', 'wp_options_connectors_wp_admin_enqueue_scripts' );
티셔츠가 마를 때까지 드라마 줄거리, "슬픔을 파는 진부함과 다르다"

결말이 어떻게 되는지,
불륜이 진짜인지 궁금해서
검색만 반복하다 지친 분들.
답부터 드리고 시작한다.
티셔츠가 마를 때까지는
일본 TBS 금요드라마로
2026년 7월 10일 시작했고
국내에서는 넷플릭스에서
매주 볼 수 있다.
현재 방영 중인 작품이라
결말은 아직 나오지 않았다.
결말 스포를 찾고 계셨다면
세상 어디에도 없으니
헛수고는 여기서 멈추시라.
대신 떡밥 정리는 아래에 있다.
1. 줄거리, 셋째 금요일에
행복이 실종됐다
마흔 살 사키코는
결혼정보지 편집자다.
다정한 카페 주인 남편 미츠루와
남부럽지 않게 살고 있었다.
그런데 어느 날,
고속버스 전락 사고가 터진다.
남편 미츠루는 실종되고
같은 사고로 다른 부부의 아내
아즈사는 세상을 떠난다.
남겨진 두 사람,
사키코와 아즈사의 남편 소노다.
슬픔을 나누며 가까워지던 중
충격적인 사실을 알게 된다.
미츠루와 아즈사가
매달 셋째 금요일마다
코인런드리에서 몰래
만나고 있었다는 것.
제목의 의미가 여기서 나온다.
티셔츠가 마를 때까지,
딱 그만큼의 시간 동안
두 사람은 무엇을 했는가.
이게 이 드라마의 전부다.
2. 등장인물, 연기 맛집 보증 라인업
사키코 (아오이 유우)
남편의 비밀을 파헤치는 아내.
오열 대신 꾹 눌러 담는
절제된 슬픔 연기가 일품이다.
미츠루 (마츠야마 켄이치)
실종된 카페 주인 남편.
데스노트 L이 이렇게
사람 속을 태우는 남편이 됐다.
아즈사 (카호)
헌책방에서 일하던 아내.
사고로 사망, 비밀만 남겼다.
소노다 (나카지마 아유무)
아즈사의 남편, 제과회사 직원.
사키코와 같은 처지가 되어
미묘한 감정선을 쌓아간다.
이 외에 타카하시 후미야,
사이토 아스카, 릴리 프랭키가
극의 틈을 채운다.
3. 방송 정보 총정리
|
구분
|
정보
|
|
방송사
|
일본 TBS 금요드라마
|
|
첫방송
|
2026년 7월 10일
|
|
국내 시청
|
넷플릭스
|
|
각본
|
우부카타 미쿠
|
|
연출
|
도이 노부히로 외
|
|
주제가
|
스피츠 ‘낯선 실’
|
제작진 체급부터 확인하자.
각본 우부카타 미쿠는
silent로 일본 열도를
울린 그 작가다.
연출 도이 노부히로는
꽃다발 같은 사랑을 했다의
그 감독. 여기에 주제가가
스피츠라니, 이 조합은
반칙에 가깝다.
4. 결말 떡밥 정리,
불륜이 아닐 수도 있다
✓ 3화에서 밝혀진 사실.
미츠루는 애초에 그 버스에
타지 않았다.
즉 사망이 아니라 잠적이다.
✓ 미츠루의 면허증에는
분실 재발급 기록이 6번이나 있다.
일본 시청자들 사이에서는
젊은 치매, 즉 기억에 관한
병을 숨겼다는 고찰이 유력하다.
✓ 두 사람의 만남에는
호텔도, 밀회의 흔적도 없다.
남은 건 수족관 티켓과
불꽃놀이 표 정도.
불륜치고는 너무 건전해서
오히려 수상하다.
✓ 그래서 현재 유력한 결말은
불륜이 아닌 다른 비밀,
그리고 누구도 단죄받지 않는
착지라는 예상이다.
매주 금요일 방송이니
결말 확인까지 함께 달리면 된다.
5. 슬픔을 파는 드라마들과의 차이
솔직히 1화를 볼 때는
전개가 느려서
빨래가 마르는 속도로
이야기가 진행되나 싶었다.
그런데 4화쯤 오니 알겠더라.
이 느림은 계산된 것이다.
배우자를 잃은 사람에게
세상은 ‘불쌍한 사람’ 역할을
강요한다. 그런데 이 드라마는
묻는다. 언제까지 불쌍해야
행복해질 자격이 생기냐고.
4화의 불꽃놀이 장면,
소노다의 고백이 폭죽 소리에
묻히는 연출은 올해 본
드라마 장면 중 최고였다.
말하지 않음으로써
더 크게 말하는 연출.
silent 콤비는 침묵을
쓰는 법을 아는 사람들이다.
다만 답답한 전개에
약한 분들에게는
완결 후 정주행을 권한다.
이건 배려의 말이다.
6. 빨래가 다 마르기 전에
코인런드리에서
티셔츠가 마르는 시간은
길어야 한 시간 남짓이다.
그 한 시간의 비밀 때문에
남은 사람들의 인생이
통째로 젖어버렸다.
과연 셋째 금요일의 진실은
무엇일지, 금요일 밤마다
넷플릭스 앞에서
확인해 보시길 바란다.
결말이 공개되면
이 블로그에서 바로
정리해 드리겠다.
#티셔츠가마를때까지 #T셔츠가마를때까지
#티셔츠가마를때까지줄거리
#티셔츠가마를때까지결말
#티셔츠가마를때까지등장인물
#아오이유우 #마츠야마켄이치
#일본드라마추천 #넷플릭스일드
#우부카타미쿠
뮤직파일러
content@viewus.co.kr
[AI 추천] 랭킹 뉴스
‘낙상 사고’ 허영만, 중환자실 이송…한 달째
람보르기니 무르시엘라고 LP 670-4 SV 수동 경매 단 5대 경매 등장
유럽의 유명 축구 구단들을 쇼핑하듯 사고있는 한국인 억만장자 여성
"동창회 나가지 마세요.." 55살 넘어 동창회 가면 안 되는 이유 3가지
"뒤통수 맞지 않으려면.." 60대 이후로 가져야할 마음가짐 3가지
"현관문 위쪽 나사를 돌려 보세요" 20년차 도어 기사의 '진짜 꿀팁'
공유하기
https://feed.viewus.co.kr/ai/article/282750/
댓글0