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' );
”자체 핵무기를 개발할 예정..” 美 동맹의 불확실성 때문에 등돌린 ‘이 나라’
미국 동맹 체제에 균열을 느낀 독일의 문제의식
도널드 트럼프의 재집권 이후 유럽 전반에서 미국 동맹 체제에 대한 불안이 빠르게 확산되고 있다. 독일 역시 예외는 아니다. 독일은 전후 질서 속에서 미국의 핵우산에 안보를 상당 부분 의존해 왔지만, 트럼프 행정부가 보여온 거래 중심 동맹관은 이 구조가 언제든 흔들릴 수 있다는 인식을 심어줬다. 방위비 분담 압박과 동맹의 조건화는 독일 정치권에 현실적인 질문을 던졌다. 미국이 확실하게 개입하지 않는 상황에서도 독일과 유럽의 안보는 유지될 수 있는가라는 문제다. 이 질문이 독일의 안보 전략 전반을 다시 들여다보게 만들고 있다.
유럽 핵 억지력 논의와 독일의 입장 변화
독일 정부는 미국 의존도를 줄이기 위한 방안으로 유럽 차원의 핵 억지력 강화 가능성을 공개적으로 언급하기 시작했다. 이는 곧바로 독일의 자체 핵무장 선언을 의미하지는 않지만 기존에는 금기시되던 영역이다. 현재 유럽에서 핵무기를 보유한 국가는 영국과 프랑스뿐이다. 독일은 이 구조가 영구적일 필요는 없다는 문제 제기를 하고 있다. 프리드리히 메르츠는 의회 연설에서 핵 억지 구조 변화 가능성을 언급하면서도 논의는 초기 단계라고 선을 그었다. 다만 중요한 점은 논의 자체가 공식화됐다는 사실이다. 이는 유럽 안보가 더 이상 미국 단독 보증 체제로 유지되기 어렵다는 인식이 제도권에 들어왔음을 보여준다.
2 플러스 4 협정이라는 현실적 제약
독일의 선택지를 제한하는 가장 큰 장벽은 1990년 체결된 이른바 2+4 협정이다. 이 협정은 독일 통일을 국제적으로 승인하는 대신 군사력 규모 제한과 핵무기 비보유 원칙을 명문화했다. 독일 정부 역시 이 조약이 법적 구속력을 가진다는 점을 부정하지 않는다. 즉 독일이 독자적으로 핵무기를 개발하고 배치하는 것은 현재로서는 불가능하다. 그러나 독일 측은 이 협정이 핵무기와 관련한 전략적 논의나 유럽 차원의 집단 억지 구상까지 금지하는 것은 아니라는 해석을 내놓고 있다. 이 해석의 여지가 바로 현재 논의가 시작된 틈이다.
독일만의 문제가 아닌 유럽 전반의 흐름
이러한 움직임은 독일에만 국한되지 않는다. 나토에 가입한 스웨덴 역시 영국과 프랑스를 중심으로 한 유럽 핵 억지 구조에 대해 협의를 이어가고 있다. 전통적으로 중립 노선을 유지해 온 국가들까지 이 논의에 참여한다는 점은 상징성이 크다. 영국 정부도 관련 논의가 실제로 있었음을 공식 확인했다. 이는 미국 중심의 안보 질서가 구조적으로 재편 단계에 들어섰다는 신호로 해석된다. 유럽 국가들은 미국이 언제나 자동 개입하지 않을 수 있다는 전제를 이제는 현실로 받아들이고 있다. 핵 억지 논의는 그 결과물 중 하나다.
핵무장 논의가 갖는 전략적 메시지
독일이 실제로 핵무기를 보유할 가능성은 여전히 낮다. 법적 제약과 정치적 부담이 너무 크다. 그러나 핵무장 가능성 자체를 언급하는 것만으로도 전략적 효과는 상당하다. 이는 미국에게는 동맹 이탈 가능성을 경고하는 신호이고 러시아를 포함한 주변국에게는 유럽의 억지 의지가 여전히 살아 있다는 메시지다. 실제 행동보다 의사 표명이 먼저 작동하는 영역이 바로 핵 전략이다. 독일의 발언은 유럽 안보가 더 이상 과거의 전제 위에서 돌아가지 않는다는 점을 분명히 한다.
후기
이번 사안을 정리하면서 느낀 점은 핵무기 논의가 갑작스러운 급진 노선이라기보다 불안정한 동맹 환경에 대한 현실적 반응이라는 것이다. 독일은 여전히 조심스럽지만 더 이상 침묵하지 않는다. 말하지 않던 이야기를 꺼냈다는 사실 자체가 지금 유럽이 처한 상황을 잘 보여준다.
공부해야 할 점
2 플러스 4 협정의 법적 효력과 해석 범위 유럽 핵 억지력 구상이 나토 체제와 충돌하는 지점 미국 핵우산 약화가 유럽 안보에 미치는 구조적 영향 핵무기 보유 가능성 언급이 외교 협상에서 가지는 억지 효과
오버히트
content@viewus.co.kr
[AI 추천] 랭킹 뉴스
‘낙상 사고’ 허영만, 중환자실 이송…한 달째
람보르기니 무르시엘라고 LP 670-4 SV 수동 경매 단 5대 경매 등장
유럽의 유명 축구 구단들을 쇼핑하듯 사고있는 한국인 억만장자 여성
"동창회 나가지 마세요.." 55살 넘어 동창회 가면 안 되는 이유 3가지
"뒤통수 맞지 않으려면.." 60대 이후로 가져야할 마음가짐 3가지
"현관문 위쪽 나사를 돌려 보세요" 20년차 도어 기사의 '진짜 꿀팁'
공유하기
https://feed.viewus.co.kr/ai/article/193757/
댓글0