# 萨龙网络 - llms-full.txt ## 文章 # WordPress龙霄主题对象存储功能完全指南:告别服务器存储瓶颈,开启云端加速时代 **URL:** https://salongweb.com/wordpress-longxiao-object-storage.html ## 一、为什么你的 WordPress 站点需要对象存储? 随着网站内容日益丰富,图片、视频、文档等媒体文件占用的存储空间与带宽消耗已成为制约 WordPress 站点性能的核心瓶颈。传统方案中,所有媒体文件均存储于 WordPress 所在的应用服务器,不仅挤占宝贵的磁盘空间,更在高并发访问时直接拖垮服务器响应速度。 龙霄主题内置的原生对象存储功能模块,彻底解决了这一痛点。该模块深度集成了阿里云 OSS、腾讯云 COS、七牛云 Kodo 三大主流云存储服务商,无需安装任何第三方插件即可实现媒体文件的云端存储与 CDN 加速分发。与 WordPress 原生媒体库及通用对象存储插件相比,龙霄主题的对象存储方案具备以下差异化优势: - **原生深度集成**:无需安装第三方插件即可使用,所有配置入口统一集成在主题选项面板中,与主题的缓存体系、权限系统、多语言框架无缝衔接。 - **上传即同步**:媒体文件在本地写入的同时自动上传至云端存储,支持本地备份可选保留策略,确保数据冗余安全。 - **全自动 URL 重写**:附件上传后,前端所有引用地址自动替换为云端 CDN 加速域名,开发者无需修改任何模板代码。 - **批量同步机制**:媒体库内置批量同步功能,支持一键将历史媒体文件全部迁移至云端,并提供实时进度反馈。 - **智能删除联动**:在 WordPress 后台删除附件时,云端对应的存储文件自动同步删除,避免存储空间浪费。 - **本地回退保障**:当云端上传失败时自动回退至本地存储,确保上传流程不中断。 ## 二、核心特性深度解读 ### 2.1 三朵云原生支持,灵活切换 龙霄主题的对象存储模块内置了对国内三大主流云存储服务的完整 SDK 集成: - **阿里云 OSS**:配置 AccessKey ID、AccessKey Secret、Region、Bucket 名称及绑定域名,即可启用。适用于已有阿里云基础设施的站点。 - **腾讯云 COS**:支持 APP ID、SecretId、SecretKey 与 Region 配置,Bucket 名称自动规范化处理,开箱即用。 - **七牛云 Kodo**:配置 AccessKey、SecretKey 与 Bucket 名称,支持自动获取 Bucket 绑定域名,配置最为简洁。 三大服务商之间可在后台一键切换,切换后新上传的媒体文件自动写入新的存储空间,历史文件不受影响,提供业务迁移的平滑过渡。 ![](https://pic.salongweb.com/2026/07/object-storage-1.webp)### 2.2 双模式上传策略:云端专用与本地备份并存 龙霄主题独创的双模式上传策略赋予站点管理员灵活的数据管控能力: - **云端专用模式**:媒体文件上传时同步写入本地与云端,本地文件写入成功后返回云端 URL 给前端使用,本地文件作为即时备份留存。适用于”数据本地+分发云端”的合规场景。 - **纯云端模式**:文件仅写入本地临时路径,上传至云端成功后删除本地文件,所有前端请求全部由 CDN 响应。此模式下服务器存储开销降至最低,适合存储空间紧张或媒体文件量极大的站点。 两种模式通过配置面板中的”本地存储开关”一键切换,无需任何代码级别的调整。 ### 2.3 批量同步全流程自动化 对于已有大量历史媒体文件的存量站点,龙霄主题提供了完整的批量同步方案。在 WordPress 媒体库列表页的批量操作下拉菜单中新增了”同步到对象存储”选项,操作流程如下: 1. 在媒体库中勾选需要同步的附件(支持全选) 2. 选择”同步到对象存储”批量操作 3. 可选”同步成功后删除本地媒体文件” 4. 点击”应用”按钮,确认弹窗后系统自动启动逐个同步 5. 前端实时显示同步进度条与计数 6. 同步完成后展示结果摘要——成功、失败、跳过数量及每项详情 整个过程无需离开后台页面,无需手动执行任何命令行脚本,产品运营人员即可独立完成全站媒体文件的云端迁移。 ![](https://pic.salongweb.com/2026/07/object-storage-2.webp)### 2.4 附件生命周期全链路管理 龙霄主题的对象存储贯穿附件从上传到删除的完整生命周期: - **上传阶段**:通过 ObjectStorage 类的 upload 方法完成本地写入 + 云端同步(或纯云端模式),返回的 URL 直接写入附件元数据。 - **展示阶段**:通过 WordPress 的 `wp_get_attachment_url` 和 `wp_get_attachment_image_src` 过滤器,所有前端 API 返回的附件地址自动替换为云端 CDN 地址,主题、插件、古腾堡编辑器无一例外。 - **删除阶段**:当管理员在 WordPress 中删除附件时,系统自动调用云存储 SDK 的 delete 方法删除对应云端文件,并清空附件的存储元数据。若启用了本地备份模式,本地文件同样被清理。 - **查询阶段**:提供 `isLocalFile()` 方法以判断指定附件是否已存储在云端,避免重复同步。 ## 三、部署配置实操引导 以下为龙霄主题对象存储功能的标准部署流程,仅需在 WordPress 后台完成操作,无需触及服务器命令。 ### 步骤一:初始化云存储服务 首先确保你已拥有目标云服务商的存储空间(Bucket),以阿里云 OSS 为例: 1. 登录阿里云控制台,进入对象存储 OSS 服务 2. 创建或选择已有 Bucket,记录 Bucket 名称、Region 信息 3. 在 RAM 访问控制中创建 AccessKey,记录 AccessKey ID 与 AccessKey Secret 4. 可选:为 Bucket 绑定自定义域名并开启 CDN 加速 腾讯云 COS 与七牛云 Kodo 的准备工作流程类似,需分别获取对应的 API 密钥与 Bucket 信息。 ### 步骤二:在龙霄主题中完成配置 1. 进入 WordPress 后台 → 龙霄主题设置 → 媒体选项 2. 在”对象存储”配置区域,从服务商下拉菜单中选择你的云存储提供商(阿里云 OSS / 腾讯云 COS / 七牛云 Kodo) 3. 依次填写认证密钥、存储区域、Bucket 名称及自定义域名(可选) 4. 根据需求选择”本地存储开关”状态: - 开启:本地与云端双重存储,本地文件作为备份保留 - 关闭:仅保留云端文件,上传成功后删除本地临时文件 5. 点击”保存设置”,系统自动验证配置的有效性 ### 步骤三:验证并加速 1. 上传一张测试图片到 WordPress 媒体库 2. 查看附件详情中的 URL 地址,确认已替换为绑定的云端域名 3. 访问前端页面,使用浏览器开发者工具检查图片请求的响应头,确认已命中 CDN 缓存 4. 运行网站速度测试工具(如 Google PageSpeed Insights),对比启用前后的性能指标 ## 四、业务落地案例 ### 案例一:跨境电商独立站全球媒体加速 **背景**:某跨境电商独立站以东南亚与欧美用户为主,站点包含大量产品图集、营销 Banner 与视频素材。启用龙霄主题前,全部媒体文件存放于香港单台服务器,海外用户访问产品页面时图片加载缓慢,严重影响转化率。 **解决方案**:通过龙霄主题对象存储功能,将媒体文件全量同步至腾讯云 COS,并开启全球 CDN 加速。配置步骤仅耗时 15 分钟,同步约 12GB 历史媒体文件在 40 分钟内完成。 **效果数据**: - 产品页面首屏加载时间:4.8 秒 → 1.2 秒(降低 75%) - 服务器月度带宽支出:下降约 68% - 媒体文件可用性:从 99.5% 提升至 99.99%(云存储多区域冗余) ### 案例二:高清摄影社区站大文件存储 **背景**:某摄影社区站允许用户上传全分辨率 RAW 格式与 JPEG 原图,单文件可达 50MB 以上。WordPress 默认的 Web 服务器存储方案在存储成本与访问速度上均无法满足需求。 **解决方案**:使用龙霄主题对象存储对接七牛云 Kodo,配置纯云端模式(不保留本地副本),配合七牛自带的图片处理 API 实现实时缩略图裁剪与 WebP 格式转换。 **效果数据**: - 服务器磁盘使用率:从 85% 降至 12% - 图片请求响应延迟:平均降低 62% - 每月存储成本:相比服务器扩展磁盘方案降低 40% ## 五、性能对比与功能测试 ### 5.1 加载速度对比 我们在一台配置为 2 核 4GB 的云服务器上搭建了龙霄主题站点,使用同一组包含 50 张高清图片(总计约 120MB)的测试页面,分别在开启与关闭对象存储功能下进行了 10 轮测试取平均值: 指标本地存储对象存储 + CDN提升幅度首字节时间 (TTFB)380ms210ms44.7%页面完全加载时间8.2s2.1s74.4%服务器 CPU 峰值68%22%67.6%服务器带宽占用45 Mbps3 Mbps93.3%### 5.2 服务器负载对比 通过持续 10 分钟的并发压力测试(50 个并发用户连续访问),启用对象存储后服务器的各项资源指标均有显著改善: - MySQL 查询数:降低约 35%(因媒体 URL 无需动态处理) - PHP-FPM 进程数:降低约 50%(静态文件请求不再经过 PHP 处理) - 磁盘 I/O 等待:从 15% 降至接近于零 ## 六、常见问题排查指南 ### 6.1 配置失败:密钥验证不通过 **现象**:保存配置后再次进入页面发现配置未生效,或上传文件时提示”对象存储服务商配置无效”。 **排查步骤**: 1. 确认密钥是否具有正确的权限:阿里云需确保 RAM 用户拥有 OSS 读写权限(AliyunOSSFullAccess),腾讯云需确认 COS 服务的 API 密钥已启用 2. 检查密钥是否包含隐藏字符:建议在文本编辑器中重新复制粘贴 3. 确认 Bucket 名称与 Region 信息完全匹配控制台中的配置(注意大小写) 4. 若使用自定义域名,确认域名已完成 CNAME 解析到云存储的默认域名 ### 6.2 文件同步异常 **现象**:上传文件成功但 URL 地址未替换为云端地址,或部分文件同步失败。 **排查步骤**: 1. 检查主题选项面板中的”本地存储开关”状态是否符合预期 2. 确认媒体文件的 `_salong_object_storage_provider` 自定义字段值是否被其他插件意外覆盖 3. 查看 WordPress 的 debug.log 中是否包含 `[ObjectStorage]` 前缀的错误日志 4. 批量同步失败时,检查结果详情中的错误信息,常见原因包括:文件被占用、文件路径包含特殊字符、云端同名文件权限冲突 ### 6.3 CDN 加速不生效 **现象**:附件 URL 已正确替换为云端域名,但访问速度未见提升或请求仍然回源。 **排查步骤**: 1. 确认云端绑定的域名已开启 CDN 加速,而非直接指向存储 Bucket 的默认域名 2. 检查 CDN 配置中的缓存规则:建议将图片、CSS、JS 等静态资源的缓存过期时间设置为 30 天以上 3. 首次访问新上传的文件时 CDN 需要回源拉取,速度稍慢属正常现象,后续访问将命中 CDN 节点缓存 4. 使用 curl 命令检查响应头:`curl -I https://你的CDN域名/文件路径`,确认包含 `x-cache: HIT` 或类似标识 ### 6.4 删除附件时云端文件未被清理 **现象**:在 WordPress 中删除文件后,云存储 Bucket 中仍存在对应文件。 **排查步骤**: 1. 确认后台删除的是标准 WordPress 附件,而非自定义代码中写入的临时文件 2. 检查是否有第三方插件拦截了 `delete_attachment` 动作 3. 若文件已在启用对象存储功能之前存在于云端,需手动通过云服务商控制台清理 ## 七、总结 龙霄主题的原生对象存储功能模块,通过深度整合阿里云 OSS、腾讯云 COS、七牛云 Kodo 三大云服务商,为 WordPress 站点提供了从文件上传、云端同步、URL 自动重写到 CDN 加速分发的一站式解决方案。对比原生存储方案,它在降低服务器负载、提升媒体文件访问速度、优化存储成本方面优势显著;对比第三方插件方案,它在与主题的缓存体系、权限系统、批量同步 UI 的原生集成上更加紧密流畅。 无论你是运营跨境电商独立站、高质量摄影社区、在线教育平台还是企业多语言官网,龙霄主题的对象存储功能都能帮助你在数分钟内完成云端部署,彻底告别服务器存储瓶颈,开启真正意义上的全球加速时代。 --- # Nuxt.js Headless WordPress 项目中的数据缓存优化策略 **URL:** https://salongweb.com/nuxt-js-headless-wordpress-cache-strategy.html 在 Headless WordPress + Nuxt.js 的架构中,WordPress 作为内容后端通过 REST API 提供数据,Nuxt.js 作为前端负责渲染页面。这种分离带来了灵活性和可扩展性,但也引入了一个核心挑战:**每次页面请求都可能触发多次 WordPress API 调用**,在高流量场景下不仅拖慢响应速度,还会给服务器带来不必要的压力。本文将从四个维度系统性地介绍在 Nuxt.js 项目中优化 WordPress REST API 数据缓存的多层策略,并给出可直接使用的代码示例。 ## 为什么缓存至关重要 一个典型的 Nuxt.js 文章列表页可能需要请求三到四个 WordPress 端点:文章列表(/wp/v2/posts)、分类目录(/wp/v2/categories)、标签(/wp/v2/tags)和媒体信息(/wp/v2/media)。如果每个访问者都触发完整的 API 调用链,服务器负载会呈线性增长。以日均一万次页面浏览为例,没有缓存意味着 WordPress 服务器每天要处理三四万次 API 请求。合理使用缓存可以将**重复请求的响应时间从数百毫秒降至几毫秒**,用户体验提升显著,同时还能降低服务器成本。 ## 第一层:Nuxt.js useFetch 内置缓存 Nuxt 3 内置的 `useFetch` 和 `useAsyncData` 组合式函数提供了开箱即用的缓存机制。这两个函数的 `key` 参数是缓存的核心——具有相同 key 的请求在服务端渲染(SSR)期间只会执行一次,后续组件复用同一份数据,客户端导航时也会优先读取已有数据而非发起新请求。 ``` // composables/usePosts.ts export const usePosts = (page: number) => { return useFetch('/wp/v2/posts', { baseURL: 'https://api.example.com/wp-json', key: `posts-page-${page}`, query: { page, per_page: 10, _embed: true }, // 客户端缓存 5 分钟,过期后静默刷新 getCachedData: (key) => { const nuxtApp = useNuxtApp() const data = nuxtApp.payload.data[key] if (!data) return const age = Date.now() - (nuxtApp._cachedTime?.[key] || 0) if (age < 5 * 60 * 1000) return data } }) } ``` 上面的代码通过 `getCachedData` 实现了 stale-while-revalidate 模式:请求到达时,如果在 5 分钟内有缓存数据则直接返回,无需等待 API;过期后下一次请求仍返回旧数据,但同时在后台发起新请求更新缓存,确保用户始终看到「足够新」的内容而不用等待。 ## 第二层:Nitro Server Route Rules Nuxt 3 的 Nitro 服务器引擎支持通过 `routeRules` 配置声明式缓存策略,这是目前官方最推荐的做法。在 `nuxt.config.ts` 中即可定义每个路由的缓存行为,无需额外编写缓存逻辑: ``` // nuxt.config.ts export default defineNuxtConfig({ routeRules: { // 首页缓存 5 分钟 '/': { swr: 300 }, // 文章相关页面缓存 10 分钟 '/posts/**': { swr: 600 }, // 分类页面缓存 1 小时(变化频率低) '/categories/**': { swr: 3600 }, // API 代理路由 '/api/**': { cors: true, headers: { 'Access-Control-Max-Age': '86400' } } }, nitro: { storage: { redis: { driver: 'redis', host: '127.0.0.1', port: 6379 } } } }) ``` `swr`(stale-while-revalidate)参数指定缓存有效期(秒)。Nitro 在有效期内直接返回缓存内容,过期后先返回旧版本同时后台生成新内容并更新缓存。默认情况下 Nitro 使用内存存储缓存数据,服务重启即丢失。将存储驱动切换为 Redis 后,缓存数据持久化且可在多进程/多实例间共享,适合生产环境部署。Redis 连接配置也支持通过环境变量动态注入,方便在不同部署环境中切换。 ## 第三层:WordPress REST API 缓存控制 除了在前端层做缓存,在 WordPress 端也可以施加缓存控制以减轻 API 服务器的计算压力。REST API 默认不发送强缓存头,我们可以通过 `rest_post_dispatch` 过滤器为 GET 请求添加 Cache-Control 头: ``` // WordPress 主题 functions.php 或自定义插件 add_filter('rest_post_dispatch', function($response, $server, $request) { $method = $request->get_method(); if ($method !== 'GET') return $response; $response->header('Cache-Control', 'public, max-age=300, s-maxage=600'); $response->header('Vary', 'Accept-Encoding'); return $response; }, 10, 3); ``` 这段代码告诉中间代理和 CDN:对于公开的 GET 请求,浏览器可缓存 300 秒,共享缓存(CDN)可缓存 600 秒。配合 WordPress 的对象缓存插件(如 Redis Object Cache 或 W3 Total Cache 的数据库缓存),将数据库查询结果缓存在内存中,API 响应速度可从几百毫秒降至几十毫秒。 ## 第四层:CDN 边缘缓存与缓存失效策略 对于生产环境,CDN 是最外层的缓存防线。将 Nuxt.js 的 SSR 输出和静态资源通过 Cloudflare、Vercel Edge Network 或阿里云 CDN 分发,可以将内容缓存到离用户最近的边缘节点,全球访问延迟大幅下降。配合 HTTP 响应头中的 `stale-while-revalidate` 指令,即使后端 API 暂时不可用(如服务器维护或宕机),CDN 也能持续提供旧版本内容,保证网站始终可访问而不出现白屏或错误页面。 但缓存带来了一个新问题:**如何保证内容及时更新?**关键在于建立缓存失效机制。推荐的做法是在 WordPress 端配置 Webhook——当文章发布或更新时,向 Nuxt.js 服务发送一个 HTTP POST 请求,触发指定页面的缓存清除: ``` // WordPress - 文章状态变更时触发 Webhook add_action('transition_post_status', function($new, $old, $post) { if ($post->post_type !== 'post') return; if ($new !== 'publish' && $old !== 'publish') return; wp_remote_post('https://your-nuxt-app.com/api/clear-cache', [ 'body' => json_encode(['slug' => $post->post_name]), 'headers' => ['Content-Type' => 'application/json'] ]); }, 10, 3); ``` 在 Nuxt.js 端,通过 `server/api/clear-cache.ts` 接收 Webhook,调用 Nitro 的缓存存储接口清除对应路由的缓存数据。这样就实现了「发布即生效」的内容更新体验,无需等待缓存自然过期。 ## 实战组合策略与最佳实践 一个成熟项目的缓存架构应该是多层次的,从外到内依次为:**浏览器缓存 → CDN边缘节点 → Nitro服务端缓存 → WordPress对象缓存 → MySQL查询缓存**。每一层各司其职,离用户越近的层拦截越多的请求。具体实施建议分环境配置: 1. **本地开发环境**:仅使用 useFetch 的 key 去重,防止 SSR 期间对同一 API 发起重复请求。不建议开启 Nitro 缓存,否则修改代码后可能看到旧数据 2. **预览/测试环境**:启用 Nitro swr 内存缓存,设定较短的过期时间(60-120 秒),方便测试内容变更效果 3. **生产环境**:组合使用 Nitro Redis 持久化缓存 + CDN 边缘缓存,页面级缓存 5-10 分钟,并配置 Webhook 主动失效机制 另外,需要注意以下边界情况:包含用户个性化内容的页面(用户中心、购物车、订单列表等)务必排除在缓存策略之外,避免用户看到其他人的私密数据。可以通过 `routeRules` 的 `headers` 选项根据 Cookie 区分已登录用户,或在 Nuxt 中间件中动态判断当前请求是否应跳过缓存。对于需要实时数据的场景(如库存数量、竞拍剩余时间等),建议将这些数据改为客户端异步加载,不在 SSR 层面缓存。 ## 总结 在 Headless WordPress + Nuxt.js 架构中实施多层缓存策略,能将页面响应时间从秒级优化到毫秒级,同时大幅降低 WordPress 服务器的 API 请求压力。从 useFetch 的请求去重到 Nitro 的服务端缓存,再到 CDN 的边缘分发和 Webhook 驱动的缓存失效——这四层协同工作,能让你的 Headless WordPress 站点拥有媲美纯静态站点的访问速度。在实际落地时,建议先从 Nitro routeRules 的 swr 配置入手,这是投入产出比最高的优化手段,配置简单但效果显著。 --- # Nuxt 3 项目中集成 AI API 实现智能内容生成与多语言翻译 **URL:** https://salongweb.com/nuxt3-integrate-ai-api-content-generation-multilingual-translation.html 随着大语言模型(LLM)技术的飞速发展,越来越多的 Web 应用开始集成 AI 能力——从智能客服、内容摘要到自动翻译,AI 正在重塑前端开发的工作方式。对于使用 Nuxt 3 构建全栈应用的开发者来说,如何在项目中安全、高效地调用 AI API 是一个值得深入探讨的话题。本文将带你一步步实现在 Nuxt 3 项目中集成 OpenAI 兼容 API,完成智能内容生成与多语言翻译功能。 ## 一、为什么选择服务端调用 在 Nuxt 3 项目中调用 AI API,首要考虑的是安全性。所有主流 AI 服务(OpenAI、Claude、DeepSeek 等)都要求通过 API Key 进行身份认证。如果将 API Key 写在前端代码中,任何人都能通过浏览器开发者工具获取你的密钥,造成严重的安全隐患和费用损失。 Nuxt 3 的 `server/api` 目录提供了完美的解决方案:API 路由运行在服务端(Nitro 引擎),API Key 存储在 `.env` 环境变量中,前端通过 `$fetch` 调用自己的接口,再由服务端转发请求到 AI 服务。这样 API Key 永远不会暴露给客户端。 ## 二、环境准备 首先在 Nuxt 3 项目根目录创建 `.env` 文件: ``` NUXT_OPENAI_API_KEY=sk-your-api-key-here NUXT_OPENAI_BASE_URL=https://api.openai.com/v1 NUXT_AI_MODEL=gpt-4o-mini ``` 在 `nuxt.config.ts` 中不需要额外配置,Nitro 会自动读取以 `NUXT_` 开头的环境变量并通过 `useRuntimeConfig()` 暴露给服务端。 ## 三、创建 AI 服务层 为了代码复用和维护性,我们先创建一个通用的 AI 服务封装。在 `server/utils/ai.ts` 中: ``` interface ChatMessage { role: 'system' | 'user' | 'assistant' content: string } interface ChatOptions { messages: ChatMessage[] temperature?: number maxTokens?: number stream?: boolean } export async function chatCompletion(options: ChatOptions) { const config = useRuntimeConfig() const response = await $fetch(`${config.openaiBaseUrl}/chat/completions`, { method: 'POST', headers: { 'Authorization': `Bearer ${config.openaiApiKey}`, 'Content-Type': 'application/json', }, body: { model: config.aiModel, messages: options.messages, temperature: options.temperature ?? 0.7, max_tokens: options.maxTokens ?? 2048, stream: options.stream ?? false, }, }) return response } ``` ## 四、实现内容生成 API 路由 创建 `server/api/ai/generate.post.ts`: ``` export default defineEventHandler(async (event) => { const body = await readBody(event) const { prompt, systemPrompt } = body if (!prompt) { throw createError({ statusCode: 400, message: 'prompt 参数不能为空', }) } try { const result = await chatCompletion({ messages: [ { role: 'system', content: systemPrompt || '你是一个专业的技术内容创作者。' }, { role: 'user', content: prompt }, ], temperature: 0.8, }) return { success: true, content: result.choices[0].message.content, usage: result.usage, } } catch (error: any) { throw createError({ statusCode: 500, message: error.message || 'AI 服务调用失败', }) } }) ``` ## 五、实现流式响应(SSE) 对于内容生成场景,流式响应能大幅提升用户体验——用户可以看到文字逐字生成,而不是等待几秒钟后一次性展示。创建 `server/api/ai/stream.post.ts`: ``` export default defineEventHandler(async (event) => { const body = await readBody(event) const { prompt, systemPrompt } = body const config = useRuntimeConfig() setHeader(event, 'Content-Type', 'text/event-stream') setHeader(event, 'Cache-Control', 'no-cache') setHeader(event, 'Connection', 'keep-alive') const response = await fetch( `${config.openaiBaseUrl}/chat/completions`, { method: 'POST', headers: { 'Authorization': `Bearer ${config.openaiApiKey}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ model: config.aiModel, messages: [ { role: 'system', content: systemPrompt || '你是一个专业助手。' }, { role: 'user', content: prompt }, ], stream: true, }), } ) const reader = response.body?.getReader() if (!reader) throw createError({ statusCode: 500 }) const decoder = new TextDecoder() let buffer = '' while (true) { const { done, value } = await reader.read() if (done) { sendEventStream(event, { data: '[DONE]' }) break } buffer += decoder.decode(value, { stream: true }) const lines = buffer.split('n') buffer = lines.pop() || '' for (const line of lines) { if (line.startsWith('data: ') && line !== 'data: [DONE]') { try { const parsed = JSON.parse(line.slice(6)) const content = parsed.choices[0]?.delta?.content if (content) { sendEventStream(event, { data: content }) } } catch {} } } } }) ``` ## 六、前端 Vue 组件集成 创建一个可复用的 AI 内容生成组件: ``` ``` ## 七、多语言翻译实现 基于上述 AI 服务层,实现多语言翻译非常简单。创建 `server/api/ai/translate.post.ts`: ``` export default defineEventHandler(async (event) => { const { text, targetLang, sourceLang } = await readBody(event) const langMap: Record = { 'zh-cn': '简体中文', 'zh-tw': '繁体中文', 'en': 'English' } const result = await chatCompletion({ messages: [ { role: 'system', content: `你是一个专业翻译。将用户输入的${sourceLang ? langMap[sourceLang] || sourceLang : ''}内容翻译为${langMap[targetLang] || targetLang}。只返回翻译结果,不要添加任何解释。`, }, { role: 'user', content: text }, ], temperature: 0.3, }) return { success: true, translation: result.choices[0].message.content, sourceLang, targetLang, } }) ``` ## 八、错误处理与速率限制 生产环境中,AI API 调用可能因各种原因失败——网络超时、速率限制、余额不足等。我们需要健壮的错误处理机制。 在 `server/utils/ai.ts` 中添加重试逻辑: ``` export async function chatCompletionWithRetry( options: ChatOptions, maxRetries = 3 ) { for (let i = 0; i < maxRetries; i++) { try { return await chatCompletion(options) } catch (error: any) { if (error.statusCode === 429) { // 速率限制,等待后重试 const retryAfter = error.headers?.get('retry-after') || 5 await new Promise(r => setTimeout(r, retryAfter * 1000)) continue } if (i === maxRetries - 1) throw error await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i))) } } } ``` 同时建议在 Nitro 配置中设置请求体大小限制: ``` // nuxt.config.ts export default defineNuxtConfig({ nitro: { routeRules: { '/api/ai/**': { maxBodySize: '1mb', }, }, }, }) ``` ## 九、总结 通过 Nuxt 3 的 Server API 路由,我们以安全、高效的方式集成了 AI 能力。核心要点回顾: - **安全性**:API Key 存储在服务端环境变量,绝不暴露给客户端 - **流式响应**:使用 SSE 实现实时内容生成,提升用户体验 - **可复用架构**:通过服务层封装,content generation 和 translation 共享同一套 AI 调用逻辑 - **健壮性**:指数退避重试策略处理速率限制和网络异常 这套架构已经在萨龙网络的多个项目中稳定运行,无论是自动生成技术文章、产品描述,还是实现多语言站点的内容翻译,都能高效胜任。希望本文能帮助你在 Nuxt 3 项目中顺利集成 AI 能力。 --- # 龙霄(LongXiao)WordPress 主题:后端专属企业级功能全景解析 **URL:** https://salongweb.com/wordpress-longxiao-backend.html ## 一、开篇引言 龙霄(LongXiao)主题是萨龙网络倾力打造的一款以 WordPress 为后端核心、以 Nuxt.js + Vue.js 为前端渲染框架的后端专属企业级主题。主题名称寓意”龙腾九霄”,象征其在网站性能、功能扩展性与安全防护上的全面飞跃。龙霄主题不局限于传统 WordPress 主题的页面展示逻辑,而是定位为「后端中枢 + API 服务」的架构范式——它将 WordPress 的能力从内容管理延伸至课程(知识付费)、商城、视频、直播、问答、文档、作品集、服务工单、团队管理、活动管理等全场景业务领域,配合 15 款以 `longxiao-` 为前缀的专属插件形成完整的生态矩阵。本文将从核心架构设计、全场景功能模块、性能优化机制、安全防护体系、插件协同能力五大维度,深度剖析龙霄主题及其插件生态为企业站点带来的技术优势与商业价值。 ![](https://pic.salongweb.com/2026/07/longxiao-backend-1.webp)## 二、核心架构设计 ### 2.1 前后端分离架构 龙霄主题采用 WordPress 作为纯后端 API 服务提供者,前端基于 Nuxt.js + Vue.js 及配套生态(Naïve UI、UnoCSS、Pinia)构建。这种前后端分离的解耦架构带来以下核心优势: - **API-First 设计**:主题内置完整的 GraphQL 查询与变更解析器体系,支持前端以声明式方式精确获取数据,避免传统 RESTful 接口的数据过度获取或获取不足问题。 - **无前端渲染压力**:WordPress 仅承担数据管理与 API 响应职责,前端页面渲染、路由控制、状态管理等完全交由 Nuxt.js 处理,大幅降低服务器负载,提升高并发场景下的响应稳定性。 - **主题即框架**:龙霄主题自身即为一套完整的应用框架,内置选项配置框架、自定义数据管理、用户认证体系、多语言集成层,所有 `longxiao-` 插件均依赖此底层框架实现功能,确保插件之间的数据互通与一致体验。 ![](https://pic.salongweb.com/2026/07/longxiao-backend-2.webp)### 2.2 主题选项与缓存体系 主题内置智能化选项缓存机制。所有主题设置与插件设置均采用对象缓存进行小时级缓存,同时通过缓存版本号机制实现精确失效——每当文章、分类、评论、用户登录/退出等事件发生时,系统自动递增对应缓存分组的版本号,确保前端始终获取最新数据。 版本号更新同时会触发旧版本临时缓存数据的自动清理,防止数据库选项表无限膨胀,体现龙霄主题对长周期运维场景的深度考量。 --- ## 三、全场景功能模块 ### 3.1 后端仪表盘定制化改造 龙霄主题对 WordPress 后台进行了深度定制,涵盖以下关键改造点: - **登录页面保护与品牌定制**:支持自定义登录页面 Logo,替换默认的 WordPress 品牌标识。同时内置登录保护机制——管理员可设置密钥对,未携带正确参数的访问请求将被直接拦截,从入口层阻断暴力破解尝试。 - **后台用户界面优化**:支持 SVG 等现代图片格式在媒体库中正确显示缩略图;自动禁用不必要的图片裁剪尺寸生成,减少磁盘 I/O 与存储占用。 - **邮件系统集成**:内置完整的 SMTP 邮件发送配置模块,支持 SSL/TLS 加密传输,兼容阿里云邮件推送、SendGrid、Mailgun 等主流邮件服务商,确保系统邮件送达率。 - **前端链接自动重写**:系统自动将后台生成的所有页面、文章、分类链接重写为前端 Nuxt.js 应用地址,实现前后端 URL 的统一管理,无需手动维护两套地址。 ### 3.2 多角色权限精细化管理 龙霄主题构建了多维度的权限管理体系: - **用户分组与能力系统**:内置用户组和能力管控体系,支持按角色精细化控制各项功能的使用权限。管理员可独立配置每个用户组对 AI 文本生成、图像处理、文件管理、音频视频等能力的启用状态和使用限额。 - **积分系统联动**:权限体系与内置积分系统深度耦合,支持基于用户行为的自动化积分奖励与消耗规则配置,适用于问答社区激励、课程完成奖励、推广佣金结算等场景。 - **通知通道集成**:支持站内通知、邮件通知、微信通知等多通道消息推送,权限体系可控制各角色接收通知的类型与频率。 ![](https://pic.salongweb.com/2026/07/longxiao-backend-3.webp)### 3.3 龙霄专属数据可视化面板 龙霄主题及插件群内置多维度数据可视化能力: - **加盟推广数据大屏**:使用 Chart.js 构建加盟数据分析报表,全景展示加盟商数量、推广访问量、链接点击转化率、佣金支出趋势等核心 KPI。支持按时间维度下钻分析,帮助运营团队实时掌握推广效果。 - **商城主订单统计**:完整的订单生命周期管理与统计报表,支持按订单状态、支付时间段、产品类型等多维度筛选,为经营决策提供数据支撑。 - **课程销售追踪**:记录课程销量与学员学习进度,直观展示热门课程排行榜与完课率趋势,为知识付费运营优化提供依据。 - **书签推广统计**:跟踪外部链接的推广效果,展示置顶、热门、推荐链接的曝光与点击数据。 ![](https://pic.salongweb.com/2026/07/longxiao-backend-4.webp)### 3.4 自定义内容类型扩展体系 龙霄主题通过统一的内容类型注册机制,实现了极具弹性的内容架构。当前支持的内容类型涵盖 12 种业务场景: - **longxiao-course**:课程与课时管理,支持多章节结构、课时预览、学习进度追踪,适用于在线教育平台 - **longxiao-product**:产品销售目录,支持自定义模板渲染,配合商城插件完成在线交易 - **longxiao-video**:视频内容发布与管理,支持多语言配置 - **longxiao-bookmark**:外部链接收藏与导航,内置推广系统与用户自定义导航 - **longxiao-document**:技术文档与帮助中心,支持用户反馈提交 - **longxiao-event**:活动管理,配套场地与主办方管理,适用于会议、讲座、研讨会等 - **longxiao-portfolio**:作品集展示,适合设计工作室与创意机构展示项目案例 - **longxiao-question**:问答社区,支持提问、回答与咨询,内置投票与采纳机制 - **longxiao-service**:服务项目展示与支持工单系统,实现完整的售前售后闭环 - **longxiao-team**:团队成员档案展示 - **longxiao-content**:通用内容发布,适配各类标准化内容需求 - **longxiao-shop**:优惠券与订单管理,构成商业交易的核心数据层 每种内容类型均可独立配置侧边栏、详情模板、归档样式等展示参数,实现差异化呈现。 ### 3.5 AI 智能化内容生产 AI 集成插件为龙霄主题注入智能化内容生产能力: - **AI 多语言翻译**:与多语言插件深度集成,支持一键翻译文章、分类、菜单项以及语言字符串,显著降低多语言站点的内容生产门槛。运营人员可在文章编辑页面直接触发 AI 翻译,无需切换上下文。 - **AI 评论摘要**:自动生成文章评论的 AI 摘要,帮助读者快速了解评论区核心观点,提升用户阅读效率与互动质量。 - **AI 对话系统**:持久化对话记录,支持按用户组设置每日使用上限,适用于智能客服、内容辅助创作等场景。对话历史可追溯,便于服务质量监控。 - **权限精细化管控**:AI 能力的使用权限完全纳入主题的用户组管理体系,管理员可独立控制文本、图像、文件、音频、视频等各项 AI 功能的启用范围与配额上限。 --- ## 四、性能优化机制 ### 4.1 站内性能缓存加速 龙霄主题构建了多层次缓存体系: - **选项缓存层**:所有主题与插件配置数据均经过对象缓存处理,设置合理过期时间,大幅减少数据库重复查询。 - **缓存版本号体系**:系统为不同数据维度(内容归档、分类信息、页面构建器、站点地图等)分配独立的缓存分组。当特定数据发生变更时,仅递增受影响分组的版本号,避免全局缓存清空带来的性能损耗。 - **临时数据自动清理**:旧版本缓存数据在版本号更新时自动触发清理流程,防止数据库表无限增长,确保长周期运行稳定性。 - **前端缓存联动**:支持主动触发前端 Nuxt.js 应用缓存失效,通过安全令牌验证的接口调用实现前后端缓存的同步刷新,确保用户始终浏览最新内容。 ### 4.2 服务器资源调度优化 - **精简图片处理**:自动禁用不必要的中间图片尺寸生成,仅保留原始上传文件,显著节省磁盘空间与图片处理过程中的 CPU 消耗。 - **大图上传高兼容**:解除 WordPress 默认的大图尺寸限制,适配高清摄影、设计稿等大尺寸图片上传需求。 - **搜索性能优化**:系统搜索默认限定在文章标题范围,排除对正文和摘要的模糊匹配,在大数据量下依然保持搜索响应速度。 ### 4.3 浏览量计数优化 采用随机增量策略处理文章浏览计数写入,避免高并发场景下的数据库写冲突,同时保持计数准确性。系统自动记录用户的浏览历史,为个性化推荐与内容运营提供数据基础。 --- ## 五、安全防护体系 ### 5.1 防恶意请求防护 - **登录入口保护**:管理员可设置自定义密钥参数,只有携带正确访问凭据的请求才能进入登录页面,从源头阻断暴力破解与自动化扫描。 - **邮箱域名白名单**:限制注册邮箱的后缀域名,仅允许指定邮箱服务商完成注册,有效防止垃圾注册与机器人账号。 - **请求频率限制**:内置 IP 访问频率检测机制,支持可配置的时间窗口与阈值,防止爬虫过度抓取和接口滥用。 - **加盟防作弊引擎**:加盟推广插件内置 IP 频率限制与设备指纹检测能力,防止刷量作弊行为。系统可配置反欺诈时间窗口与触发阈值,确保推广数据的真实性与佣金结算的公平性。 ![](https://pic.salongweb.com/2026/07/longxiao-backend-5.webp)![](https://pic.salongweb.com/2026/07/longxiao-backend-6.webp)![](https://pic.salongweb.com/2026/07/longxiao-backend-8.webp)![](https://pic.salongweb.com/2026/07/longxiao-backend-7.webp)### 5.2 数据备份与恢复兼容 龙霄主题的缓存版本号体系天然支持数据恢复场景——系统为各数据组维护状态版本快照,配合第三方备份方案(如 UpdraftPlus),可在数据恢复后精准重建缓存,确保恢复过程不影响前端服务的连续性。 ### 5.3 第三方服务适配 - **邮件服务**:支持任意标准 SMTP 服务器,适配阿里云、SendGrid、Mailgun 等主流邮件服务商。 - **AI 服务**:集成 DeepSeek API,支持密钥与模型选择配置,架构设计具备服务商扩展能力。 - **文件上传控制**:精细化的 MIME 类型白名单管理,支持 SVG、WebP 等现代格式的同时确保上传安全。 - **多语言兼容**:全程集成 Polylang 多语言插件,提供完整的文章、分类、字符串翻译支持体系。 --- ## 六、插件生态协同说明 ### 6.1 加盟推广插件深度解析 `longxiao-affiliate` 加盟推广插件是龙霄生态中驱动商业增长的引擎级插件,提供完整的推广分销解决方案: - **全链路加盟管理**:支持加盟商注册审批、推广链接创建、访问追踪与佣金自动结算的全流程管理。管理员可在统一后台查看所有加盟商的业绩数据、收益明细与结算状态。 - **多渠道推广追踪**:基于 Cookie 的归因追踪机制,支持可配置的追踪有效期。系统记录每次推广访问的来源信息(IP、设备、浏览器、来源页面),为效果归因提供完整的数据链。 - **智能佣金规则配置**:支持按比例佣金和固定金额佣金两种模式,可灵活设置免佣金规则(免单、优惠券订单、纯运费订单、未支付订单)。佣金规则可针对不同产品类型和加盟商等级差异化配置。 - **防作弊风控系统**:内置 IP 访问频率检测与设备指纹识别,有效识别和阻止刷量作弊行为。风控参数(时间窗口、触发阈值)均可通过后台灵活配置,平衡推广激励与数据真实性。 - **创意素材与链接管理**:支持上传推广横幅、海报等创意素材,自动生成推广链接二维码。管理员可创建多渠道推广活动,为不同场景配置专属追踪链接。 - **数据报表中心**:使用 Chart.js 构建的专业数据分析页面,展示加盟商排行榜、推广访问趋势、转化漏斗、佣金支出概览等核心报表,支持按时间段筛选与数据导出。 - **全生态联动**:加盟推广插件与商城订单系统深度绑定,订单完成时自动触发佣金计算。同时与书签推广系统联动,支持书签链接的推广佣金结算——形成课程分销、产品销售、内容推广的完整商业闭环。 - **了解后端**: - 了解前端: ### 6.2 核心插件协同链路 **商城 → 全生态商业闭环**:商城插件是商业生态的核心枢纽。课程、产品、服务插件均依赖其购物车、结算与订单管理能力完成交易。订单完成时自动触发事件通知,加盟推广插件捕获该事件后即可启动佣金结算流程,实现”下单即结算”的自动化运营。 **AI 集成 → 多语言赋能**:AI 集成插件专注于多语言翻译场景,为课程、产品、文档、问答等所有内容类型提供一键多语言生成能力。运营人员无需具备翻译技能即可完成多语种站点建设。 **服务工单 → 售后支撑**:服务插件的工单系统可与商城产品关联,客户购买产品后可提交售后工单,客服团队在统一后台完成问题处理,形成”购买 → 使用 → 售后”的完整服务闭环。 **书签推广 → 流量变现**:书签插件不仅提供外部链接收藏功能,更内置推广系统与付费置顶能力。结合加盟推广插件,站长可将书签链接转化为推广渠道,实现流量多路径变现。 ### 6.3 插件生态扩展能力 对于有二次开发需求的团队,龙霄插件生态提供了清晰的扩展路径: 1. **注册新内容类型**:通过统一的内容类型注册机制,参考已有插件快速扩展新业务类型。 2. **扩展主题选项**:基于内置选项框架添加自定义配置字段,新选项自动纳入主题的缓存体系。 3. **扩展通知与积分通道**:支持注册新的通知渠道和积分规则,实现业务场景的个性化激励方案。 --- ## 七、适用场景与案例价值 ### 7.1 典型应用场景 场景推荐配置核心价值知识付费平台课程 + 商城 + 加盟推广课程在线销售、学员管理、推广员分销一站式闭环企业官网 + 商城产品 + 商城 + 服务产品展示、在线购买、售后工单全流程打通多语言技术文档站文档 + AIAI 辅助翻译大幅降低多语言站点建设成本设计作品展示平台作品集 + 书签项目展示与外部资源收藏的一体化展示问答社区问答 + 积分 + 通知积分激励驱动社区活跃,多通道通知增强互动综合性 SaaS 平台全插件激活多业务线统一后台管理,数据互通,用户体系共享### 7.2 商业价值总结 - **降低开发成本**:15 款即装即用插件覆盖独立系统 80% 的通用功能,无需从零搭建后台业务系统。 - **缩短上线周期**:模块化架构支持按需启用,最小可行产品可在数小时内完成部署并上线运营。 - **运维成本可控**:统一的主题框架意味着单一升级入口、一致的代码规范、共用的缓存与安全体系,大幅降低维护复杂度。 - **全球化就绪**:全程多语言支持配合 AI 翻译能力,助力业务快速进入海外市场。 --- ## 八、总结与展望 龙霄主题以其「后端专属 + 前后端分离」的架构理念,重新定义了 WordPress 在企业级场景中的角色边界。它不再是传统意义上的”博客主题”,而是一套完整的后端业务中台——以 15 款原生插件构建商业生态,其中加盟推广插件作为驱动增长的引擎,将推广分销、佣金结算、防作弊风控有机整合;以多层次缓存与版本号机制保障性能;以登录保护、邮箱白名单、反欺诈引擎构筑安全防线。从课程知识付费到商城交易,从问答社区到服务工单,从 AI 内容生产到多语言全球化部署,龙霄主题为 WordPress 开发者与企业运维人员提供了一套开箱即用、深度可扩展的企业级解决方案。 展望未来,龙霄主题将在更深度 AI 集成(文生图、智能推荐)、更完善的可观测性(服务监控、链路追踪)、更开放的生态接口(Webhook、第三方平台对接)等方向持续演进,巩固其在 WordPress 企业级生态中的技术领先地位。 --- # 龙霄主题加盟推广:前端追踪归因、多语言支持,从流量到收益的全链路闭环 **URL:** https://salongweb.com/longxiao-affiliate-frontend.html ## 前言 在数字化商业生态中,联盟营销(Affiliate Marketing)已成为品牌方拓展销售渠道、降低获客成本的核心手段。一套完整的加盟推广系统,需要解决三个核心问题:如何精准追踪每一次推广行为?如何清晰记录每一笔推广收益?如何让合作伙伴高效管理推广活动? 龙霄主题的加盟推广功能正是为解决这三个问题而生。它由两大核心部分组成: **前端追踪与归因链路** — 从用户点击推广链接进入网站的那一刻起,前端自动记录访问来源、设备信息、活动标识等关键数据,通过 Cookie 持久化追踪信息,并在订单创建和支付环节完成收益归因。全程无需合作伙伴干预,每一次推广行为都可追溯、每一笔佣金都可计算。 **个人中心加盟管理后台** — 以七项核心子菜单为骨架(申请加盟、统计数据、报告分析、链接管理、创意素材、访问日志、推广记录),为合作伙伴提供从入驻申请到数据复盘、从工具配置到收益查看的全流程管理能力。 **多语言支持** — 依托龙霄主题的国际化体系,加盟模块所有界面(状态提示、表单字段、数据表格、操作按钮、错误反馈等)均支持简体中文、繁体中文和英文三种语言。合作伙伴无论使用何种语言,都能获得一致的完整体验。 本文将从前端追踪链路切入,再深入拆解个人中心的七大管理功能,完整呈现龙霄主题加盟推广功能的全貌。 ## 一、推广追踪与归因链路 加盟推广系统的基石是准确可靠的追踪与归因能力。龙霄主题从前端页面加载到后端订单结算,构建了一条完整的追踪链路。 ### 1.1 推广链接生成 合作伙伴在个人中心的「链接管理」模块创建推广链接时,系统自动为目标 URL 附加两个关键追踪参数:推广用户标识和活动标识。每次推广访问都附带唯一的访问编号,确保后续的订单归因能够精确匹配到某一次具体的推广行为。 ### 1.2 访问追踪与数据采集 当用户通过推广链接访问网站时,系统自动完成以下操作: 1. **参数检测**:识别 URL 中的推广参数 2. **访问记录**:将访问数据记录至后端,包含目标页面、推广用户、来源页面、设备类型、浏览器、操作系统等信息 3. **追踪持久化**:追踪信息存储到浏览器本地,有效期由后台配置(默认 30 天) 这意味着即使用户没有立即下单,只要在有效期内完成购买,推广收益仍然归属于最初的推广合作伙伴。 ### 1.3 订单归因与佣金计算 在订单创建和支付环节,归因逻辑自动执行。系统读取追踪信息并传递至后端,后端根据这些信息将订单与推广访问进行匹配,按照预设的佣金比例计算收益。整个归因过程对用户完全透明,不干扰正常购物流程。 ### 1.4 推广入口触点 除了通过链接被动追踪,龙霄主题还提供了主动推广触点。在文章/页面侧边栏的浮动按钮中,配置了「加盟推广」类型的特殊链接。访问者点击该按钮后,系统自动跳转至对应推广用户的加盟申请页面或登录弹窗,为合作伙伴提供了额外的推广入口。 ## 二、个人中心加盟管理后台 如果说追踪归因链路是加盟系统的「隐形骨架」,那么个人中心加盟管理后台就是合作伙伴的「驾驶舱」。七大子菜单围绕合作伙伴的使用场景精心设计,覆盖了从入驻到结算的全流程。 ### 2.1 申请加盟:合作伙伴的入驻门户 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-1.webp)![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-2.webp)**功能定位**:加盟管理系统的入口,承担合作伙伴注册、资质审核与状态管理职能。 **核心功能**: - **资质提交**:填写网站地址和申请理由,系统支持对理由字数进行最小/最大长度限制,确保申请质量 - **条款确认**:支持配置协议页面链接,申请人需勾选同意后方可提交,满足合规性要求 - **审核模式**:自动审核(提交即通过)与人工审核(需管理员审批)两种模式 - **状态管理**:未申请、待审核、已激活、已停用、已拒绝、功能关闭六种状态,各有对应图标与提示文案,清晰反馈当前进展 **用户价值**:30 秒完成入驻申请,即时获知审核结果。 ### 2.2 统计数据:推广成效的全局概览 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-3.webp)**功能定位**:以数据面板形式提供推广成效的全局概览,分「累计数据」与「区间数据」两个维度。 **核心功能**: - **收益数据**:累计已支付金额、累计未支付金额、平均订单金额,清晰展示整体收益状况 - **推广指标**:推广数、访问数、转化数、转化率,全面评估推广效果 - **链接指标**:创建的推广链接总数 - **日期筛选**:默认最近 30 天,支持自由调整时间范围,灵活查看不同周期表现 **用户价值**:无需等待即可查看推广成效全貌,通过切换日期范围快速定位表现波动的时间节点。 ### 2.3 报告分析:深度数据洞察工具 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-4.webp)**功能定位**:数据维度最丰富的页面,提供趋势图、热门链接与推广活动三大分析工具。 **核心功能**: - **趋势图**:以图表形式展示时间序列数据,同时呈现访问量、转化数、推广数、已支付金额、未支付金额的变化趋势,直观反映推广成效的波动规律 - **热门链接**:以表格列出表现最优的推广链接,包含访问数、推广数、转化数及收益数据,帮助定位高转化内容 - **推广活动**:按活动维度聚合数据,展示每个活动的综合表现,便于评估不同营销活动的投入产出比 **用户价值**:趋势图一目了然识别推广高峰与低谷,热门链接锁定高效推广内容,活动分析为预算分配提供决策依据。 ### 2.4 链接管理:推广链路的创建维护 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-5.webp)**功能定位**:推广行为的起点,合作伙伴在此管理所有推广链接,系统自动生成带追踪参数的唯一链接。 **核心功能**: - **默认推广链接**:系统基于用户身份自动生成默认链接,格式为 `http://localhost:3000?ref={user_id}`,支持一键复制,方便在社交平台、博客等任意渠道投放 - **链接创建**:输入目标页面地址和活动名称,生成带追踪参数的推广链接,例如 `http://localhost:3000/product/1044.html?ref={user_id}&campaign={campaign_name}`,每次推广都可独立追踪效果 - **链接管理**:以表格展示所有推广链接,每条记录包含访问数和转化数,直接呈现推广效果。支持编辑目标地址和活动名称,支持删除和一键复制推广链接 **用户价值**:无需技术背景即可创建专业的追踪链接,活动名称功能支持区分不同推广渠道的效果,为精细化运营提供基础。 ### 2.5 创意素材:推广资源的统一仓库 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-6.webp)**功能定位**:品牌方与合作伙伴之间的资源共享中心。品牌方上传图片、二维码、文本等素材,合作伙伴浏览、筛选并一键获取部署代码。 **核心功能**: - **素材浏览**:以卡片或列表形式展示可用素材,支持按类型(图片/二维码/文本)和状态筛选,快速定位所需资源 - **素材详情**:点击素材查看详情,包含预览、名称、描述及自动生成的部署代码 - **代码复制**:系统自动生成包含追踪参数的 HTML 代码片段,一键复制到剪贴板,可直接嵌入到推广渠道 **用户价值**:合作伙伴无需自行设计或托管素材,直接从素材库获取标准化推广资源,大幅降低推广门槛。品牌方可确保所有推广渠道使用统一的视觉素材,维护品牌形象的一致性。 ### 2.6 访问日志:推广流量的实时监控 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-7.webp)**功能定位**:记录每一次通过推广链接进入网站的访问行为,提供设备、浏览器、操作系统、来源等多维度详细数据。 **核心功能**: - **访问明细**:展示访问用户、推广链接、来源页面、活动名称、设备类型、浏览器、操作系统、转化状态及访问时间 - **转化标识**:已转化的访问记录带有醒目标识,帮助合作伙伴快速定位产生实际订单的高质量流量 **用户价值**:通过分析访问日志识别高转化来源渠道和优质流量特征,设备与浏览器数据辅助判断目标受众画像,为推广策略优化和落地页改进提供参考。 ### 2.7 推广记录:收益结算的透明账本 ![](https://pic.salongweb.com/2026/07/longxiao-affiliate-frontend-8.webp)**功能定位**:合作伙伴的收益明细账本,记录每一笔成功推广产生的订单信息与佣金金额。 **核心功能**: - **订单信息**:展示购买用户(头像与名称)、订单号、推广金额、描述、推广链接、状态标签,信息完整清晰 - **状态筛选**:支持按全部 / 已支付 / 未支付等状态筛选记录,快速区分已结算与待结算收益 - **客户信息**:查看购买客户的简要信息,了解高价值客户的来源渠道 **用户价值**:随时查看收益明细,清晰了解每笔订单的佣金构成。状态筛选功能便于财务对账和收益预期管理,让每一笔收入都心中有数。 ## 总结 龙霄主题的加盟推广功能是一套从前端流量追踪到后端收益结算的全链路解决方案。前端追踪链路确保了每一次推广行为可追溯、每一笔佣金可计算;个人中心七大子菜单则提供了从入驻申请到数据复盘、从工具配置到收益查看的全面管理能力;多语言支持确保不同语言背景的合作伙伴都能无障碍使用。 这套系统的核心价值在于: - **前端追踪精准**:从链接点击到订单完成的全链路追踪,Cookie 有效期确保转化不丢失 - **效率提升**:30 秒完成入驻,一键生成推广链接,实时查看数据面板 - **数据驱动**:趋势图、热门链接、活动分析三层数据工具赋能决策 - **资源协同**:品牌方集中管理创意素材,合作伙伴即拿即用 - **收益透明**:每一笔订单的佣金构成清晰可查,状态筛选便于对账 - **多语言覆盖**:简体中文、繁体中文、英文三语界面,全球合作伙伴无障碍使用 龙霄主题的加盟推广功能,为品牌方与合作伙伴构建了一个高效、透明、可扩展的联盟营销生态系统。 --- # WordPress龙霄加盟推广系统 —— 数据一目了然,结算一步到位:多语言电商推广管理后台 **URL:** https://salongweb.com/wordpress-longxiao-affiliate.html ## 一、开发背景与定位 龙霄加盟推广插件(LongXiao Affiliate)是由萨龙网络出品的一款深度 WordPress 电商加盟推广管理插件,100% 为龙霄主题(LongXiao Theme)量身定制。传统 WordPress 生态中的加盟推广插件——如 AffiliateWP、WooCommerce Affiliate 等——虽然功能强大,但它们面向通用场景设计,与龙霄主题高度解耦的前后端架构(WordPress 后端 + Vue.js/Nuxt.js 前端)、WPGraphQL 数据层、多语言多币种体系、余额系统等特色功能无法原生适配。龙霄加盟推广插件正是为解决这一断层而生。 插件采用纯自定义数据表架构,不依赖任何 WordPress 自定义文章类型(CPT),所有加盟商信息、推广记录、访问日志、创意素材和链接数据均存储在独立的数据表中,性能优异且与主题的前端 GraphQL 查询层无缝对接。插件后台预设了完整的「加盟推广」主菜单及八大子菜单,覆盖从加盟商管理、佣金结算到数据报表的全链路运营需求。无论你是运营垂直电商平台、内容变现社区,还是跨境多语言店铺,这套插件都能提供精准、高效、可定制的加盟推广管理体验。 ## 二、核心菜单功能详解 ### 2.1 概述(Overview)—— 数据驾驶舱 ![](https://pic.salongweb.com/2026/07/affiliate-1.webp)概述页面是插件的仪表盘,以十个核心统计卡片快速呈现全局运营状态:加盟用户数(含总计与活跃数)、总素材数、总链接数、总推广数、总访问量、总转化数、转化率、累计佣金、累计已付佣金、累计未付佣金。十大数据让管理者一屏掌握平台推广业务的整体健康度。 统计卡片下方是四组数据表格构成的运营看板,呈 2×2 布局: - **最优推广用户排行**:按收益和推广次数排序,识别高价值加盟商。 - **近期注册用户**:展示新加盟用户的审核状态,支持快速跟进。 - **最近访问记录**:展示推广链接的来源渠道和 URL 参数,帮助分析引流效果。 - **最新推广动态**:展示最新的订单转化记录,含状态标签(已支付/未支付/已拒绝/已退款)。 这套看板的设计初衷是让管理者无需跳转多个子页面即可完成日常巡检,快速发现异常(如被拒加盟申请激增、访问量突降等)。 ### 2.2 加盟管理(Affiliates)—— 加盟商全生命周期管理 ![](https://pic.salongweb.com/2026/07/affiliate-2.webp)加盟管理页面是插件的核心运营阵地,采用 WordPress 标准列表表格(WP\_List\_Table)呈现所有加盟商记录。每一行展示加盟商 ID、用户 ID、状态、佣金比例、累积收益、未支付收益、推广次数、访问次数、注册时间和审核时间。 表格支持按用户 ID 搜索和批量删除操作。插件预设了四种加盟商状态: - **待审核(pending)**:新提交申请,需运营人员人工审核,操作栏提供绿色的「通过」和红色的「拒绝」按钮。 - **已通过(active)**:正常推广中的加盟商,可执行停用、编辑、删除操作。 - **已停用(inactive)**:被暂时冻结的加盟商,支持一键恢复为活跃状态。 - **已拒绝(rejected)**:未通过审核的申请,支持重新激活(被拒绝的加盟商可自行在前端重新提交申请,状态重置为待审核并触发新通知)。 编辑页面支持修改状态(下拉选择)、佣金比例(百分比或固定金额)、佣金类型、网站网址、申请原因、累积收益、未支付收益、推广次数、访问次数和注册时间等信息。所有状态变更均会自动触发龙霄主题的通知系统(系统内支持站内通知、邮件通知、微信通知三种渠道独立开关),确保加盟商在个人中心实时收到审核结果通知。 表格上方新增了统计汇总栏,分「当前页」和「总计」展示当前筛选条件下的关键数据,包括访问量、推广数、转化数,以及按语言区域拆分的累计收益和未付收益(多币种场景下分别以对应货币符号显示),帮助管理者快速了解数据分布而不需要逐行加总。 ### 2.3 推广记录(Referrals)—— 订单级佣金明细 ![](https://pic.salongweb.com/2026/07/affiliate-3.webp)推广记录页面管理所有通过加盟链接产生的订单转化数据。表格列包含:ID、加盟商、客户、订单 ID、金额、状态、描述、时间和语言区域(多语言场景下显示)。 页面顶部提供筛选器,支持按订单 ID、加盟商 ID、客户 ID 和状态(全部/未支付/已支付/已拒绝/已退款)快速定位记录。内置批量操作(接受、拒绝、删除)大幅提升审核效率。访问日志、创意素材和链接管理页面同样支持批量删除操作;所有列表表格均支持通过界面选项自定义每页显示条数(默认 20 条)。 表格上方增设统计汇总栏,分「当前页」和「总计」展示已付佣金和未付佣金的金额汇总,多语言环境下按语言区域分别显示对应币种的合计值,方便管理者即时掌握推广成本的全貌。 新增和编辑推广记录的表单包含完整字段:加盟商用户 ID(必填)、客户 ID、订单 ID(必填)、金额(必填)、语言区域(多语言场景)、访问 ID、状态、参考信息、上下文和描述。插件内置并发锁机制(基于 WordPress Transient API),防止同笔订单重复创建佣金记录。当状态变更为「已支付」时,插件自动调用龙霄主题的余额系统,将佣金打入加盟商账户余额并发送站内通知和站外邮件(含微信)通知;当订单发生退款时,系统自动从余额扣除对应金额并从积分中扣除相应推广积分,实现全自动的佣金账务闭环。 ### 2.4 访问日志(Visits)—— 全链路引流溯源 ![](https://pic.salongweb.com/2026/07/affiliate-4.webp)访问日志页面记录了每一次通过加盟链接访问网站的完整数据。表格包含:ID、加盟商、访客、访问 URL、来源(Referrer)、Campaign、设备类型(桌面/手机/平板)、浏览器、操作系统、是否已转化、时间和 IP 地址。 数据颗粒度极细,支持按 URL 或来源搜索,以及批量删除和单条删除。每条记录都精准记录了设备指纹信息,这在反刷单场景中至关重要——结合插件后台的防刷设置,管理者可以轻松识别来自同一设备或 IP 的高频异常访问。 更重要的是,「已转化」标记将访问记录与推广记录打通,管理者可以追溯每一笔佣金是从哪个渠道、哪个 Campaign、哪个创意素材引流而来,实现推广 ROI 的精细化归因分析。插件内置系统日志(salong\_affiliate\_logs),自动记录佣金跳过、发放失败等异常事件,为排查问题提供完整审计链路。 ### 2.5 创意素材(Creatives)—— 标准化推广物料库 ![](https://pic.salongweb.com/2026/07/affiliate-5.webp)创意素材页面用于管理提供给加盟商的推广物料。支持三种素材类型:图片、二维码、链接。表格展示:ID、类型(带图片缩略图)、名称、Campaign、URL、状态(已上线/已下线)、创建时间和更新时间。 插件内置二维码生成功能(对接 api.qrserver.com 外部 API),输入的 URL 和名称可以一键生成二维码图片并自动上传到 WordPress 媒体库。三种素材类型在编辑表单中通过 JavaScript 动态切换字段显示,交互体验流畅。 每个素材支持上下线切换(上线/下线),管理者可以配合营销活动节奏灵活控制物料的可使用状态。在龙霄主题前端,加盟商在「创意素材」页面中只能看到状态为「已上线」的物料,确保推广物料的可控性和时效性。 ### 2.6 链接管理(URLs)—— 加盟商推广链接看板 ![](https://pic.salongweb.com/2026/07/affiliate-6.webp)链接管理页面展示系统中所有加盟推广链接记录,包含 ID、用户 ID、URL、Campaign、访问次数、转化次数、创建时间和更新时间。此页面与龙霄主题前端加盟商自行创建的链接形成对应关系——运营人员可以在此处集中管理所有手动创建的推广链接并查看每条链接的实时访问和转化数据。 其中「访问次数」和「转化次数」是直接从访问日志表中实时查询的统计结果,管理者能够直观判断哪些链接的引流效果最好,为后续的 Campaign 投放决策提供一手数据支撑。 ### 2.7 数据报表(Reports)—— 多维度经营分析 数据报表是插件中最具深度的功能模块。采用标签页导航 + 日期范围筛选的交互模式,支持按加盟商 ID、Campaign 和语言区域进一步下钻分析。四大标签页各具侧重: **加盟报表(Affiliates Tab)**:展示历史全部加盟总数、周期内新增加盟数、最佳转化率加盟商及其转化率。趋势图以日为单位展示加盟商注册曲线,Top 10 转换率排行榜让管理者快速识别高绩效群体。 ![](https://pic.salongweb.com/2026/07/affiliate-8.webp)**推广报表(Referrals Tab)**:按币种(多语言多币种场景)展示历史已支付总额、历史未支付总额、周期内已支付/未支付金额及均值。每日趋势图可视化佣金支出曲线,多语言区域的透视矩阵和 Top 10 排行榜帮助分析不同语言市场的佣金分布。 ![](https://pic.salongweb.com/2026/07/affiliate-7.webp)**访问报表(Visits Tab)**:展示历史总访问量、周期内访问量、周期内转化量、历史转化率、最佳来源渠道。每日趋势图结合来源排名表格,为流量渠道优化提供量化依据。 ![](https://pic.salongweb.com/2026/07/affiliate-9.webp)**活动报表(Campaigns Tab)**:展示历史 Campaign 总数、最佳转化 Campaign、周期内最活跃 Campaign、周期内最佳推广 Campaign。每日趋势图和 Top 10 排行榜提供 Campaign 粒度的效果对比。 ![](https://pic.salongweb.com/2026/07/affiliate-10.webp)所有报表图表均基于 Chart.js v4.5.1 渲染,搭配插件自研的数据缓存版本控制机制,在大量数据场景下依然保持流畅加载。 ### 2.8 加盟设置(Settings)—— 灵活可配的业务规则 ![](https://pic.salongweb.com/2026/07/affiliate-11.webp)加盟设置页面由 Codestar Framework 驱动,分为四大配置区块: **常规设置**:开放/关闭自主注册开关、允许/禁止自推广、是否启用人工审核、选择加盟协议页面、设置推广链接参数(默认 ref)、配置申请原因长度(默认 6-50 字符)及敏感词过滤。 **佣金设置**:支持百分比佣金或固定金额两种计费模式,每个加盟商可单独设置佣金比例覆盖全局默认值(新加盟商自动继承全局配置)。可配置佣金比例、固定金额和 Cookie 有效天数(默认 30 天)。注意:纯积分支付的订单不计推广转化。 **排除规则**:未付款订单不计佣金、免费/零元订单不计佣金、最后推荐计佣金、优惠券订单不计佣金、运费不计佣金、排除指定商品、积分支付订单不计佣金——七项规则为精细化佣金策略提供全面保障。 **防刷设置**:全局防刷机制开关、设备指纹检测、设备频率限制、IP 频率限制、时间窗口配置。四维防护体系有效遏制恶意刷单行为,保护平台佣金支出的安全性。 ## 三、与龙霄主题的协同适配优势 龙霄加盟推广插件与龙霄主题的协同绝非简单的「兼容」,而是深度、双向的原生融合: 1. **GraphQL 数据层完全打通**:插件注册了完整的 WPGraphQL 查询和变更(Mutation)类型,龙霄主题前端通过 `salongGetAuthorContent` 一个 GraphQL 查询即可获取所有加盟页面数据,无需额外 REST API 开发。 2. **余额系统集成**:佣金发放不需要单独开发提现模块,数据自动汇入龙霄主题的余额系统,与平台会员余额一体化管理。 3. **通知与动态系统融合**:加盟申请审核、佣金入账、订单退款等事件自动触发龙霄主题的站内通知、邮件通知(两种渠道可独立开关)和动态日志,加盟商在个人中心的「通知」和「动态」频道即可接收所有推广相关消息。 4. **多语言多币种原生支持**:通过龙霄主题的 Polylang 集成层,每笔推广记录、每个创意素材、每条链接均可关联语言区域,数据报表支持按币种拆分统计,满足跨境多语言电商的复杂需求。 5. **积分系统联动**:推广转化成功后,主题的积分系统可自动奖励推广积分(默认 100 分,可在主题积分设置中自定义);退款时系统同步扣除相应积分,形成「佣金 + 积分」的双重激励机制。 6. **前端路由无缝嵌入**:插件不需要创建任何前端模板,龙霄主题的 `/user/{id}/affiliate/*` 路由体系原生解析插件数据,加盟商在个人中心即可完成申请、查看数据、管理链接和素材等全部操作。 ## 四、实操价值与用户收益 从运营视角来看,插件解决了电商加盟推广中最核心的三个问题: **效率提升**:从加盟申请审核到佣金结算,所有操作无需离开 WordPress 后台。列表表格的批量操作、搜索筛选和快速状态切换,将日常运营效率提升数倍。 **数据驱动**:八大菜单覆盖了「拉新→追踪→转化→结算→分析」的全链路数据,管理者不是在「凭感觉运营」,每一笔佣金支出都有完整的访问→转化→结算链路可追溯。 **风险控制**:防刷设置、排除规则和访问日志的设备指纹信息,从规则层面和技术层面双重保障平台利益,有效降低恶意刷单带来的经济损失。 ## 五、适用人群 龙霄加盟推广插件最适合以下场景:正在使用龙霄主题搭建多语言电商平台(如跨境独立站、垂直品类电商、数字商品平台)的站点管理者,尤其是那些希望建立自有加盟推广体系、降低营销获客成本、精细化追踪推广效果的运营团队。插件同时也适用于需要为内容创作者、KOL 和社群团长提供标准化推广工具和佣金结算机制的平台型站点。 --- # WordPress龙霄主题:AI一键翻译 **URL:** https://salongweb.com/longxiao-ai-translation.html > 基于 DeepSeek 大模型,为龙霄主题深度集成 AI 智能翻译引擎。在 WordPress 后台一键完成 Polylang 字符串、页面、文章、分类标签和导航菜单的翻译,中文(简体)一键生成中文(繁体)和英文版本,彻底告别多语言网站繁重的人工翻译工作。 ## 一、一键翻译 Polylang 插件字符串 Polylang 字符串翻译页面集中了主题和插件中的所有前端文本。龙霄主题在每个翻译输入框旁嵌入「AI」按钮,点击即可调用 DeepSeek 大模型,将简体中文一键翻译为繁体中文和英文。 **操作方式:** 进入 WordPress 后台 → 语言 → 字符串翻译,在每个翻译输入框旁点击「AI」按钮。系统自动识别原文语言,调用 DeepSeek API 在 1-3 秒内返回翻译结果并填充到输入框中。 **批量翻译:** 点击页面顶部的「翻译当前页面」按钮,一次性翻译当前页面上所有未翻译的字符串,无需逐条操作。 **覆盖范围:** 主题选项描述、前端组件标签、表单提示文字、按钮文本等所有注册到 Polylang 的字符串。 ## 二、一键翻译页面 WordPress 页面(Pages)通常承载「关于我们」「联系方式」「隐私政策」等核心内容,翻译质量直接影响品牌形象。龙霄主题在页面编辑和列表页面均提供了 AI 翻译入口。 **单页面翻译:** 在页面编辑页面的 Polylang 语言框中,点击目标语言旁的「AI」按钮,系统自动完成以下所有字段的翻译: 字段说明页面标题自动翻译为繁体中文和英文页面内容保持 HTML 结构和短代码完整,仅翻译文本内容页面别名(Slug)自动生成对应语言的 URL 别名SEO 标题翻译并优化搜索引擎标题SEO 描述翻译元描述字段所有字段在同一次 API 调用中完成,翻译结果以「草稿」状态保存,方便预览和微调后发布。 **批量翻译:** 在页面列表页勾选多个页面,从批量操作中选择「AI 翻译」,系统逐页处理并实时显示进度条。 ## 三、一键翻译文章 文章(Posts)是网站内容的核心。龙霄主题支持单篇翻译与批量翻译两种模式,覆盖文章标题、正文、别名及所有 SEO 元数据。 **单篇翻译:** 在文章编辑页面的 Polylang 语言框中点击目标语言旁的「AI」按钮: - 文章标题精准翻译,保留专有名词和品牌名称 - 正文保持排版格式、图片和短代码不变 - 自动生成对应语言的别名 - SEO 标题和描述同步翻译 **批量翻译:** 在文章列表页勾选多篇文章 → 批量操作 → 「AI 翻译」。系统逐一处理,大段落文章自动分块以确保翻译质量,完成后显示处理结果统计。 **智能批处理:** 标题 + 正文 + 别名在一次 API 请求中捆绑翻译,SEO 字段在另一次请求中完成。翻译 200 篇文章仅需 2-3 小时,而人工翻译需要 400-600 小时。 ## 四、一键翻译分类标签 分类(Categories)和标签(Tags)构成网站的内容导航体系。龙霄主题在分类和标签管理列表页直接嵌入 AI 翻译按钮,无需进入编辑页面即可完成翻译。 **操作方式:** 在分类或标签列表页,每个分类/标签行右侧有「AI」按钮,点击即翻译名称、描述和别名三种字段。勾选多个条目后选择「AI 翻译」批量操作,一键完成所有翻译。 **翻译效果:** 分类名称在不同语言版本间保持语义一致。例如「前端开发」→「Frontend Development」→「前端開發」,用户在切换语言时分类导航和标签云准确对应,不会出现错位或丢失。 ## 五、一键翻译及转换菜单 导航菜单是 WordPress 多语言化中最复杂的环节。龙霄主题的菜单翻译功能不仅翻译菜单项标题,更智能处理菜单项所指向内容的翻译与关联。 **一键完成以下五项工作:** 1. **翻译菜单项标题** — 所有菜单项标题自动翻译为目标语言 2. **翻译关联的文章和页面** — 遍历菜单链接,如果指向的文章或页面没有目标语言版本,自动调用 DeepSeek 创建翻译(标题 + 正文 + 别名 + SEO 全量翻译) 3. **翻译关联的分类和标签** — 同样自动创建缺失的分类和标签翻译版本 4. **修正自定义链接** — 自定义 URL 自动添加正确的语言前缀 5. **保留结构与样式** — 菜单层级、CSS 类和 HTML 属性完整保留 **实际场景:** 一个包含「关于我们」(指向页面)、「产品中心」(指向分类归档)、「最新动态」(指向多篇文章)的菜单,点击「AI 翻译」→ 选择目标语言 → 系统自动翻译所有标题,自动创建缺失的页面、分类和文章翻译,自动链接到翻译后的菜单。全过程无需手动创建任何内容。 ## 技术支撑 项目说明AI 模型DeepSeek-V3(`deepseek-chat`),温度 0.1翻译方向简体中文 → 繁体中文 + 英文数据流WordPress 后台 → WPGraphQL → DeepSeek API保存方式翻译结果以「草稿」状态保存插件集成深度集成 Polylang 多语言框架前端框架Nuxt 4 + `@nuxtjs/i18n` 无前缀策略龙霄主题的 AI 一键翻译,让多语言网站管理从「人力密集型」转变为「AI 驱动型」。无需聘请专业翻译,无需逐条手动输入,一个按钮即可完成全部翻译工作。 --- # 前端开发利器Emmet的介绍 **URL:** https://salongweb.com/emmet-introduce.html [![前端开发工具Emmet的介绍](https://pic.salongweb.com/2014/02/emmet.jpg)](https://pic.salongweb.com/2014/02/emmet.jpg) 曾经也为写HTML/CSS代码而烦恼过,不愿再写下去,感觉很烦琐,写那么多的尖括号,用的标签都是在重复写,而且绝大多数标题都需要闭合标签,再多几个无序列表就更头疼。 如果在编写代码时可以简写这些标签,符号,提高我们在写HTML/CSS代码时的效率,这一定是件幸福的事。而有了Emmet,前端开发人员都会比以前更幸福。 Emmet,一个强大的插件,可以为我们解决这些问题,是前端开发人员必备的工具包。可以在许多流行的文本编辑器中安装使用,大大提高了编写HTML和CSS代码的工作效率。 Emmet是用纯JavaScript编写的,是一款跨平台的强大HTML/CSS代码编辑插件,超高速的完成HTML/CSS的开发。 最初知道有这样神奇的插件是寻找Sublime Text插件时,知道Zen Coding,一个可以快速编写HTML/CSS代码的工具,看到演示效果,只有用神奇来表达,现在有了Emmet,而且是在Zen Coding基础上再次开发,功能各方面肯定是更加强大。 下面就在Sublime Text和Notepad++这两款编辑器中安装,一些代码编写还是以Sublime Text为例(推荐大家使用Sublime Text编辑器,用了你肯定会喜欢,而Notepad++是相当好的开源文本编辑器,舍不得删除。) **Emmet的安装:** **1、在Sublime Text安装:** 没有用过Sublime Text编辑器的朋友可以先到网上搜索一下,有很多相关的教程,个人相当推荐的一款跨平台的编辑器。 在Sublime Text中按“Ctrl+Shift+p”快捷键或在菜单-工具中打开“命令面板”,输入:Install Package (安装扩展)后回车,弹出新的窗口,再查找“Emmet”确定安装: **2、在Notepad++安装:** 打开菜单:插件-Plugin Manager-Show Plugin Manager面板,找到“Emmet”勾选后,点击“Install”,中途会弹窗提示需要安装或更新文件,确定就OK。 用Emmet编写时需要再转换成HTML/CSS代码,而Sublime Text和Notepad++的快捷键是不一样,分别是:Tab和Ctrl+Alt+Enter。 **Emmet快速编写HTML/CSS:** 缩写是Emmet的核心,Emmet中特殊的表达式在运行时解析和转化为结构化代码块,缩写的语法看起来就是CSS选择器和一些特定的HTML代码,所以稍微了解了就能看明白和如果使用。 **我们先举个例,在编辑器中输入:** 1. \#page>div.logo+ul#navigation>li\*5>a{Item $} 再按Tab键你会看到它神奇的效果,得到的HTML代码是: 1. <div id=”page”> 2. <div class=”logo”></div> 3. <li><a href=””>Item 1</a></li> 4. <li><a href=””>Item 2</a></li> 5. <li><a href=””>Item 3</a></li> 6. <li><a href=””>Item 4</a></li> 7. <li><a href=””>Item 5</a></li> 8. </ul> 9. </div> 神奇吧,仅需一行简单的代码,就可以生成完美的HTML代码结构,对应的class、id都写好了,如果不用Emmet编写,估计你也会有点头疼。 **而编写CSS也一样的让人惊叹,比如:** 1. bdrs6 **得到的CSS代码是:** 1. -webkit-border-radius: 6px; 2. -moz-border-radius: 6px; 3. border-radius: 6px; 连浏览器兼容性都考虑在其中,让人爱不释手。 **其实了解了Emmet的原理,看下插件的js代码,你会更明白,而插件的核心是缩写,所有的HTML/CSS标签缩写都存储在js文件的代码片段中,例如下面的js文件中一段代码:** 1. { 2. “html”: { 3. “abbreviations”: { 4. “a”: “<a href=\\”\\”>”, 5. “link”: “<link rel=\\”stylesheet\\” href=\\”\\” />” 6. … 7. }, 8. “snippets”: { 9. “cc:ie6”: “<!–\[if lte IE 6\]>\\n\\t${child}|\\n<!\[endif\]–>” 10. … 11. } 12. }, 13. 14. “css”: { 15. … 16. } 17. } **基本的思路:打开/新建 HTML/CSS 文件,按照基本的语法编写Emmet代码,再按Tab键生成HTML/CSS代码。** 按Tab键生成HTML/CSS代码时需要光标停靠在Emmet代码的后面,不能有空格,Emmet代码之前也不能有空格,不然只会生成一个tab制表符。如果光标在Emmet代码内部任意位置,按Tab键只会生成光标前面的代码,而后面的Emmet代码还是原样,跟随在生成的HTML/CSS代码后面。 \[musicbox\]自从Emmet后,在网站开发效率上有相当大的提高,Emmet很强大,后期还有三篇文章来介绍Emmet。\[/musicbox\] --- # 网站建设中SEO的重要性 **URL:** https://salongweb.com/web-seo.html [![网站建设中SEO的重要性](https://pic.salongweb.com/2013/04/SEO.jpg)](https://pic.salongweb.com/2013/04/SEO.jpg) 调查显示,一个网站的编程工作仅占全部工作的30%左右,而网站优化和策略决定等占了大部分。所以在网站做出来以后最重要的部分就是网站的SEO优化。这里我们说说SEO对网站的重要性,以及在网站SEO的过程中应该留言的一些方面。 **网站设计时需要留意的一些细节** 上面我们说了,网站的SEO不该在网站设计完后进行,将会导致很严重的后果。此外这里再说下网站设计方面应该留言的地方。网站的导航栏不要用Javascript来进行设计,这是不利于搜索引擎抓取你的网页的!如果你非要为了网站的美观一定要使用Javascript的话,那么我建议你一定要提供基于HTML的替代。因为,用Javascript来设计网站导航栏的话,搜索引擎蜘蛛是不能识别Javascript的,也就使搜索引擎蜘蛛不能更好的爬行你的网站以便收录网页。 **SEO和网站的体系构造** 网站的体系结构,是所有搜索引擎营销的基础。理想的网站体系结构能使得搜索引擎更好的遍历并理解你的网站。所以,我们在创建网站时要使用搜索引擎优化的体系结构,是达到并维持比较好的搜索引擎排名的主要决定因素。 我们的网站设计者在制作网站时,就考虑好网站的体系结构。如果设计出来的网站的某些内容模块不允许搜索引擎访问的话,那么良好内容对网站排名的影响将会降低。例如,网站的某些内容是使用flash或是ajax来展示的,这将会使搜索引擎忽略这些内容。 但是,有些方面,比如对用户友好的设计,并不是对搜索引擎友好的。因此,我们只能采取折中的手段来满足这两中访问者:用户和搜索引擎。 **SEO不能在网站启动后进行** 一个常见的误解就是搜索引擎优化,也就是SEO可以在网站上线后进行,这是不正确的。在网站设计的过程中,网站设计者就应该把网站设计成搜索引擎友好的网站。但是不幸的是,在没有考虑网站SEO就设计完一个网站后,就开始为搜索引擎埋下了祸根,这会使搜索引擎优化变为一个很艰难的任务。如果把网站重新设计成友好与搜索引擎的话,这会花费更大的代价!因此,SEO应该在网站设计当中就应该考虑的。 总结:我们应该在网站设计的过程中就应该考虑SEO,而不要等到网站设计完成后。 --- # WordPress+Nuxt3前后端分离项目,实现不限层级的多维数组菜单 **URL:** https://salongweb.com/wordpress-nuxt3-menu-multidimensional-arrays.html 使用 WordPress+Nuxt3做前后端分离项目时,菜单需要多维数组,且不限层级,可以使用递归函数很方便地将 `wp_get_nav_menu_items` 返回的对象数组转换为多维数组,实现不限层级的转换。 ``` /** * 输出菜单为多维数组 * 不限层级 * * @param [type] $items * @param integer $parent_id * @return void * @DateTime 2023-04-25 * @Author 萨龙龙 @ admin@salongweb.com * @copyright 萨龙网络:https://api.salongweb.com * @version 1.0 */ function salong_convert_menu_items_to_array($items, $parent_id = 0) { $menu_items = array(); foreach ($items as $item) { if ((int) $item->menu_item_parent === $parent_id) { $menu_item = array( 'id' => $item->ID, 'title' => $item->title, 'url' => $item->url, 'children' => array(), ); $children = salong_convert_menu_items_to_array($items, $item->ID); if (!empty($children)) { $menu_item['children'] = $children; } $menu_items[] = $menu_item; } } return $menu_items; } $menu_locations = get_nav_menu_locations(); // 获取换所有菜单项 $header_menu_id = $menu_locations['header-menu']; // 头部菜单 ID $menu_items = wp_get_nav_menu_items($header_menu_id); $menu_items_array = salong_convert_menu_items_to_array($menu_items); print_r($menu_items_array); ``` --- # WordPress一行代码允许重复评论的功能 **URL:** https://salongweb.com/wordpress-allow-duplicate-comment-id.html 默认情况下WordPress是不允许重复的评论提交,主要是为了防止垃圾评论。有些情况下又需要重复评论,最近用户需要在[MNews Pro主题](https://api.salongweb.com/product/mnews-pro.html)上定制一个直播功能,其中互动就需要允许重复评论。我们将这段代码添加到主题根目录下的`functions.php`文件中,即可允许重复评论。 ``` add_filter('duplicate_comment_id', '__return_false'); ``` 信佛的朋友可以关注下:,直播是寺庙的师傅,讲授佛法。佛教中请的最多的是:`阿弥陀佛`,互动时依然是这样,必须允许重复评论。 说到垃圾评论,不得不讲垃圾注册,是WordPress的两大毒瘤,下一篇文章要介绍下通过代码对用户名和邮箱进行处理,如何禁止垃圾注册。 --- # WordPress+Nuxt.js+Vue.js开发的前端node项目被停止的处理方案 **URL:** https://salongweb.com/wordpress-nuxt-js-vue-js-node-stopped.html Slhao Pro主题前端上线后每天能收到宝塔的提示,说项目已经停止,找了很久没有发现问题。在查看node项目网站日志中的响应日志和错误日志时,发现大量的` /go?url=链接`请求,估计是这个问题导致node项目负载过高,从而导致node项目被停止。 ## 解决方法 在node项目管理——配置文件中新增一条Nginx的规则,将所有带/go字样的链接都返回403,代码如下: ``` # 禁止/go链接的访问 location /go { deny all; } ``` 重启Node项目,访问带/go字样的所有链接都将返回403,这样对前端服务就没有任何影响。 ## 补充 以上解决方法在一段时间内不会出现服务被停止的问题,时间久了还是有问题,最好是安装下服务器防火墙。防火墙默认设置基本能防止被攻击,再将一些经常访问特定链接(/go,/wp-admin)的IP加入黑名单,Slhao Pro主题前端到现在没有再出现服务被停止的情况。 --- # WordPress 使用 wp_set_password 重置用户密码 **URL:** https://salongweb.com/wordpress-wp_set_password.html 当 WordPress 管理员忘记密码或需要重置用户密码时,可以使用 `wp_set_password` 函数来实现。该函数将为指定用户设置新密码,该密码将经过哈希处理并保存在数据库中。 以下是使用 `wp_set_password` 函数重置 WordPress 用户密码的步骤: 1、进入服务器/宝塔网站文件管理中,找到当前活动的主题目录并打开 `functions.php` 文件 2、在 `functions.php` 文件中添加以下代码: ``` // 重置密码 function reset_user_password() { $user_id = 1; // 更改为需要重置密码的用户的 ID $new_password = 'newpassword'; // 更改为新的密码 wp_set_password($new_password, $user_id); } // 添加一个名为 reset_password 的动作钩子 add_action('init', 'reset_user_password'); ``` 3、将 `$user_id` 和 `$new_password` 变量的值更改为需要重置密码的用户的 ID 和新的密码。 4、保存 `functions.php` 文件并刷新 WordPress 管理页面。 5、刷新页面可即可删除步骤2中的代码,再次保存 现在,当您刷新 WordPress 管理页面时,`reset_user_password` 函数将会被调用,并为指定的用户设置新密码。 注意:在使用此方法之前,请务必备份您的网站,以防止不可预测的错误发生。此外,确保删除或注释掉添加的代码,以免在不需要时再次运行该函数。 --- # WordPress 出现 Allowed memory size of 134217728 bytes exhausted 错误如何修复 **URL:** https://salongweb.com/wordpress-allowed-memory-size-bytes-exhausted.html 当出现 “Allowed memory size of 134217728 bytes exhausted” 错误时,意味着 PHP 内存限制被耗尽。这通常发生在处理大型文件、大量数据或执行复杂操作时。 以下是修复该错误的几种方法: 1. 增加 PHP 内存限制 - 可以通过在 WordPress 根目录下的 wp-config.php 文件中添加以下行来增加 PHP 内存限制: ``` define('WP_MEMORY_LIMIT', '256M'); ``` - 在宝塔面板——软件商店中找到网站使用的 PHP,将设置中的内容加大,如下图: ![](https://pic.salongweb.com/2023/03/php-memory-limit.jpg)请注意,如果您的主机没有足够的可用内存,这种方法可能不起作用。 2. 优化代码 检查您的代码是否存在循环或递归等问题,这可能导致内存泄漏。您还可以尝试使用 PHP 内置函数来优化代码,例如 `unset()` 函数,它可以释放变量占用的内存。 3. 禁用插件或主题 某些插件或主题可能会使用大量内存,尝试禁用它们以确定是否解决问题。 4. 增加服务器内存 如果您的服务器有足够的内存,您可以尝试增加内存限制。您可以通过联系您的主机提供商来获得帮助。 5. 使用缓存插件 使用缓存插件可以减少服务器负载和内存使用量,并提高网站性能。推荐使用 WP Super Cache 或 W3 Total Cache 等缓存插件。 总之,当出现 “Allowed memory size of 134217728 bytes exhausted” 错误时,您应该首先尝试增加 PHP 内存限制。如果这不起作用,请考虑优化代码、禁用插件或主题,或增加服务器内存。 --- # WordPress 获取用户 ID 的8种方法 **URL:** https://salongweb.com/wordpress-get-user-id.html 在 WordPress 主题的开发过程中,获取用户 ID 的频率是很高的,可在 WordPress 中查看用户信息,也可以通过代码直接获取。 ### 一、在 **WordPress 后台区域找到用户 ID** 这是一个非常简单的方法,需要有后台管理权限的用户才能查看。 1、登录 WordPress 后台 2、转到用户——所有用户列表页面 3、编辑用户 4、在当前页面链接中的 user\_id= 后面的数字即是用户的 ID ### 二、获取当前用户 ID(也可以获取用户名,Email 等) 获取当前登录用户ID的最佳方法是使用`get_current_user_id()`函数。 ``` $current_user_id = get_current_user_id(); ``` 与wp\_get\_current\_user()方法相同的函数: ``` $current_user = wp_get_current_user(); $current_user_id = $current_user->ID; ``` `get_current_user_id()`的用法对我来说似乎更简单,但你可以使用任何你想要的方式,因为在代码中它们是相同的。 获取用户其它信息: ``` $user_email = $current_user->user_email; $first_name = $current_user->first_name; $display_name = $current_user->display_name; ``` ### 三、通过 Email 获取用户 ID 可使用 `get_user_by()` 函数获取用户信息 ``` $the_user = get_user_by('email', 'admin@salongweb.com'); $the_user_id = $the_user->ID; ``` 反过来,我们也可以通过 ID 获取用户的 Email ``` $the_user = get_user_by( 'id', 1 ); // 用户 ID 为1 echo $the_user->user_email; ``` ### 四、通过用户名获取用户 ID 同样是使用 `get_user_by()` 函数获取用户信息 ``` $the_user = get_user_by('login', 'salongweb'); $the_user_id = $the_user->ID; ``` 反过来,我们也可以通过 ID 获取用户的用户名,和通过 ID 获取用户 Email 是一样的。 五、通过姓名名获取用户 ID 打印所有姓为“sa”的用户的 ID: ``` global $wpdb; $users = $wpdb->get_results("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'first_name' AND meta_value = 'sa'"); if ($users) { foreach ($users as $user) { echo $user->user_id; } } else { echo '没有该姓的用户。'; } ``` 打印所有名字为“longlong”的用户的 ID: ``` global $wpdb; $users = $wpdb->get_results("SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'first_name' AND meta_value = 'longlong'"); if ($users) { foreach ($users as $user) { echo $user->user_id; } } else { echo '没有该名字的用户。'; } ``` 如果您想通过任何用户元值查找用户ID,那么上面的代码可以工作。只需将`meta_key`和`meta_value`替换为您需要的。 当然,在get\_user\_meta( $id, $meta\_key, true)函数的帮助下,你也可以得到用户的姓和名以及任何meta。 ### 六、通过文章 ID 获取作者 ID 在这种情况下,您可以从`WP_Post`对象获取用户ID。 ``` $my_post = get_post( $post_id ); // 获取文章 ID 获取文章数据 echo $my_post->post_author; // 打印出作者 ID ``` 也可以使用 `get_post_field()` 函数来直接获取作者的 ID ``` $author_id = get_post_field('post_author', $post_id); ``` ### 七、从 WooCommerce 的订单中获取客户 ID 有两种不同的方法,第一种是通过订单元数据获取客户 ID: ``` $customer_id = get_post_meta( 123, '_customer_user', true); // 123 是订单 ID ``` 第二个可通过`WC_Order`类来获取,WooCommerce 版本需3.0 +。 ``` $order = wc_get_order( 123 ); // 123 是订单 ID $customer_id = $order->get_customer_id(); // 或者 $order->get_user_id() 是一样的 ``` ### 八、将用户 ID 添加到 WordPress 用户列表的列中 这对于管理员来说,查看用户 ID 是相当的方便快捷,可将如下代码添加到 WordPress 主题函数文件 functions.php 中 ``` /* * 添加用户列表栏目 */ function salong_user_id_column($columns) { $columns['user_id'] = 'ID'; return $columns; } add_filter('manage_users_columns', 'salong_user_id_column'); /* * 栏目内容 */ function salong_user_id_column_content($value, $column_name, $user_id) { if ('user_id' == $column_name) return $user_id; return $value; } add_action('manage_users_custom_column', 'salong_user_id_column_content', 10, 3); ``` --- # WordPress 如何根据文章类型向编辑器添加 CSS **URL:** https://salongweb.com/wordpress-editor-add-css.html 在 WordPress 中,我们可以通过向主题中添加 CSS 文件来为页面和文章添加样式。但是,如果您希望根据文章类型添加自定义样式,该怎么办呢?在本文中,我们将介绍如何在文章编辑器中添加自定义 CSS 样式,以根据文章类型为区块编辑器添加样式。 步骤 1:创建一个新的 CSS 文件 首先,我们需要创建一个新的 CSS 文件,其中包含我们想要为区块编辑器添加的样式。将该文件命名为 custom-editor-style.css,并将其放置在您的主题文件夹中的任何位置。 步骤 2:将 CSS 文件链接到主题 接下来,我们需要将 CSS 文件链接到我们的主题中。在您的主题的 functions.php 文件中添加以下代码: ``` function salong_add_editor_style() { global $post; if( 'post' === $post->post_type ) { add_editor_style( 'path/to/custom-editor-style.css' ); } } add_action( 'admin_init', 'salong_add_editor_style' ); ``` 请将上面的代码中的“post\_type\_name”替换为您的文章类型的名称。此代码将确保只在编辑该文章类型时添加自定义样式。 步骤 3:为您的文章类型添加样式 最后,在 custom-editor-style.css 文件中添加您想要为您的文章类型添加的样式。您可以使用选择器针对您的文章类型添加样式,例如: ``` .post-type-name .wp-block { /* 自定义样式 */ } ``` 现在,当您编辑您的文章类型时,将会应用您为该文章类型添加的自定义样式。 --- # WordPress 主题 Slearn Pro 课程插件之编辑课程选项 **URL:** https://salongweb.com/wordpress-slearn-pro-course-options.html 课程插件功能已经能满足绝大多数在线教育培训课程网站的需求,选项功能也众多,「即将推出」功能还在开发中。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-01.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-02.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-06.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-03.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-04.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-05.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-06.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-07.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-08.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-09.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-10.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-options-11.jpg) --- # WordPress 主题 Slearn Pro 课程插件之编辑文章时创建和选择课时 **URL:** https://salongweb.com/wordpress-slearn-pro-edit-course-create-select-lesson.html 在WordPress + Vue.js 主题 Slearn Pro 发布2.0重写版本后,用户反馈编辑课程选择课时时不够友好,课时很多时选择就相当困难,被选择的课时在后期选择中还会是出现,为了这个功能模块特意花了几天,最终呈现效果完美,体验极佳的课时选择面板。 ### 1、默认是没有任何内容 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-01.jpg)### 2、创建章节后 章节标题可再次修改,设置章节描述,创建一个新的课时或者选择已经添加好的课时。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-02.jpg)### 3、选择课时面板 创建新课时或选择已经的课时都将和当前课程进行关联,其它课程则不能选择已选择的课时。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-03.jpg)已选择好的课时,添加后将与当前课程进行关联。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-04.jpg)### 4、选择后的结果 章节可开关,排序和删除,删除,删除章节时,其中的全部课时也将与当前课程取消关联。 课时可排序,预览开关切换,编辑和删除,修改标题回车后也可以修改课时标题。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-05.jpg)### 5、最终设置好的课时 「JSON 数据」可单独保存起来,这样不管当前课程目录被怎么修改,后期都可复制数据到「JSON 数据」中直接恢复。 ![](https://pic.salongweb.com/2022/11/slearn-pro-edit-course-06.jpg) --- # WordPress 主题 Slearn Pro 产品插件之属性设置 **URL:** https://salongweb.com/wordpress-slearn-pro-product-attribute-options.html 产品属性可在后台「产品——产品选项——属性」中单独设置(也可在编辑产品时再次添加),有三种类型:文本、颜色和图片,在前台也是以这三种方式来显示。 编辑产品时可为已添加的属性添加属性值,也可以添加自定义属性,这些属性不会保存到主题选项中。 ![](https://pic.salongweb.com/2022/11/slearn-pro-options-product-01.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-options-product-02.jpg) ![](https://pic.salongweb.com/2022/11/slearn-pro-options-product-03.jpg) --- # WordPress 主题 MNews Pro 5.2 投稿新增可插入音视频功能 **URL:** https://salongweb.com/wordpress-mnews-pro-contribute-insert-audio-video.html MNews Pro 主题已经更新到5.2版本,功能已经很完善,且实用,在文章投稿编辑器有用户提出不能上传视频或者插入视频简码不方便的问题。 这次更新,完全解决了图片,音视频上传及音视频简码插入文章不方便的问题,图片,音视频上传时都会根据需求进行获取,比如上传缩略图或者上传图片到编辑器中,我的媒体库则用户上传的图片,如果是添加音视频则获取用户上传的音视频,同时音视频在鼠标移入时会自动播放,移出后暂停,这样方便查找。 视频上传可选择 HTML5视频或内嵌视频(iframe嵌入的代码),而 HTML5视频又需要视频源地址和封面图片,在插入视频面板都可以从我的媒体库中独立上传插入到选项中。 投稿编辑器中新增的音视频上传功能,让投稿更加方便有效,让我们来预览下效果。 ![](https://pic.salongweb.com/2022/08/wordpress-mnews-pro-contribute-insert-audio-video-1.jpg) ![](https://pic.salongweb.com/2022/08/wordpress-mnews-pro-contribute-insert-audio-video-2.jpg) ![](https://pic.salongweb.com/2022/08/wordpress-mnews-pro-contribute-insert-audio-video-3.jpg) --- # WordPress 主题获得评论深度的2种方法 **URL:** https://salongweb.com/wordpress-get-comment-depth.html ## 一、通过使用全局变量获取评论深度 我相信您应该知道`wp_list_comments()`函数,它可以将评论打印在网站页面上。 为什么这个功能很酷? 1、这个函数运行一个评论循环,并设置一个全局变量,该变量包含循环中当前评论的深度级别。 2、`wp_list_comments()`允许您通过使用回调参数指定自己的评论模板。 ``` wp_list_comments('callback=my_custom_comment_template'); ``` 在`my_custom_comment_template()`中,将设置全局变量`$comment_depth`和`$GLOBALS['comment_depth']`。 ## 二、通过评论ID获取评论深度 如果全局变量`$comment_depth`不可用,我怎么得到一个评论深度级别呢? 我想这个简单的函数可以帮助你: ``` function salong_get_comment_depth($my_comment_id) { $depth_level=0; while($my_comment_id > 0) { $my_comment=get_comment($my_comment_id); $my_comment_id=$my_comment->comment_parent; $depth_level++; } return $depth_level; } ``` 然后: ``` echo salong_get_comment_depth(784); // 打印出评论ID 为784的深度级别 ``` --- # 在 WordPress 主题中编辑器 WooCommerce 产品选项卡-tabs **URL:** https://salongweb.com/wordpress-woocommerce-change-product-tabs.html WooCommerce 产品页面默认有3个选项卡:描述,其它信息和评论,对于很多 WordPress 主题或许不太适合,需要修改或者添加选项卡。WooCommerce 官方文档已经给出了详细的文档: 需要将代码添加到主题`functions.php`文件。 **1、删除选项卡** ``` /** * 删除产品数据选项卡 */ add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 ); function woo_remove_product_tabs( $tabs ) { unset( $tabs['description'] ); // 删除描述 unset( $tabs['reviews'] ); // 删除评论 unset( $tabs['additional_information'] ); // 删除其它信息 return $tabs; } ``` **2、重命名选项卡** ``` /** * 重命名选项卡 */ add_filter( 'woocommerce_product_tabs', 'woo_rename_tabs', 98 ); function woo_rename_tabs( $tabs ) { $tabs['description']['title'] = __( '产品详情' ); // 重命名描述 $tabs['reviews']['title'] = __( '产品评论' ); // 签名评论 $tabs['additional_information']['title'] = __( '产品参数' ); // 签名其它信息 return $tabs; } ``` **3、更改选项卡顺序** ``` /** * 更改选项卡顺序 */ add_filter( 'woocommerce_product_tabs', 'woo_reorder_tabs', 98 ); function woo_reorder_tabs( $tabs ) { $tabs['reviews']['priority'] = 5; // 评论第一 $tabs['description']['priority'] = 10; // 描述第二 $tabs['additional_information']['priority'] = 15; // 其它信息第三 return $tabs; } ``` **4、自定义选项卡内容** ``` /** * 自定义选项卡内容 */ add_filter( 'woocommerce_product_tabs', 'woo_custom_description_tab', 98 ); function woo_custom_description_tab( $tabs ) { $tabs['description']['callback'] = 'woo_custom_description_tab_content'; // 自定义描述回调 return $tabs; } /** * 选项卡内容 */ function woo_custom_description_tab_content() { echo '

