优化服务提供卡片样式,并增加仅校内访问tag
This commit is contained in:
@@ -101,6 +101,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git
|
|||||||
- 简介:服务双语字段(中文简介 / 英文简介)
|
- 简介:服务双语字段(中文简介 / 英文简介)
|
||||||
- 类别:服务分类双语字段(中文名称 / 英文名称)
|
- 类别:服务分类双语字段(中文名称 / 英文名称)
|
||||||
- 跳转链接:编辑页中的“服务跳转链接”字段
|
- 跳转链接:编辑页中的“服务跳转链接”字段
|
||||||
|
- 访问属性:编辑页中的“是否为校内服务”勾选项
|
||||||
|
|
||||||
后台新增步骤:
|
后台新增步骤:
|
||||||
1. 进入 **便民服务 > 新增便民服务**。
|
1. 进入 **便民服务 > 新增便民服务**。
|
||||||
@@ -108,6 +109,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git
|
|||||||
- 中文名称 / 英文名称
|
- 中文名称 / 英文名称
|
||||||
- 中文简介 / 英文简介
|
- 中文简介 / 英文简介
|
||||||
- 服务跳转链接
|
- 服务跳转链接
|
||||||
|
- 是否为校内服务(可选)
|
||||||
3. 设置特色图作为服务图标。
|
3. 设置特色图作为服务图标。
|
||||||
4. 在右侧选择或新建“服务分类”。
|
4. 在右侧选择或新建“服务分类”。
|
||||||
5. 发布后,该服务会自动出现在 `/services` 页面中。
|
5. 发布后,该服务会自动出现在 `/services` 页面中。
|
||||||
@@ -120,6 +122,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git
|
|||||||
说明:
|
说明:
|
||||||
- 若未设置“服务跳转链接”,前端会回退到该服务文章自身链接。
|
- 若未设置“服务跳转链接”,前端会回退到该服务文章自身链接。
|
||||||
- 若未设置特色图,前端会使用 `resources/it_logo_2024.svg` 作为默认图标。
|
- 若未设置特色图,前端会使用 `resources/it_logo_2024.svg` 作为默认图标。
|
||||||
|
- 勾选“是否为校内服务”后,服务卡片右上角会显示“仅校内访问”标签;不勾选则不显示该标签。
|
||||||
- 新增内容类型后若前台路由未生效,请进入 **设置 > 固定链接** 点击一次“保存更改”刷新重写规则。
|
- 新增内容类型后若前台路由未生效,请进入 **设置 > 固定链接** 点击一次“保存更改”刷新重写规则。
|
||||||
|
|
||||||
## 🎨 设计规范
|
## 🎨 设计规范
|
||||||
|
|||||||
@@ -110,20 +110,65 @@
|
|||||||
|
|
||||||
.services-directory-card {
|
.services-directory-card {
|
||||||
display: block;
|
display: block;
|
||||||
border: 1px solid var(--border-default);
|
position: relative;
|
||||||
border-radius: 12px;
|
overflow: hidden;
|
||||||
background: color-mix(in srgb, var(--bg-card) 94%, transparent);
|
border: 1px solid color-mix(in srgb, var(--border-default) 86%, transparent);
|
||||||
padding: 12px;
|
border-radius: 6px;
|
||||||
|
background:
|
||||||
|
linear-gradient(
|
||||||
|
132deg,
|
||||||
|
color-mix(in srgb, var(--color-primary) 10%, transparent) 0%,
|
||||||
|
transparent 38%
|
||||||
|
),
|
||||||
|
linear-gradient(
|
||||||
|
180deg,
|
||||||
|
color-mix(in srgb, var(--bg-card) 92%, #0f1726 8%) 0%,
|
||||||
|
color-mix(in srgb, var(--bg-card) 98%, transparent) 100%
|
||||||
|
);
|
||||||
|
padding: 12px 12px 11px;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: transform var(--duration-fast) var(--ease-in-out), border-color var(--duration-fast) var(--ease-in-out), box-shadow var(--duration-fast) var(--ease-in-out);
|
box-shadow:
|
||||||
|
0 14px 26px -22px color-mix(in srgb, #000000 68%, transparent),
|
||||||
|
inset 0 1px 0 color-mix(in srgb, #ffffff 8%, transparent);
|
||||||
|
transition: transform var(--duration-fast) var(--ease-in-out), border-color var(--duration-fast) var(--ease-in-out), box-shadow var(--duration-fast) var(--ease-in-out), background var(--duration-fast) var(--ease-in-out);
|
||||||
|
}
|
||||||
|
|
||||||
|
.services-directory-card::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
background:
|
||||||
|
linear-gradient(90deg, color-mix(in srgb, var(--color-primary) 64%, transparent), transparent)
|
||||||
|
top left / 58px 1px no-repeat,
|
||||||
|
linear-gradient(180deg, color-mix(in srgb, var(--color-primary) 64%, transparent), transparent)
|
||||||
|
top left / 1px 24px no-repeat;
|
||||||
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.services-directory-card:hover {
|
.services-directory-card:hover {
|
||||||
transform: translateY(-2px);
|
transform: translateY(-2px);
|
||||||
border-color: color-mix(in srgb, var(--color-primary) 52%, var(--border-default) 48%);
|
border-color: color-mix(in srgb, var(--color-primary) 58%, var(--border-default) 42%);
|
||||||
box-shadow: var(--shadow-sm);
|
box-shadow:
|
||||||
|
0 20px 32px -24px color-mix(in srgb, #000000 72%, transparent),
|
||||||
|
inset 0 1px 0 color-mix(in srgb, #ffffff 10%, transparent);
|
||||||
|
background:
|
||||||
|
linear-gradient(
|
||||||
|
132deg,
|
||||||
|
color-mix(in srgb, var(--color-primary) 14%, transparent) 0%,
|
||||||
|
transparent 40%
|
||||||
|
),
|
||||||
|
linear-gradient(
|
||||||
|
180deg,
|
||||||
|
color-mix(in srgb, var(--bg-card) 90%, #0f1726 10%) 0%,
|
||||||
|
color-mix(in srgb, var(--bg-card) 97%, transparent) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.services-directory-card:hover .services-directory-name {
|
||||||
|
color: color-mix(in srgb, var(--text-primary) 82%, var(--color-primary) 18%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.services-directory-card-head {
|
.services-directory-card-head {
|
||||||
@@ -135,7 +180,7 @@
|
|||||||
.services-directory-icon-wrap {
|
.services-directory-icon-wrap {
|
||||||
width: 54px;
|
width: 54px;
|
||||||
height: 54px;
|
height: 54px;
|
||||||
border-radius: 12px;
|
border-radius: 6px;
|
||||||
border: none;
|
border: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@@ -173,6 +218,39 @@
|
|||||||
color: var(--text-secondary);
|
color: var(--text-secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.services-directory-access {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
z-index: 2;
|
||||||
|
margin: 0;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
padding: 2px 8px 2px 7px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 0.68rem;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 1.35;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
border: 1px solid color-mix(in srgb, var(--color-primary) 62%, var(--border-default) 38%);
|
||||||
|
background: color-mix(in srgb, var(--color-primary) 20%, var(--bg-card) 80%);
|
||||||
|
color: var(--color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.services-directory-access::before {
|
||||||
|
content: "";
|
||||||
|
width: 5px;
|
||||||
|
height: 5px;
|
||||||
|
border-radius: 1px;
|
||||||
|
background: currentColor;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.services-directory-card.is-campus-only .services-directory-card-head {
|
||||||
|
padding-right: 98px;
|
||||||
|
}
|
||||||
|
|
||||||
.services-directory-desc {
|
.services-directory-desc {
|
||||||
margin: 10px 0 0;
|
margin: 10px 0 0;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
@@ -277,4 +355,15 @@
|
|||||||
.services-directory-card {
|
.services-directory-card {
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.services-directory-access {
|
||||||
|
top: 8px;
|
||||||
|
right: 8px;
|
||||||
|
font-size: 0.64rem;
|
||||||
|
padding: 2px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.services-directory-card.is-campus-only .services-directory-card-head {
|
||||||
|
padding-right: 88px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -655,6 +655,10 @@ function itstudio_get_service_excerpt_en_meta_key() {
|
|||||||
return '_itstudio_service_excerpt_en';
|
return '_itstudio_service_excerpt_en';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function itstudio_get_service_campus_only_meta_key() {
|
||||||
|
return '_itstudio_service_campus_only';
|
||||||
|
}
|
||||||
|
|
||||||
function itstudio_get_service_category_name_cn_meta_key() {
|
function itstudio_get_service_category_name_cn_meta_key() {
|
||||||
return 'itstudio_service_category_name_cn';
|
return 'itstudio_service_category_name_cn';
|
||||||
}
|
}
|
||||||
@@ -756,6 +760,7 @@ function itstudio_render_service_link_meta_box($post) {
|
|||||||
$title_en = (string) get_post_meta($post->ID, itstudio_get_service_title_en_meta_key(), true);
|
$title_en = (string) get_post_meta($post->ID, itstudio_get_service_title_en_meta_key(), true);
|
||||||
$excerpt_cn = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_cn_meta_key(), true);
|
$excerpt_cn = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_cn_meta_key(), true);
|
||||||
$excerpt_en = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_en_meta_key(), true);
|
$excerpt_en = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_en_meta_key(), true);
|
||||||
|
$is_campus_only = itstudio_is_service_campus_only($post->ID);
|
||||||
wp_nonce_field('itstudio_save_service_meta', 'itstudio_service_meta_nonce');
|
wp_nonce_field('itstudio_save_service_meta', 'itstudio_service_meta_nonce');
|
||||||
?>
|
?>
|
||||||
<p>
|
<p>
|
||||||
@@ -824,6 +829,18 @@ function itstudio_render_service_link_meta_box($post) {
|
|||||||
<p class="description">
|
<p class="description">
|
||||||
<?php esc_html_e('支持分别填写中英文名称与简介;未填写时会回退到标题/摘要。', 'itstudio'); ?>
|
<?php esc_html_e('支持分别填写中英文名称与简介;未填写时会回退到标题/摘要。', 'itstudio'); ?>
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for="itstudio_service_campus_only">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
id="itstudio_service_campus_only"
|
||||||
|
name="itstudio_service_campus_only"
|
||||||
|
value="1"
|
||||||
|
<?php checked($is_campus_only); ?>
|
||||||
|
>
|
||||||
|
<?php esc_html_e('是否为校内服务(勾选后前台显示“仅校内访问”)', 'itstudio'); ?>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -864,6 +881,14 @@ function itstudio_save_service_meta($post_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$campus_only_meta_key = itstudio_get_service_campus_only_meta_key();
|
||||||
|
$is_campus_only = isset($_POST['itstudio_service_campus_only']) && (string) wp_unslash($_POST['itstudio_service_campus_only']) === '1';
|
||||||
|
if ($is_campus_only) {
|
||||||
|
update_post_meta($post_id, $campus_only_meta_key, '1');
|
||||||
|
} else {
|
||||||
|
delete_post_meta($post_id, $campus_only_meta_key);
|
||||||
|
}
|
||||||
|
|
||||||
$url_meta_key = itstudio_get_service_url_meta_key();
|
$url_meta_key = itstudio_get_service_url_meta_key();
|
||||||
$raw_url = isset($_POST['itstudio_service_url']) ? trim((string) wp_unslash($_POST['itstudio_service_url'])) : '';
|
$raw_url = isset($_POST['itstudio_service_url']) ? trim((string) wp_unslash($_POST['itstudio_service_url'])) : '';
|
||||||
|
|
||||||
@@ -962,6 +987,15 @@ function itstudio_get_service_target_url($service_id) {
|
|||||||
return (string) get_permalink($service_id);
|
return (string) get_permalink($service_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function itstudio_is_service_campus_only($service_id) {
|
||||||
|
$service_id = (int) $service_id;
|
||||||
|
if ($service_id <= 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (string) get_post_meta($service_id, itstudio_get_service_campus_only_meta_key(), true) === '1';
|
||||||
|
}
|
||||||
|
|
||||||
function itstudio_service_admin_columns($columns) {
|
function itstudio_service_admin_columns($columns) {
|
||||||
$columns['service_category'] = __('分类', 'itstudio');
|
$columns['service_category'] = __('分类', 'itstudio');
|
||||||
$columns['service_url'] = __('跳转链接', 'itstudio');
|
$columns['service_url'] = __('跳转链接', 'itstudio');
|
||||||
|
|||||||
+6
-1
@@ -47,6 +47,7 @@ if ($services_query->have_posts()) {
|
|||||||
'excerpt_cn' => $i18n_content['excerpt_cn'],
|
'excerpt_cn' => $i18n_content['excerpt_cn'],
|
||||||
'excerpt_en' => $i18n_content['excerpt_en'],
|
'excerpt_en' => $i18n_content['excerpt_en'],
|
||||||
'has_thumb' => has_post_thumbnail($service_id),
|
'has_thumb' => has_post_thumbnail($service_id),
|
||||||
|
'is_campus_only' => function_exists('itstudio_is_service_campus_only') ? itstudio_is_service_campus_only($service_id) : false,
|
||||||
'term_name_cn' => '',
|
'term_name_cn' => '',
|
||||||
'term_name_en' => '',
|
'term_name_en' => '',
|
||||||
);
|
);
|
||||||
@@ -158,7 +159,11 @@ if (!empty($uncategorized_items)) {
|
|||||||
|
|
||||||
<div class="services-directory-grid">
|
<div class="services-directory-grid">
|
||||||
<?php foreach ($section['items'] as $item) : ?>
|
<?php foreach ($section['items'] as $item) : ?>
|
||||||
<a class="services-directory-card" href="<?php echo esc_url($item['url']); ?>" target="_blank" rel="noopener noreferrer">
|
<?php $card_classes = 'services-directory-card' . (!empty($item['is_campus_only']) ? ' is-campus-only' : ''); ?>
|
||||||
|
<a class="<?php echo esc_attr($card_classes); ?>" href="<?php echo esc_url($item['url']); ?>" target="_blank" rel="noopener noreferrer">
|
||||||
|
<?php if (!empty($item['is_campus_only'])) : ?>
|
||||||
|
<span class="services-directory-access services-directory-access-campus" data-cn="仅校内访问" data-en="Campus-only">仅校内访问</span>
|
||||||
|
<?php endif; ?>
|
||||||
<div class="services-directory-card-head">
|
<div class="services-directory-card-head">
|
||||||
<div class="services-directory-icon-wrap">
|
<div class="services-directory-icon-wrap">
|
||||||
<?php if ($item['has_thumb']) : ?>
|
<?php if ($item['has_thumb']) : ?>
|
||||||
|
|||||||
Reference in New Issue
Block a user