feat(share): align social sharing runtime
This commit is contained in:
@@ -371,6 +371,42 @@ class GlobalSchema {
|
||||
]],
|
||||
],
|
||||
],
|
||||
'share' => [
|
||||
'key' => 'share',
|
||||
'title' => '社交分享',
|
||||
'version' => '1.0.0',
|
||||
'option_key' => 'aksrt_settings',
|
||||
'groups' => [[
|
||||
'key' => 'share',
|
||||
'title' => '社交分享',
|
||||
'fields' => [
|
||||
['key' => 'share_s', 'label' => '文章分享功能', 'type' => 'switcher', 'default' => true, 'help' => '关闭后,在文章页面将不显示分享按钮。'],
|
||||
['key' => 'share_items', 'label' => '分享平台', 'type' => 'custom', 'renderer' => 'sorter', 'sanitize_type' => 'array', 'default' => [
|
||||
'enabled' => ['qzone' => 'QQ空间', 'weibo' => '微博', 'qq' => 'QQ好友', 'poster' => '海报分享', 'copy' => '复制链接'],
|
||||
'disabled' => ['facebook' => 'Facebook', 'twitter' => 'X', 'telegram' => 'Telegram', 'whatsapp' => 'WhatsApp', 'linkedin' => 'LinkedIn', 'reddit' => 'Reddit', 'line' => 'LINE', 'vk' => 'VK', 'email' => '邮件'],
|
||||
], 'options' => [
|
||||
['label' => 'QQ空间', 'value' => 'qzone'], ['label' => '微博', 'value' => 'weibo'], ['label' => 'QQ好友', 'value' => 'qq'],
|
||||
['label' => 'Facebook', 'value' => 'facebook'], ['label' => 'X', 'value' => 'twitter'], ['label' => 'Telegram', 'value' => 'telegram'],
|
||||
['label' => 'WhatsApp', 'value' => 'whatsapp'], ['label' => 'LinkedIn', 'value' => 'linkedin'], ['label' => 'Reddit', 'value' => 'reddit'],
|
||||
['label' => 'LINE', 'value' => 'line'], ['label' => 'VK', 'value' => 'vk'], ['label' => '邮件', 'value' => 'email'],
|
||||
['label' => '海报分享', 'value' => 'poster'], ['label' => '复制链接', 'value' => 'copy'],
|
||||
], 'description' => '左侧启用并拖拽排序,右侧为未启用项(同时启用的数量不建议超过 6 个)。若开启海外平台,用户网络必须能正常访问对应服务。'],
|
||||
['key' => 'wechat_share_s', 'label' => '微信分享有图', 'type' => 'switcher', 'default' => false, 'help' => '使用微信 JSAPI 在微信 App 内分享。'],
|
||||
['key' => 'wechat_share_hint', 'label' => '', 'type' => 'content', 'ui_only' => true, 'dependsOn' => ['key' => 'wechat_share_s', 'value' => true], 'content' => '<p><strong>微信分享有图配置</strong></p><p>此功能用于用户从公众号进入页面后调用微信默认分享能力,并不会额外显示分享按钮。请在公众号后台将当前站点域名配置为 JS 接口安全域名。</p><p><a href="https://mp.weixin.qq.com/" target="_blank" rel="noopener noreferrer">前往微信公众平台</a></p>'],
|
||||
['key' => 'wechat_share_option', 'label' => '微信分享有图配置', 'type' => 'fieldset', 'default' => ['appid' => '', 'app_secret' => '', 'only_logo' => false], 'dependsOn' => ['key' => 'wechat_share_s', 'value' => true], 'fields' => [
|
||||
['key' => 'appid', 'label' => 'AppID', 'type' => 'input', 'default' => ''],
|
||||
['key' => 'app_secret', 'label' => 'AppSecret', 'type' => 'input', 'default' => ''],
|
||||
['key' => 'only_logo', 'label' => '全部使用网站图标', 'type' => 'switcher', 'default' => false, 'help' => '默认自动使用页面封面图;开启后所有页面均使用网站图标。图片启用防盗链时建议开启。'],
|
||||
]],
|
||||
['key' => 'share_img', 'label' => '生成海报分享', 'type' => 'switcher', 'default' => true, 'help' => '网站图片使用 OSS 等云存储时,请先配置允许本站 Canvas 读取图片的跨域规则。'],
|
||||
['key' => 'share_img_warning', 'label' => '', 'type' => 'notice', 'ui_only' => true, 'alertType' => 'warning', 'content' => '海报图片加载失败时,请检查图片 CDN/OSS 的跨域响应头。', 'dependsOn' => ['key' => 'share_img', 'value' => true]],
|
||||
['key' => 'share_img_compatible_s', 'label' => '海报分享兼容模式', 'type' => 'switcher', 'default' => false, 'dependsOn' => ['key' => 'share_img', 'value' => true], 'help' => '通过服务端代理读取海报图片,改善跨域兼容性;会增加服务器图片处理开销。'],
|
||||
['key' => 'share_img_byimg', 'label' => '海报分享默认图片', 'type' => 'media', 'default' => get_template_directory_uri() . '/assets/img/slider-bg.jpg', 'dependsOn' => ['key' => 'share_img', 'value' => true], 'help' => '文章没有图片时使用,建议尺寸 800×500。'],
|
||||
['key' => 'share_logo', 'label' => '海报分享 LOGO', 'type' => 'media', 'default' => get_template_directory_uri() . '/assets/img/logo.png', 'dependsOn' => ['key' => 'share_img', 'value' => true], 'help' => '显示在海报底部,建议尺寸 300×100、大小 50KB 以内。'],
|
||||
['key' => 'share_desc', 'label' => '海报分享底部文案', 'type' => 'input', 'default' => '扫一扫 立即查看', 'dependsOn' => ['key' => 'share_img', 'value' => true]],
|
||||
],
|
||||
]],
|
||||
],
|
||||
'email' => \AKSRT\Settings\MailTemplates::build_schema(),
|
||||
'custom-code' => [
|
||||
'key' => 'custom-code',
|
||||
|
||||
@@ -280,28 +280,6 @@ class SchemaPostList {
|
||||
]],
|
||||
],
|
||||
],
|
||||
'share' => [
|
||||
'key' => 'share',
|
||||
'title' => '分享设置',
|
||||
'version' => '1.0.0',
|
||||
'option_key' => 'aksrt_settings',
|
||||
'groups' => [
|
||||
['key' => 'basic', 'title' => '分享按钮', 'fields' => [
|
||||
['key' => 'share_s', 'label' => '分享按钮', 'type' => 'switcher', 'default' => true, 'help' => '关闭后,在文章页面将不显示分享按钮,论坛及商城不受影响'],
|
||||
]],
|
||||
['key' => 'wechat', 'title' => '微信分享', 'fields' => [
|
||||
['key' => 'share_wechat_s', 'label' => '微信分享', 'type' => 'switch', 'default' => false],
|
||||
['key' => 'share_wechat_appid', 'label' => 'AppID', 'type' => 'input', 'default' => ''],
|
||||
['key' => 'share_wechat_app_secret', 'label' => 'AppSecret', 'type' => 'input', 'default' => ''],
|
||||
['key' => 'share_only_logo', 'label' => '仅显示Logo', 'type' => 'switch', 'default' => false],
|
||||
['key' => 'share_img_compatible_s', 'label' => '海报兼容模式', 'type' => 'switch', 'default' => false, 'description' => '启用后使用兼容模式生成分享海报'],
|
||||
['key' => 'share_img_byimg', 'label' => '海报默认图', 'type' => 'media', 'default' => ''],
|
||||
['key' => 'share_logo', 'label' => '海报LOGO', 'type' => 'media', 'default' => ''],
|
||||
['key' => 'share_img', 'label' => '分享图片', 'type' => 'media', 'default' => ''],
|
||||
['key' => 'share_desc', 'label' => '分享描述', 'type' => 'textarea', 'default' => '扫一扫 立即查看'],
|
||||
]],
|
||||
],
|
||||
],
|
||||
'submit' => [
|
||||
'key' => 'submit',
|
||||
'title' => '前台投稿',
|
||||
|
||||
@@ -551,34 +551,6 @@ trait ScriptsPart1b {
|
||||
}
|
||||
}
|
||||
|
||||
// Unified share-data builder — only when the article renders share controls.
|
||||
if (!empty($singular_assets['needs_share'])) {
|
||||
$share_data_js = get_template_directory() . '/assets/js/share-data-builder.js';
|
||||
if (file_exists($share_data_js)) {
|
||||
wp_enqueue_script(
|
||||
'aksrt-share-data',
|
||||
$base_uri . '/assets/js/share-data-builder.js',
|
||||
['loader_js'],
|
||||
(string) filemtime($share_data_js),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Poster generation is part of the article share dropdown.
|
||||
if (!empty($singular_assets['needs_share'])) {
|
||||
$poster_js = get_template_directory() . '/assets/js/poster-share.js';
|
||||
if (file_exists($poster_js)) {
|
||||
wp_enqueue_script(
|
||||
'aksrt-poster-share',
|
||||
$base_uri . '/assets/js/poster-share.js',
|
||||
['loader_js', 'aksrt-share-data'],
|
||||
(string) filemtime($poster_js),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Unified authentication page shell.
|
||||
if ($is_auth_page) {
|
||||
$enqueue_module('pages');
|
||||
|
||||
@@ -424,26 +424,16 @@ trait ScriptsPart1c {
|
||||
}
|
||||
}
|
||||
|
||||
// Post/resource share functionality
|
||||
if (!empty($singular_assets['needs_share'])) {
|
||||
$weixin_share_path = get_template_directory() . '/assets/js/weixin-share.js';
|
||||
if (file_exists($weixin_share_path)) {
|
||||
// Reference-theme share runtime: direct platform links need no JS;
|
||||
// only poster generation is loaded when a share surface can render.
|
||||
if (!empty($singular_assets['needs_share']) || is_page_template('templates/pages/page-posts-navs.php')) {
|
||||
$poster_share_path = get_template_directory() . '/assets/js/poster-share.js';
|
||||
if (file_exists($poster_share_path)) {
|
||||
wp_enqueue_script(
|
||||
'aksrt-weixin-share',
|
||||
$base_uri . '/assets/js/weixin-share.js',
|
||||
['loader_js'],
|
||||
(string) filemtime($weixin_share_path),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
$post_share_path = get_template_directory() . '/assets/js/post-share.js';
|
||||
if (file_exists($post_share_path)) {
|
||||
wp_enqueue_script(
|
||||
'aksrt-post-share',
|
||||
$base_uri . '/assets/js/post-share.js',
|
||||
['loader_js', 'aksrt-weixin-share', 'aksrt-share-data'],
|
||||
(string) filemtime($post_share_path),
|
||||
'aksrt-poster-share',
|
||||
$base_uri . '/assets/js/poster-share.js',
|
||||
['loader_js'],
|
||||
(string) filemtime($poster_share_path),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
@@ -48,10 +48,6 @@ class WeChatShare {
|
||||
'1.6.0',
|
||||
true
|
||||
);
|
||||
// Ensure our bridge runs after jweixin.
|
||||
if (wp_script_is('aksrt-weixin-share', 'registered') || wp_script_is('aksrt-weixin-share', 'enqueued')) {
|
||||
wp_script_add_data('aksrt-weixin-share', 'group', 1);
|
||||
}
|
||||
}
|
||||
|
||||
public function print_share_date(): void {
|
||||
@@ -154,12 +150,9 @@ window.WeChatShareDate = <?php echo wp_json_encode($payload, JSON_UNESCAPED_UNIC
|
||||
|
||||
private function resolve_image(): string {
|
||||
$only_logo = !empty($this->config['only_logo']);
|
||||
$default = '';
|
||||
if (!empty($this->config['share_img'])) {
|
||||
$default = (string) $this->config['share_img'];
|
||||
} elseif (class_exists('\AKSRT\Settings\Settings')) {
|
||||
$default = (string) (\AKSRT\Settings\Settings::get_value('favicon', '') ?: \AKSRT\Settings\Settings::get_value('iconpng', ''));
|
||||
}
|
||||
$default = class_exists('\\AKSRT\\Settings\\Settings')
|
||||
? (string) \AKSRT\Settings\Settings::favicon_url()
|
||||
: (string) get_site_icon_url(512);
|
||||
if ($only_logo) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
+23
-13
@@ -130,24 +130,34 @@ trait FacadeBulk {
|
||||
'dropdown' => !empty($option['dropdown']),
|
||||
];
|
||||
}
|
||||
/**
|
||||
* Share and poster settings.
|
||||
*
|
||||
* @return array{wechat_enabled:bool,wechat_appid:string,wechat_app_secret:string,only_logo:bool,compatible_s:bool,poster_img:string,poster_logo:string,share_img:string,share_desc:string}
|
||||
*/
|
||||
/** Share and poster settings using the reference theme's canonical keys. */
|
||||
public static function get_share_settings(): array {
|
||||
$settings = self::get_all();
|
||||
$wechat = is_array($settings['wechat_share_option'] ?? null) ? $settings['wechat_share_option'] : [];
|
||||
$defaults = [
|
||||
'qzone' => 'QQ空间', 'weibo' => '微博', 'qq' => 'QQ好友', 'poster' => '海报分享', 'copy' => '复制链接',
|
||||
];
|
||||
$configured = is_array($settings['share_items'] ?? null) ? $settings['share_items'] : [];
|
||||
$enabled = is_array($configured['enabled'] ?? null) ? $configured['enabled'] : $defaults;
|
||||
$allowed = ['qzone', 'weibo', 'qq', 'facebook', 'twitter', 'telegram', 'whatsapp', 'linkedin', 'reddit', 'line', 'vk', 'email', 'poster', 'copy'];
|
||||
$items = array_values(array_intersect(array_map('sanitize_key', array_keys($enabled)), $allowed));
|
||||
$poster_enabled = !isset($settings['share_img']) || !empty($settings['share_img']);
|
||||
if (!$poster_enabled) {
|
||||
$items = array_values(array_diff($items, ['poster']));
|
||||
}
|
||||
|
||||
return [
|
||||
'wechat_enabled' => !empty($settings['share_wechat_s']),
|
||||
'wechat_appid' => sanitize_text_field((string) ($settings['share_wechat_appid'] ?? '')),
|
||||
'wechat_app_secret' => sanitize_text_field((string) ($settings['share_wechat_app_secret'] ?? '')),
|
||||
'only_logo' => !empty($settings['share_only_logo']),
|
||||
'enabled' => !isset($settings['share_s']) || !empty($settings['share_s']),
|
||||
'items' => $items,
|
||||
'wechat_enabled' => !empty($settings['wechat_share_s']),
|
||||
'wechat_appid' => sanitize_text_field((string) ($wechat['appid'] ?? '')),
|
||||
'wechat_app_secret' => sanitize_text_field((string) ($wechat['app_secret'] ?? '')),
|
||||
'only_logo' => !empty($wechat['only_logo']),
|
||||
'poster_enabled' => $poster_enabled,
|
||||
'compatible_s' => !empty($settings['share_img_compatible_s']),
|
||||
'poster_img' => esc_url_raw((string) ($settings['share_img_byimg'] ?? '')),
|
||||
'poster_logo' => esc_url_raw((string) ($settings['share_logo'] ?? '')),
|
||||
'share_img' => esc_url_raw((string) ($settings['share_img'] ?? '')),
|
||||
'share_desc' => sanitize_textarea_field((string) ($settings['share_desc'] ?? '')) ?: __('扫一扫 立即查看', 'aksrt'),
|
||||
'poster_img' => esc_url_raw((string) ($settings['share_img_byimg'] ?? get_template_directory_uri() . '/assets/img/slider-bg.jpg')),
|
||||
'poster_logo' => esc_url_raw((string) ($settings['share_logo'] ?? get_template_directory_uri() . '/assets/img/logo.png')),
|
||||
'share_desc' => sanitize_text_field((string) ($settings['share_desc'] ?? '')) ?: __('扫一扫 立即查看', 'aksrt'),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -281,9 +281,7 @@ class PostDisplay {
|
||||
'like_enabled' => !isset($settings['post_like_s']) || !empty($settings['post_like_s']),
|
||||
// 参考主题无收藏开关:收藏按钮常显(字段已随 1:1 复刻移除)。
|
||||
'favorite_enabled' => true,
|
||||
// Canonical + legacy share.
|
||||
'share_enabled' => $share_enabled,
|
||||
'share_s' => $share_enabled,
|
||||
// Author card posts(参考主题无独立配置:保持默认)。
|
||||
'author_card_limit' => 6,
|
||||
'author_card_orderby' => 'views',
|
||||
@@ -346,22 +344,6 @@ class PostDisplay {
|
||||
];
|
||||
}
|
||||
|
||||
public static function get_share_settings(): array {
|
||||
$settings = Settings::get_all();
|
||||
return [
|
||||
'enabled' => !isset($settings['share_s']) || !empty($settings['share_s']),
|
||||
'wechat_appid' => sanitize_text_field((string) ($settings['wechat_share_appid'] ?? '')),
|
||||
'wechat_timestamp' => sanitize_text_field((string) ($settings['wechat_share_timestamp'] ?? '')),
|
||||
'wechat_nonce' => sanitize_text_field((string) ($settings['wechat_share_nonce'] ?? '')),
|
||||
'wechat_signature' => sanitize_text_field((string) ($settings['wechat_share_signature'] ?? '')),
|
||||
'poster_enabled' => !empty($settings['post_share_poster_s']),
|
||||
'poster_qr_enabled' => !empty($settings['post_share_poster_qr_s']),
|
||||
'poster_bg' => (string) ($settings['post_share_poster_bg'] ?? ''),
|
||||
'social_items' => is_array($settings['social_share_items'] ?? null) ? $settings['social_share_items'] : [],
|
||||
'copy_link_enabled' => !isset($settings['post_share_copylink_s']) || !empty($settings['post_share_copylink_s']),
|
||||
];
|
||||
}
|
||||
|
||||
public static function get_submit_settings(): array {
|
||||
$settings = Settings::get_all();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user