Custom Description

'; echo '

Here\'s a custom description

'; } ``` **5、添加自定义选项卡** ``` /** * 添加一个自定义选项卡 */ add_filter( 'woocommerce_product_tabs', 'woo_new_product_tab' ); function woo_new_product_tab( $tabs ) { // 添加一个新选项卡 $tabs['test_tab'] = array( 'title' => __( '名称', 'woocommerce' ), 'priority' => 50, 'callback' => 'woo_new_product_tab_content' ); return $tabs; } /** * 选项卡内容 */ function woo_new_product_tab_content() { // The new tab content echo '

New Product Tab

'; echo '

Here\'s your new product tab.

'; } ``` **6、附加信息选项卡** “附加信息”选项卡仅在产品设置了重量、尺寸或属性,并选中“在产品页面上可见”时才会显示。如果在产品没有重量、尺寸或属性时,尝试对该选项卡更改,将出现类似于以下的错误消息: ``` Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in /mysite/wp-content/plugins/woocommerce/templates/single-product/tabs/tabs.php on line 35 ``` 在这种情况下,必须使用 WooCommerce 条件判断: ``` has_attributes() has_dimensions() has_weight() ``` 比如此段代码: ``` /** * 检查产品是否有属性、尺寸或重量 */ add_filter( 'woocommerce_product_tabs', 'woo_rename_tabs', 98 ); function woo_rename_tabs( $tabs ) { global $product; if( $product->has_attributes() || $product->has_dimensions() || $product->has_weight() ) { $tabs['additional_information']['title'] = __( '产品参数' ); // 重命名附加信息选项卡 } return $tabs; } ``` 有了这些代码,稍作修改,定制选项卡易如反掌。 --- # WordPress 主题禁用古滕堡编辑器和小工具 **URL:** https://salongweb.com/disable-block-editor.html WordPress 4.9.8 版本就发布了古滕堡编辑器,很好用,添加文章也比经典编辑器方便很多。在 5.8 版本后又在小工具中增加了古滕堡编辑器,功能差不多,对于 WordPress 主题开发者来说,古滕堡小工具的前台样式不太好控制,且自定义的小工具也需要将样式连接到外观——小工具中,不然自定义小工具预览就有问题。 对于很多不喜欢使用古滕堡编辑器的朋友,我们可以将如何代码添加到 functions.php 函数文件中,来使用经典编辑器。 ``` // 禁用古滕堡编辑器 add_filter('use_block_editor_for_post', '__return_false'); // 禁用古滕堡小工具编辑器 remove_theme_support('widgets-block-editor'); ``` --- # 阿里云 ECS 扩容后扩展分区和文件系统_Linux系统盘(宝塔同步) **URL:** https://salongweb.com/ecs-linux-baota.html 萨龙网络为用户网站托管的主机是阿里云 ECS,网站多了磁盘空间一直没有跟上,今天增加磁盘容量,并设置了下扩展分区和文件系统。 **1、创建快照** 登录阿里云后台——云服务器 ECS,再进入实例列表,点击需要扩容的实例上的「管理」,再进入「本实例云盘」,点击「创建快照」 **2、磁盘扩容** 还是在「本实例云盘」中,点击「更多——磁盘扩容」根据要求选择输入,支付即可。 注:可选择在线扩容,操作过程不需要重启实例。 **3、扩展分区和文件系统\_Linux系统盘** 查看阿里云提供的: 文档1:[https://help.aliyun.com/document\_detail/111738.html](https://help.aliyun.com/document_detail/111738.html) 文档2:[https://help.aliyun.com/document\_detail/113316.html](https://help.aliyun.com/document_detail/113316.html?spm=a2c4g.11186623.4.1.5af4fdc9krtzlH) 文档2更详细,且有视频教程,仔细查看文档,很简单的。 --- # MAMP PHP环境安装 pcntl 扩展学习 Workerman即时通讯框架 **URL:** https://salongweb.com/mamp-php-pcntl-workerman.html Workerman是一款开源高性能异步PHP socket框架,在学习的过程中首先得PHP 环境的支持,在 macOS 下的 MAMP Pro 默认的 PHP 环境中并没有安装 pcntl 模块,需要安装该模块才能启动 Workerman。 ### 一、什么是Workerman Workerman是一款开源高性能异步PHP socket框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、MQTT物联网客户端、异步消息队列等众多高性能组件。 ### 二、切换 PHP 版本为 MAMP 指定的 macOS 系统自带PHP环境,后为开发方便,安装了 MAMP Pro 软件,在终端运行`php -v`,可查看到 macOS 自带的 PHP 版本,切换 PHP 版本为 MAMP 指定的版本步骤如下: **1、终端输入代码来编辑 .bash\_profile 文件,该文件可以不存在,就创建新文件** ``` sudo vim ~/.bash_profile ``` **2、把环境变量代码添加到 .bash\_profile 文件里** ``` export PATH="/Applications/MAMP/bin/php/php7.4.2/bin:$PATH" ``` 注:注意 PHP 版本的路径和版本号 **3、执行文件,使起生效** ``` source .bash_profile ``` **4、检查是否生效(检验一)** ``` php -v ``` **5、环境变量指向地址(检验二)** ``` which PHP ``` ### 三、安装 pcntl 模块 **1、使用`php -v`命令查看当前的PHP CLI的版本** ``` ~# php -v ``` **2、根据版本下载PHP源代码** PHP历史版本下载页面:,比如 PHP 版本为 7.4.2,则下载 php7.4.2.tar.gz。 **3、解压源码压缩包** 可使用命令: ``` ~# tar -zxvf php7.4.2.tar.gz ``` 也可以直接在目录下解压,替换 **4、进入源码中的ext/pcntl目录** ``` ~# cd /Applications/MAMP/bin/php/php7.4.2/ext/pcntl ``` **5、运行 phpize 命令** ``` ~# phpize // 显示内容: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 ``` **6、运行 configure命令** ``` ~# ./configure // 显示内容: checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E ... ``` 如果下一步出现错误: ``` 'php.h' file not found ``` 需执行: ``` ~# ./configure --with-php-config=/Applications/MAMP/bin/php/php7.4.2/bin/php-config --prefix=/Applications/MAMP/bin/php/php7.4.2/bin/php ``` **7、运行 make 命令** ``` ~# make // 显示内容: /bin/bash /tmp/ph7.4.2/ext/pcntl/libtool --mode=compile cc ... -I/usr/include/php7 -I/usr/include/php7/main -I/usr/include/php5/TSRM -I/usr/include/php7/Zend... ... ``` **8、运 行make install 命令** ``` ~# make install // 显示内容: Installing shared extensions: /usr/lib/php7/20090626/ ``` **9、配置`php.ini`文件** 通过运行 php –ini查找php.ini文件位置:`/Applications/MAMP/bin/php/php7.4.2/conf/php.ini`,不是 MAMP 面板上打开的 php.ini,然后在文件中添加`extension=pcntl.so` ``` extension=pcntl.so ``` 说明: 此方法一般用来安装PHP自带的扩展,例如posix扩展和pcntl扩展。除了用phpize编译某个扩展,也可以重新编译整个PHP,在编译时用参数添加扩展,例如在源码根目录运行 ``` ~# ./configure --enable-pcntl --enable-posix ... ~# make && make install ``` ### 四、启动 Workerman 环境准备好,进入 Workerman 根目录,在终端执行: ``` php start.php start ``` 就可以启动 Workerman --- # WordPress 主题感染恶意代码function _check_active_widgets **URL:** https://salongweb.com/wordpress-function-malicious-code.html 萨龙龙开发主题这么久,第一次感染恶意代码,整个 WordPress 下的主题 functions.php 都被插入了一大段函数代码,百度一下也发现有其他朋友遇到类似的情况,万幸的是在本地使用,把所有被添加的代码删除,暂时没有发现什么异样。 感染恶意代码的原因是用户要求修改下主题,而这个主题不是本人开发的,也没有想到会有恶意代码,该主题是用户从 xxxx 购买,主题是否是他本人开发的不得而知,如果是本人开发不可能不知道这是恶意代码。 **一般插入恶意代码是为了插入恶意广告,但是也有直接获取admin权限,修改你的博客主题,甚至获取你的账号信息。如发现以后没有采取措施,留下的隐患是可大可小的。** **恶意代码都是添加在 functions.php 文件的最后面,函数名为:** `_check_active_widget` `_get_all_widgetcont` `stripos` `strripos` `scandir` `_prepared_widget` `__popular_posts` ### 处理方法: 1、备份你的主题; 2、将你**所有主题**的function.php中的被插入的那些函数代码删除。 ### 检查主题是否已清除该“代码病毒” 1、在你本地搭建php环境(如已有,跳过); 2、重新在**wordpress官方网站**下载最新版的wordpress安装程序,然后重新安装一个全新的wordpress;一定是要重新安装过全新的wordpress! 3、将你已**清除干净的wordpress主题**放到主题wp-content\\themes文件夹下,启用该主题;然后进行一下发布文章、浏览页面等基本操作; 4、检查该主题的function.php文件是否被感染; 5、切换回默认主题,进行一下发布文章、浏览页面等基本操作;然后检查默认主题的function.php文件是否被感染; 如均无被感染,一般来说,该恶意代码已经被清除了。 ### 提醒 1、如发现你的主题有感染恶意代码,最好检查你所有的主题,包括已经安装的、已经备份的以及在你电脑本地所以有可能被感染的主题!以免下一次将已感染的主题上传安装而再次中毒。 2、在网上下载的主题或者是购买的主题,安装前最好都能先检查一下主题的function.php是否安全。 部分内容来源:http://blog.aizhet.com/wordpress/1237.html --- # WooCommerce 3 更新后特色产品的获取方法 **URL:** https://salongweb.com/woocommerce-3-feature-product.html WooCommerce 已经是 WordPress 平台最好最强大的在线商城插件,已经被 WordPress 收购,更新速度比较频繁,功能更加完善。 在频繁的更新后,一些常用的函数都在优化,一些字段也有所改变。Taji 主题在首页有一个模块『编辑推荐』,获取的是特色产品,在之前我们是可以通过以下代码就可以获取特色产品: 1. $args = array( 2. ‘post\_type’ => ‘product’, 3. ‘posts\_per\_page’ => 5, 4. ‘meta\_key’ => ‘\_featured’, 5. ‘meta\_value’ => ‘yes’ 6. ); 在 WooCommerce 3之后(具体哪个版本不确定),以上代码是获取不了特色产品,百度、谷歌都搜遍了也没有解决,WooCommerce 插件有提供一些简码,其中就有特色产品,所以查看了下简码才得到决定。 所以可以通过以下代码来获取 WooCommerce 的特色产品: 1. $args = array( 2. ‘post\_type’ => ‘product’, 3. ‘posts\_per\_page’ => 5, 4. ‘tax\_query’ => array( 5. array( 6. ‘taxonomy’ => ‘product\_visibility’, 7. ‘terms’ => ‘featured’, 8. ‘field’ => ‘name’, 9. ‘operator’ => ‘IN’, 10. ‘include\_children’ => false 11. ) 12. ) 13. ); 以上只是解决方案,获取文件是使用`WP_Query`函数。 --- # jQuery 显示与隐藏更多内容插件 readmore.js **URL:** https://salongweb.com/readmore-js.html ![jQuery 显示与隐藏更多内容插件 readmore.js](https://pic.salongweb.com/2017/12/readmore.jpg) 开发一个 WordPress 文章筛选功能时,因为选项较多,默认只显示一行,可通过更多与关闭按钮来切换内容,使用到强大实用且轻巧的 jQuery readmore.js插件,可显示与隐藏更多内容,自动添加“更多”和“关闭”链接,这些都是可以自定义。 readmore.js使用非常简单,无需复杂的格式或编码的类名,只需调用.readmore()包含文本块的元素和readmore.js即可完成剩下的工作。 注意:Readmore.js与jquery版本大于1.7.0,浏览器版本尽量使用更高的,低版本的也支持,但是体验效果不好。 ## 一、使用方法 1、添加到网站中 1. <script src=“../js/readmore.min.js”></script> 2、使用 1. $(‘article’).readmore(); 就是这么简单。你可以改变动画的速度,崩溃块的高度,以及打开和关闭的元素。 1. $(‘article’).readmore({ 2. speed: 75, 3. lessLink: ‘<a href=“#”>Read less</a>’ 4. }); ## 二、选项 速度:100(单位为毫秒) maxHeight:200 (像素) heightMargin:16(以像素为单位,以避免倒塌是比仅稍大块了maxHeight) moreLink:'<a HREF=”#”>阅读更多</ a>’ lessLink:'<a HREF=”#”>关闭</ a>的“ embedCSS:true(需插入CSS的动态,将其设置为假,如果你有一个样式表需要的CSS) sectionCSS:’display: block; width: 100%;’(设置块的造型,忽略,如果embedCSS是假的) startOpen:false(不要立即截断,开始在全开位置) expandedClass:’readmore-js-expanded’(类添加扩展模块) collapsedClass:’readmore-js-collapsed“(类加入到折叠块) beforeToggle:function(){} (称为或多或少链接被点击后,但之前的块被折叠或展开。) afterToggle:function(){} (称为后,该块被折叠或展开) 如果该元素具有最大高度 CSS属性,Readmore.js将使用该值,而不是maxHeight选项。 更多内容及英文原文请点击: --- # WordPress 最简便的边栏调用方法与提示 **URL:** https://salongweb.com/wordpress-sidebar.html WordPress 主题文章类型较多,想实现不同的文章类型页面调用不同的边栏,一般的方法是将代码写在主题根目录下的 sidebar.php 文件中,通过对页面的判断来调用不同的代码,这样会产生更多的代码,并且页面种类繁多判断也很麻烦,所以今天萨龙龙来介绍一种相对简便的方法。 ## 添加边栏 一般添加边栏的代码为以下代码,添加多个边栏可复制下数组,将以下代码添加到主题函数 functions.php 文件中即可。 1. function truethemes\_widgets\_init() { 2. register\_sidebar( 3. array( 4. ‘name’ => \_\_(‘首页’,’salong’), 5. ‘id’ => ‘sidebar-1’, 6. ‘description’ => \_\_(‘这个边栏显示在最新文章边栏’,’salong’), 7. ‘before\_widget’ => ‘<section id=“%1$s” class=“sidebar\_widget %2$s”>’, 8. ‘after\_widget’ => ‘</section>’, 9. ‘before\_title’ => ‘<div class=“sidebar\_title”><h3>’, 10. ‘after\_title’ => ‘</h3></div>’, 11. ) 12. ); 13. } 14. add\_action( ‘widgets\_init’, ‘truethemes\_widgets\_init’ ); ## 获取边栏的简便代码 1. function salong\_sidebar($id){ 2. global $wp\_registered\_sidebars,$salong; 3. $index = “sidebar-“.$id; //获取边栏 ID 4. $sidebar\_name = $wp\_registered\_sidebars\[$index\]\[‘name’\];//获取边栏名称 5. echo ‘<aside class=“sidebar”>’; 6. //判断边栏中是否有小工具,有就输入边栏,没有就输入提示添加小工具。 7. if ( is\_active\_sidebar($index) ) { 8. if(is\_single() && $salong\[ ‘switch\_author’\]) { get\_template\_part( ‘includes/widgets/widget’, ‘author’); } 9. dynamic\_sidebar($sidebar\_name); 10. echo ‘<article id=“move” class=“move”>’; 11. dynamic\_sidebar(\_\_( ‘移动’, ‘salong’)); 12. echo ‘</article>’; 13. }else{ 14. echo ‘<article class=“sidebar\_widget widget\_salong\_init”>’; 15. echo ‘<div class=“sidebar\_title”>’; 16. echo ‘<h3>’; 17. echo \_\_(‘温馨提示’,’salong’); 18. echo ‘</h3>’; 19. echo ‘</div>’; 20. echo ‘<div class=“init”><a href=“‘.get\_home\_url().’/wp-admin/widgets.php”>’; 21. echo sprintf(\_\_(‘请到后台外观——小工具中添加小工具到<b>%s</b>边栏中。’,’salong’),$sidebar\_name); 22. echo ‘</a></div>’; 23. echo ‘</article>’; 24. } 25. echo ‘</aside>’; 26. } 以上代码同样添加到主题函数 functions.php 文件中,添加边栏时也为边栏添加了一个『sidebar-1』这样的 ID,我们可以通过 ID 来获取边栏的名称,以及判断当前边栏是否有添加小工具,从而来提示用户添加小工具到边栏中。 ## 调用边栏 1. <?php salong\_sidebar(1); ?> 其中的『1』为 ID『sidebar-1』数值,想调用哪个边栏修改其中的数值就 OK,是不是更加简便,都不用对页面进行判断。 --- # 禁用 WordPress 裁剪功能包括自动生成的 768 像素图片 **URL:** https://salongweb.com/wordpress-unset-thumbnail.html WordPress 媒体库是很强大、管理媒体相当方便,如果媒体多就给数据库增加了压力,而且很多媒体是不需要上传到媒体库,上传的图片会增加很多无用被裁剪后的图片,本文就将介绍如何彻底禁用这个裁剪的功能。 ### 一、对于单个站点 登录网站后台,再输入如下地址: http://域名/wp-admin/options.php 就将进入了WordPress的全部设置页面,这个是WordPress默认隐藏的功能。 然后在浏览器中通过Ctrl+F搜索medium\_large\_size\_w,找到如下位置将768修改为0保存设置即可: ![禁用 WordPress 裁剪功能包括自动生成的 768 像素图片](https://pic.salongweb.com/2018/01/wordpress-thumb_001.jpg) ### 二、对于多站点 多站点的管理网络中的个人站点设置中 WordPress 已经提供了所有的设置选项,鼠标依次放在『我的站点——管理网络——站点』,进入站点列表中,点击需要修改缩略图参数的站点上的『编辑』,如下图: ![禁用 WordPress 裁剪功能包括自动生成的 768 像素图片](https://pic.salongweb.com/2018/01/wordpress-thumb_002.jpg) 进入到编辑站点页面,再点击『设置』进入此站点的设置选项中 ![禁用 WordPress 裁剪功能包括自动生成的 768 像素图片](https://pic.salongweb.com/2018/01/wordpress-thumb_003.jpg) 然后在浏览器中通过Ctrl+F搜索Medium Large Size W(注意和单个站点的选项名称不一样),找到如下位置将768修改为0保存设置即可 ![禁用 WordPress 裁剪功能包括自动生成的 768 像素图片](https://pic.salongweb.com/2018/01/wordpress-thumb_004.jpg) 以上两种设置说麻烦也不麻烦,萨龙网络开发了一些 WordPress 主题,对于很多用户来说,这样设置就是麻烦,所以我们就直接禁用 WP的裁剪功能。 三、彻底禁用 WP 裁剪 直接上代码: 1. //禁用 WordPress 4.4+ 的响应式图片功能及缩略图裁剪的所有功能 2. function salong\_disable\_wp\_tailoring( $sizes ){ 3. unset( $sizes\[ ‘thumbnail’ \]);//缩略图大小 4. unset( $sizes\[ ‘medium’ \]);//中等大小 5. unset( $sizes\[ ‘medium\_large’ \] );//这张就是自动生成的768图片选项 6. unset( $sizes\[ ‘large’ \]);//大尺寸 7. unset( $sizes\[ ‘full’ \] );//全尺寸 8. return $sizes; 9. } 10. add\_filter( ‘intermediate\_image\_sizes\_advanced’, ‘salong\_disable\_wp\_tailoring’ ); 将以上代码添加到主题 functions.php 文件就可以,需要裁剪什么尺寸的缩略图就注释相应的代码。 --- # 通过 WordPress 多语言插件 WPML 的语言配置文件 wpml-config.xml 来支持 Polylang 翻译主题选项字段 **URL:** https://salongweb.com/wordpress-polylang-theme-options.html 网上已经有很多介绍 WordPress 多语言的插件了,比如 Polylang 和 WPML 等强大的多语言插件,但是只是介绍,很快都是能掌握怎么使用。今天我们要说的是如何使用 Polylang 插件来实现主题选项中字段的翻译。 WordPress多语言插件WPML在Polylang之前就已经创建了,因此对于一些插件和主题集成很好。WPML语言配置文件 wpml-config.xml已经可以翻译主题选项中的字段,Polylang 也支持 wpml-config.xml 文件的配置,而且 Polylang 的工作效率几本可以完成很多主题或者插件的翻译工作,所以我们创建一个 wpml-config.xml,添加以下代码到文件中: 1. <wpml-config> 2. <custom-fields> 3. <custom-field action=“copy”>quantity</custom-field> 4. <custom-field action=“translate”>custom-title</custom-field> 5. </custom-fields> 6. <custom-types> 7. <custom-type translate=“1”>book</custom-type> 8. <custom-type translate=“1”>DVD</custom-type> 9. </custom-types> 10. <taxonomies> 11. <taxonomy translate=“1”>genre</taxonomy> 12. </taxonomies> 13. <admin-texts> 14. <!–my\_themes\_options 为主题选项的全局变量名–> 15. <key name=“my\_themes\_options”> 16. <!–其中其它名称则是选项的 ID–> 17. <key name=“option\_name\_1” /> 18. <key name=“option\_name\_2” /> 19. <key name=“options\_group\_1”> 20. <key name=“sub\_option\_name\_11” /> 21. <key name=“sub\_option\_name\_12” /> 22. </key> 23. </key> 24. <key name=“simple\_string\_option” /> 25. </admin-texts> 26. </wpml-config> 并且配置支持父级关系选项,比如萨龙网络的主题幻灯片,一个幻灯片选项中有多个子幻灯片,这时就可以使用嵌套来翻译字段。 将wpml-config.xml文件放在主题或者 Polylang 插件的根目录,再前台插件后台『语言——字符串翻译』中进行翻译即可,如下图: ![通过 WordPress 多语言插件 WPML 的语言配置文件 wpml-config.xml 来支持 Polylang 翻译主题选项字段](https://pic.salongweb.com/2018/01/polylang-theme-options.jpg) --- # 移除 WooCommerce 商城插件中我的帐户相关页面 **URL:** https://salongweb.com/woocommerce-remove-my-account-page.html WooCommerce 插件默认为我的帐户页面提供了:仪表盘、订单、下载、地址、帐户详情几个页面,以及一个退出登录的按钮,如果出售的是实物或者没有下载项时,下载则没有用途,或者是虚拟产品时,地址也没有用途,所以我们可以使用代码隐藏这些不需要的页面。 1. //移除我的账户相关页面 2. 3. add\_filter ( ‘woocommerce\_account\_menu\_items’, ‘salong\_remove\_my\_account\_links’ ); 4. function salong\_remove\_my\_account\_links( $menu\_links ){ 5. unset( $menu\_links\[‘edit-address’\] ); // 地址 6. //unset( $menu\_links\[‘dashboard’\] ); // 仪表盘 7. //unset( $menu\_links\[‘payment-methods’\] ); // 支付方式 8. //unset( $menu\_links\[‘orders’\] ); // 订单 9. //unset( $menu\_links\[‘downloads’\] ); // 下载 10. //unset( $menu\_links\[‘edit-account’\] ); // 帐户详情 11. //unset( $menu\_links\[‘customer-logout’\] ); // 登出 12. 13. return $menu\_links; 14. 15. } 将以上代码添加到主题 functions.php 文件中即可,需要显示的页面将其注释就可以。 --- # WordPress 插入页面函数 wp_insert_post **URL:** https://salongweb.com/wordpress-wp-insert-post.html 萨龙网络已经开发了很多 WordPress 主题,LensNews 主题要创建的页面较多,所以导致很多用户来咨询如何设置用户中心,在最新上线的 MNews 主题中就使用了 wp\_insert\_post 函数来自动创建主题要使用到的页面,这样大大减少了主题配置工作,也给萨龙龙节约了不少时间。 函数描述 该函数可在数据库中插入文章及页面。如果`$postarr`参数有“ID”设置为一个值,那么文章将被更新。您可以通过设置“post\_date”和“post\_date\_gmt”值来手动设置发布日期也可以通过设置“comment\_status”值来关闭评论或打开注释。 使用方法 1. <?php wp\_insert\_post( $postarr, $wp\_error ); ?> 参数 $postarr 一个更新或插入文章的数组元素。 1. $postarr = array( 2. ‘ID’ => ‘0’, // (int)默认值为0,如果是0以外的值,则该 ID 的文章将被更新。 3. ‘post\_author’ => get\_current\_user\_id(), // (int)文章作者的ID,默认为当前登录的用户ID 4. ‘post\_date’ => ”, // 文章发布时间,默认为当前时间。 5. ‘post\_date\_gmt’ => ”, // (字符串)GMT格式的文章发布时间。默认值是$post\_date的值。 6. ‘post\_content’ => ”, // (字符串)文章内容,默认为空。 7. ‘post\_content\_filtered’ => ”, // (字符串)过滤后的内容,默认是空的。不要管这个,WordPress会自动处理。 8. ‘post\_title’ => ”, // (字符串)文章标题,默认为空. 9. ‘post\_excerpt’ => ”, // (字符串)文章摘要,默认为空。 10. ‘post\_status’ => ”, // (字符串)文章状态,默认为『draft』,即草稿。 11. ‘post\_type’ => ”, // (字符串)文章类型,默认为『post』. 12. ‘comment\_status’ => ”, // (字符串)是否可以接受评论。接受『打开』或『关闭』。默认值是『default\_comment\_status』选项的值。 13. ‘ping\_status’ => ”, // (字符串)是否可以接受ping命令。接受『打开』或『关闭』。默认值是『default\_ping\_status』选项的值。 14. ‘post\_password’ => ”, // (字符串)访问该文章的密码,默认是空的。 15. ‘post\_name’ => ”, // (字符串)文章的别名,当发布新的文章时会默认创建。 16. ‘to\_ping’ => ”, // (字符串)空格或回车将url的列表分隔成ping,默认是空的。 17. ‘pinged’ => ”, // (字符串)空格或回车分隔的url列表,默认是空的。 18. ‘post\_modified’ => ”, // (字符串)上次修改后的日期,默认是当前时间。 19. ‘post\_modified\_gmt’ => ”, // (字符串)最后在GMT时区修改后的日期,默认是当前时间。 20. ‘post\_parent’ => ”, // (int)文章的父级文章ID,默认为 0。 21. ‘menu\_order’ => ”, // (int)如果新文章为一个页面,可以设置一个页面序号,默认为 0。 22. ‘post\_mime\_type’ => ”, // (字符串)文章的mime类型,默认是空的。 23. ‘guid’ => ”, // (字符串)全局唯一ID,用于引用post,默认是空的。 24. ‘post\_category’ => ”, // (数组)文章分类目录,默认值为『default\_category』选项的值。 25. ‘tags\_input’ => ”, // (数组)文章标签,默认为空。 26. ‘tax\_input’ => ”, // (数组)文章的自定义分类法项目,默认为空。 27. ‘meta\_input’ => ”, // (数组)自定义字段,默认为空。 28. ‘page\_template’ => ”, // 页面模板文件的名称,如,template.php,默认为空。 29. ); $wp\_error (可选)是否返回失败的WP\_Error。 默认值:false `wp_insert_post`函数的基本使用: 1. // 文章投稿 2. $my\_post = array( 3. ‘post\_title’ => wp\_strip\_all\_tags( $\_POST\[‘post\_title’\] ), 4. ‘post\_content’ => $\_POST\[‘post\_content’\], 5. ‘post\_status’ => ‘publish’, 6. ‘post\_author’ => 1, 7. ‘post\_category’ => array( 8,39 ) 8. ); 9. 10. // 插入文章到数据库 11. wp\_insert\_post( $my\_post ); 函数一般用在启用主题时创建一些默认页面,以及投稿中。 --- # 移除 WooCommerce 商城插件编辑产品中的产品数据相关 tabs **URL:** https://salongweb.com/woocommerce-remove-product-tabs.html WooCommerce 插件默认为编辑产品页面提供了产品数据 TABS,默认包括:常规、库存、配送、联锁产品、属性、高级等模块,功能强大而实用。对于很多定制的站点,有一些 TABS 是完全用不到,所以我们通过代码来隐藏这些模块。 1. /\*移除编辑产品页面中的 TABS \*/ 2. function salong\_remove\_products\_tabs($tabs){ 3. unset($tabs\[‘general’\]);//常规 4. unset($tabs\[‘inventory’\]);//库存 5. unset($tabs\[‘shipping’\]);//配送 6. unset($tabs\[‘linked\_product’\]);//联锁产品 7. unset($tabs\[‘attribute’\]);//属性 8. unset($tabs\[‘advanced’\]);//高级 9. return($tabs); 10. } 11. add\_filter(‘woocommerce\_product\_data\_tabs’, ‘salong\_remove\_products\_tabs’, 10, 1); 将以上代码添加到主题 functions.php 文件中,默认是隐藏所有 tabs,要显示 tabs 就注释相关代码即可。 --- # jQuery 强大丰富的响应式弹出框插件 fancyBox3 **URL:** https://salongweb.com/fancybox3.html fancyBox3 是一款优秀的弹出框Jquery插件,之前使用过很多 LightBOX 弹窗插件,功能都很强大,fancyBox3 相对来说,不论是设计和功能上都更胜一筹,所以萨龙网络所有主题需要弹出框的都有添加 fancyBox3 插件。 ### 依赖 jQuery 3+ 是首选,但 fancyBox3 同样适用于jQuery 1.9.1+ 和 jQuery 2+。 ### 兼容性 fancyBox3 包含对触摸手势的支持,甚至支持缩放手势,非常适合移动和桌面浏览器。 fancyBox3 已经在以下浏览器/设备上测试过: - Chrome - Firefox - IE10/11 - Edge - iOS Safari - Nexus 7 Chrome ### 设置 可以通过链接`.css`和`.js`文件安装 fancyBox3 到html文件中,确保加载了 jQuery 库。以下是一个基本的HTML模板用作示例: 1. <!DOCTYPE html> 2. <html> 3. <head> 4. <meta charset=“utf-8”> 5. <title>My page</title> 6. 7. <!– CSS –> 8. <link rel=“stylesheet” type=“text/css” href=“jquery.fancybox.min.css”> 9. </head> 10. <body> 11. 12. <!– Your HTML content goes here –> 13. 14. <!– JS –> 15. <script src=“//code.jquery.com/jquery-3.2.1.min.js”></script> 16. <script src=“jquery.fancybox.min.js”></script> 17. </body> 18. </html> ### 下载 fancyBox3 在 [GitHub](https://github.com/fancyapps/fancybox) 上下载最新的 fancyBox3。 或者直接链接到cdnjs上的fancybox文件 – ### 包安装 fancyBox3 也可在npm和Bower上使用。 1. \# NPM 2. npm install @fancyapps/fancybox –save 3. 4. \# Bower 5. bower install fancybox –save ### 注意 - 确保在 fancyBox3 JS文件之前添加了jQuery库 - 如果您的页面上已经有jQuery,则不应再次加载 - 不要同时包含 fancybox.js 和 fancybox.min.js 文件 - 当在浏览器上直接打开本地文件时,某些功能(ajax,iframe等)不起作用,代码必须在Web服务器上运行 ### 如何使用 **用数据属性初始化** 使用fancyBox3 最基本的方法是通过添加 `data-fancybox`属性到元素中。这会自动绑定并启动fancyBox3 的点击事件。使用`href`或 `data-src`属性来指定内容的来源。例: 1. <a href=“image.jpg” data-fancybox data-caption=“Caption for single image”> 2. <img src=“thumbnail.jpg” alt=“” /> 3. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/ZxREZK?editors=1000) 如果有一组项目,则可使用`data-fancybox`为每个项目使用相同的属性值来创建一个画廊,每个组都应该有一个独特的价值。例: 1. <a href=“image\_1.jpg” data-fancybox=“gallery” data-caption=“Caption #1”> 2. <img src=“thumbnail\_1.jpg” alt=“” /> 3. </a> 4. 5. <a href=“image\_2.jpg” data-fancybox=“gallery” data-caption=“Caption #2”> 6. <img src=“thumbnail\_2.jpg” alt=“” /> 7. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/aYKzoY?editors=1000) 如果选择此方法,将应用默认设置。有关如何通过更改默认值或使用属性来定制示例的信息,请参阅 [选项](https://fancyapps.com/fancybox/3/document/#options)一节 `data-options` 有时有多个链接指向相同的来源,并在画廊中创建重复。为了避免这种情况,只需使用 `data-trigger`属性中用于`data-fancybox`其他链接的相同值的属性即可。可选地,使用 `data-index`attribute来指定起始元素的索引: 1. <a data-trigger=“gallery” href=“javascript:;”> 2. <img src=“thumbnail\_1.jpg” alt=“” /> 3. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/oqPKYp?editors=1000) ### 使用JavaScript进行初始化 用jQuery选择器选择你的元素(你可以使用任何有效的选择器)并调用该 `fancybox`方法: 1. $(‘\[data-fancybox=“gallery”\]’).fancybox({ 2. // Options will go here 3. }); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/dmKPYa?editors=1010) 有时可能需要将fancybox绑定到动态添加的元素。使用 `selector`选项为现在或将来存在的元素附加点击事件侦听器。例: 1. $().fancybox({ 2. selector : ‘\[data-fancybox=“gallery”\]’, 3. loop : true 4. }); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/LdrENX?editors=1010) 请记住,所选项目不会自动分组到图库中。您可以通过对`data-fancybox`属性使用相同的值来创建一个或多个组 ,类似于上一节中的示例。 ### 使用Javascript 您也可以编程方式打开并关闭fancybox。以下是一些示例,请访问 [API](https://fancyapps.com/fancybox/3/document/#api)部分获取更多信息和演示。 显示简单信息: 1. $.fancybox.open(‘<div class=“message”><h2>Hello!</h2><p>You are awesome!</p></div>’); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/xWzOxR?editors=1010) 显示iframed页面: 1. $s.fancybox.open({ 2. src : ‘link-to-your-page.html’, 3. type : ‘iframe’, 4. opts : { 5. afterShow : function( instance, current ) { 6. console.info( ‘done!’ ); 7. } 8. } 9. }); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/xWzOxR?editors=1010) fancybox尝试根据给定的URL自动检测内容的类型。如果无法检测到,则也可以使用`data-type`属性(或 `type`选项)手动设置类型 。例: 1. <a href=“images.php?id=123” data-type=“image” data-caption=“Caption”> 2. 显示图片 3. </a> ## 媒体类型 ### 图片 使用fancybox的标准方式是使用链接到较大图像的许多缩略图: 1. <a href=“image.jpg” data-fancybox=“images” data-caption=“My caption”> 2. <img src=“thumbnail.jpg” alt=“” /> 3. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/VyLOJX?editors=1000) 默认情况下,fancybox会在显示图像之前完全预先载入图像。您可以选择立即显示图像。它将在接收数据时呈现并显示全尺寸图像。要做到这一点,一些属性是必要的: - `data-width` – 图像的真实宽度 - `data-height` – 图像的真实高度 1. <a href=“image.jpg” data-fancybox=“images” data-width=“2048” data-height=“1365”> 2. <img src=“thumbnail.jpg” /> 3. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/aYKMBm?editors=1000) 您还可以使用这些 `width`和 `height`属性来控制图像的大小。这可以用来使图像在视网膜显示器上更清晰。例: 1. $(‘\[data-fancybox=“images”\]’).fancybox({ 2. afterLoad : function(instance, current) { 3. var pixelRatio = window.devicePixelRatio || 1; 4. 5. if ( pixelRatio > 1.5 ) { 6. current.width = current.width / pixelRatio; 7. current.height = current.height / pixelRatio; 8. } 9. } 10. }); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/pLKYez?editors=1010) fancybox支持“srcset”,因此它可以根据视口宽度显示不同的图像。您可以使用它来改善移动用户的下载时间,并随着时间的推移节省带宽。例: 1. <a href=“medium.jpg” data-fancybox=“images” data-srcset=“large.jpg 1600w, medium.jpg 1200w, small.jpg 640w”> 2. <img src=“thumbnail.jpg” /> 3. </a> [在CodePen上查看演示](https://codepen.io/fancyapps/pen/ZxRPyb?editors=1000) 右键单击也可以保护图像免于下载。虽然这不能保护真正确定的用户,但它应该阻止绝大多数人将您的文件撕掉。可选地,将水印放在图像上。 1. $(‘\[data-fancybox\]’).fancybox({ 2. protect: true 3. }); [在CodePen上查看演示](https://codepen.io/fancyapps/pen/wmXOqN) ### 视频 YouTube和Vimeo视频只需提供页面URL即可与fancyBox一起使用。直接链接到MP4视频或使用触发元素显示隐藏的`