diff --git a/templates/parts/modal-auth.php b/templates/parts/modal-auth.php
index 39122e01..ca8c36ca 100644
--- a/templates/parts/modal-auth.php
+++ b/templates/parts/modal-auth.php
@@ -13,13 +13,13 @@ if (is_user_logged_in() || (class_exists('\AKSRT\Settings\Settings') && \AKSRT\S
$modal_ui = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::modal_ui() : [];
$images = $modal_ui['background'] ?? [];
-if (is_string($images)) {
- $images = array_filter(array_map('absint', explode(',', $images)));
-}
-$image_url = '';
-if (is_array($images) && $images) {
- $image_url = (string) wp_get_attachment_url((int) $images[array_rand($images)]);
-}
+$image_id = $images ? (int) $images[array_rand($images)] : 0;
+$image_html = $image_id > 0 ? wp_get_attachment_image($image_id, 'full', false, [
+ 'class' => 'fit-cover radius8',
+ 'alt' => get_bloginfo('name'),
+ 'loading' => 'lazy',
+ 'decoding' => 'async',
+]) : '';
$auto = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::sign_modal_auto() : ['enabled' => false, 'waiting' => 5, 'expires' => 1];
$wechat = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_weixingzh_settings() : [];
$initial_tab = !empty($wechat['priority']) && class_exists('\AKSRT\Auth\WeixinGzh') && \AKSRT\Auth\WeixinGzh::is_enabled() ? 'oauth' : 'signin';
@@ -30,12 +30,12 @@ $aksrt_auth_context = [
'redirect_to' => home_url('/'),
];
?>
-
+
diff --git a/tests/widget-system/auth-source-contract.test.cjs b/tests/widget-system/auth-source-contract.test.cjs
index 65e0d686..1b96e77a 100644
--- a/tests/widget-system/auth-source-contract.test.cjs
+++ b/tests/widget-system/auth-source-contract.test.cjs
@@ -52,6 +52,30 @@ test('authentication settings use reference defaults and canonical keys', () =>
assert.doesNotMatch(all, /user_close_login|user_close_signup|nopas_first|password_first|nopas_only|referral_registration_enabled|referral_register_field/);
});
+test('authentication galleries save attachment IDs and are consumed by both surfaces', () => {
+ const field = read('assets/admin/src/components/form/AksField.vue');
+ const gallery = read('assets/admin/src/components/form/AksGalleryField.vue');
+ const provider = read('src/Admin/SchemaProvider.php');
+ const reader = read('src/Settings/AuthReader.php');
+ const modal = read('templates/parts/modal-auth.php');
+ const page = read('templates/pages/page-sign.php');
+ const css = read('assets/css/routes/sign.css');
+
+ assert.match(field, /
\s*'attachment_ids'/);
+ assert.match(provider, /case 'attachment_ids':[\s\S]*?array_map\('absint'/);
+ assert.match(reader, /auth_gallery_ids\('sign_modal_background'\)/);
+ assert.match(reader, /auth_gallery_ids\('sign_page_background'\)/);
+ assert.match(modal, /wp_get_attachment_image\(\$image_id, 'full'/);
+ assert.match(modal, /<\?php echo \$image_html/);
+ assert.match(page, /wp_get_attachment_image_url\(\$background_id, 'full'\)/);
+ assert.match(page, /