首页
登录
搜索
搜索
blogger
UID:1
累计撰写
40
篇文章
累计收到
2
条评论
首页
登录
自定义幻灯片
演示文章
网
网站插件
查看更多
子比主题页脚优化 快速搭建精致动物背景墙效果
作者
06-08
2
11
0
子比主题专用靓号插件助力网站账号精细化管理
作者
06-08
0
8
0
🚀 时光帖子ID管理插件:自定义文章ID,掌控内容发布
作者
06-01
0
2
0
亲测可用 子比超级插件 V1.8.7 纯净无捆绑版本
作者
05-29
0
4
0
子比主题必备!超好用的账号切换插件
作者
05-29
0
14
0
子比Zibll主题专用工单系统插件V1.1.0版本
作者
05-29
0
4
0
WordPress 子比主题 文章页面自定义按钮插件分享
作者
05-29
0
2
0
告别重复登录:子比主题账号秒切插件
作者
05-20
0
2
0
高效管理 WordPress 文章分类:批量操作插件(饺子优化+美化)
作者
05-15
0
2
0
速看-子比主题视频播放器(插件版)
作者
05-15
0
2
0
子比在线打赏插件大升级!告别扫码转账,支持在线支付到账,全程免费
作者
05-15
0
2
0
Zibll 商品等级限制插件
作者
05-15
0
2
0
最新文章
2026-5-15
子比主题-网站文章同步公众号插件
插件的代码完全公开,并未采取任何加密措施。本插件有 苏晨 大佬开发 因此我诚挚地希望,插件的使用者不要擅自修改版权信息,并重新发布到各处。如果你在此基础上进行二次开发,请务必保留我的版权声明。 开发工作充满了艰辛,开源之路也并不容易,希望你能理解我的立场。如果你有经济能力,恳请支持一下我的产品,或者对我进行一些赞助。在此表示衷心的感谢。
2026年-5月-15日
0 阅读
0 评论
网站插件
2026-5-15
ZIBLL主题-彩虹外链API对接插件
灵活自定义API接口地址,满足个性化需求。 上传超时时间可自行设置,提高上传稳定性。 外链显示选项可自由配置,灵活控制资源访问。 支持设置下载密码,保障文件安全。 上传按钮在前台的显示与否,可按需选择。 授权模式 授权码验证形式(授权码免费获取)
2026年-5月-15日
1 阅读
0 评论
网站插件
2026-5-15
子比主题 – 评论抽奖功能_全开源免费
子比主题的评论抽奖功能现已推出,这款功能丰富多样,包含了评论抽奖、中奖通知以及多种奖品形式,如积分、余额、会员资格、邀请码和自定义奖品等。 使用者可设定自动开奖的人数或时间,并可开启活动幻灯片效果,还配备有侧边抽奖小工具,方便用户随时参与。如果您对这一功能感兴趣,可以按照以下步骤进行部署:请注意,本功能并非插件,而是开源主题的一部分,必须在子比主题的基础上运行。 首先,确保您已启动子比主题,然后再激活此功能。上传时,请将文件放置于主题目录或在后台通过主题上传功能进行安装。 期待您体验这一新颖的评论抽奖功能,具体部署教程和主题下载链接请参见官方网站。 主题下载
2026年-5月-15日
1 阅读
0 评论
网站插件
2026-5-15
Fastest Cache Pro WordPress插件 –1.7.2破解版
WP Fastest Cache这款插件在官方插件商店中始终名列前茅,是最知名的缓存插件之一。本博主亲自使用过相当一段时间,总体感受颇为良好。如果你也对其感兴趣,不妨自行部署体验一番。
2026年-5月-15日
1 阅读
0 评论
网站插件
2026-5-15
多会员体系插件-简单版
本插件来自 小崔先森 目前只完成了初步版本,如果有进一步的需求,请自行修改一下。 这个插件的功能相当简单,主要集中在单文章会员控制以及单板块会员控制两个方面。对于单文章会员控制,它能够确保只有会员用户才能访问特定的文章内容,有效保护了版权和会员权益。而单板块会员控制则允许管理员对不同的板块设置会员权限,从而实现对不同用户群体的内容分区管理,提升了平台的运营灵活性和用户体验。
2026年-5月-15日
1 阅读
0 评论
网站插件
2026-5-15
新功能– 账户注销插件(子比主题专用)
这是一个为子比主题(Zibll)开发的用户账户注销插件,让用户可以自主注销账户,来自大海资源库。 功能特点 在用户中心”我的服务”模块添加”账号注销”入口 三步注销流程:声明阅读 → 资产确认 → 最终确认 显示用户资产统计:文章、收藏、评论、粉丝、余额、积分、购物车、订单 订单状态检查:待支付、待发货、待收货、待评价、售后中的订单会阻止注销 安全验证:需输入确认文字 + 登录密码 注销处理:文章转移给站长、评论删除、用户数据清理 后台可配置:注销声明、确认文字、文章转移用户、注销日志 技术实现 使用子比主题的 zib_get_refresh_modal_link 生成弹窗按钮 使用 zib_get_modal_colorful_header 生成彩色头部 通过 zib_user_center_page_sidebar_button_1_args 过滤器添加入口 使用 CSF 框架实现后台配置(通过 zib_require_end 钩子加载) 使用子比主题的 notyf() 显示提示消息 插件在下方
2026年-5月-15日
0 阅读
0 评论
网站插件
2026-5-15
Zibll 商品等级限制插件
你是否渴望让站内的精品商品仅对高等级用户展现,以彰显其独特价值?是否希望用户等级体系成为推动用户活跃与参与的强大动力?「Zibll 商品等级限制」插件应运而生。这是一款专为子比(Zibll)主题精心研发的免费 WordPress 插件,它赋予你为商城中每一件商品灵活设置最低访问等级的权力。倘若用户等级不足,抱歉,他们将无法窥见这些珍贵商品的信息——如此简单、直接且高效的方式,将助你打造一个层次分明、激励满满的用户等级生态体系,让高等级用户感受到尊崇与专属,同时激发低等级用户不断提升自我的热情。 1. 逐商品精细化等级管控 在商品编辑页新增「等级限制」配置面板,仅需设置一个数字(0 = 无限制),即可精准锁定该商品的最低访问等级。 等级范围自动与子比主题同步,最大等级数完全跟随主题设置动态适配,无需额外维护。 2. 场景化智能拦截与引导 系统会根据访问者的身份,自动展示对应的友好提示: 未登录用户:锁定图标 + 登录引导,点击「立即登录」直接唤起子比原生登录弹窗,全程无跳转。 等级不足用户:盾牌图标 + 等级对比提示,清晰展示当前等级与所需等级的差距,引导用户提升等级。 管理员权限:不受任何等级门槛限制,始终拥有完整访问权限,高效管理内容。 所有提示页面均自动继承子比主题的头部、底部和面包屑导航,风格统一无割裂感。 3. 可视化文案自定义 在后台左侧「商品等级限制」菜单中,可对两种场景的提示文案进行可视化编辑: 支持 HTML 富文本,可插入图片、链接等元素 内置动态变量: {level_require} → 自动替换为商品所需等级(如「LV5」) {level_current} → 自动替换为用户当前等级(如「LV2」) 提供实时预览功能,编辑文案时即可看到最终效果,所见即所得。 4. 子比原生风格视觉体验 提示页面采用子比主题标志性的卡片式设计: 圆角阴影 + 居中布局 大号图标 + 清晰文字层级 响应式适配,手机端同样优雅 视觉风格与子比主题完全统一,毫无违和感 5. 专业缓存兼容 对受限商品页面,插件自动发送 DONOTCACHEPAGE 指令与 nocache_headers,确保主流缓存插件(WP Super Cache、WP Rocket、LiteSpeed Cache 等)跳过缓存,保障不同用户看到的内容准确无误。 6. 无残留干净卸载 卸载插件时,会自动清理所有后台设置,并逐一移除商品中的等级限制配置字段,不会影响子比主题商品的其他配置数据,做到用得安心、删得干净。 🛠️ 环境要求 表格 项目最低要求WordPress5.0 或更高PHP7.2 或更高子比主题v8.1 或更高商城功能已在主题设置中开启用户等级已在主题设置中开启 插件内置完善的环境检测机制,若依赖条件不满足,后台会显示明确的错误提示,不会对站点产生任何副作用。 🚀 安装与使用指南 安装插件将 zibll-restricted-products 文件夹上传至 /wp-content/plugins/ 目录,在 WordPress 后台「插件」页面激活。 设置商品等级限制编辑任意商品,在商品配置面板中找到「等级限制」选项卡,设置该商品的最低访问等级。 自定义提示文案进入后台「商品等级限制」菜单页,根据需求编辑未登录和等级不足场景的提示标题与描述文案。
2026年-5月-15日
2 阅读
0 评论
网站插件
2026-5-15
子比在线打赏插件大升级!告别扫码转账,支持在线支付到账,全程免费
前言 子比主题原生自带的打赏功能,核心仅为展示微信、支付宝两款收款二维码,用户完成扫码转账后,作者既无法实时核实是否到账,也无法精准追溯打赏金额,这类纯靠信任的打赏模式,不仅让用户的打赏体验大打折扣,也给站点的日常运营带来了诸多不便,存在显著的功能短板。 子比在线打赏插件(zibll-donation)的开发,正是为了针对性解决这一核心痛点。插件将原有静态的二维码扫码打赏,无缝升级为便捷的在线支付打赏模式,用户完成支付后,金额会自动划转至作者账户,整个打赏流程全程可追踪、可管理,彻底弥补了原生功能的不足。 核心特性 01 无缝替换,零感知升级 插件激活后自动接管子比主题原生打赏弹窗,用户点击文章底部「赞赏」按钮,不再展示收款二维码,而是加载全新在线支付界面,集成预设金额卡片、自定义金额输入、留言框、支付方式选择等功能,操作流程一气呵成。 全程复用子比主题原生模态框机制与支付通道,无需额外配置支付接口,升级过程对用户和站长均无感知。 02 灵活金额体系,适配多样打赏需求 自定义预设金额:后台可自由配置多档打赏金额(如 2/5/10/20/50/100 元),支持拖拽调整档位排序,贴合站点运营需求; 手动输入金额:用户可自定义打赏金额,插件内置数值校验,严格限制金额最小值与最大值,避免异常输入; 默认金额选中:可后台设定默认选中的金额档位,减少用户操作步骤,提升打赏转化率。 03 双收入模式,一键切换适配不同运营策略 插件提供两种打赏收入模式,后台一键切换实时生效,满足个人站点与多作者平台的差异化需求: 表格 收入模式核心说明适用场景余额模式(默认)打赏金额直接划入作者站内余额,可直接用于站内消费或申请提现个人站点、小型创作者社区创作分成模式打赏金额计入子比主题「创作收入」体系,按平台规则走提现审核流程多作者平台、需财务统一管控的站点 04 内置平台抽成机制,透明化分账管理 针对多作者运营站点设计专属抽成功能,兼顾平台运营与作者权益,全程公开透明: 抽成比例可自由设置,支持 1%~100% 灵活调节; 打赏弹窗内自动展示抽成提示,让打赏者清晰知晓金额分配规则; 作者收款通知中精准标注原始打赏金额、平台抽成金额、实际到账金额; 内置兜底保护机制,确保作者每笔打赏至少获得 0.01 元收益。 05 三重专属通知体系,交易进度实时知晓 每笔打赏支付成功后,插件将发送 3 条专属通知(替代主题通用订单通知),支持站内消息 + 邮件推送双渠道(遵循子比主题后台通知开关设置): 作者通知:含打赏金额、打赏者名称、来源文章、留言内容,及本次收入去向说明; 打赏者通知:确认打赏成功,附带订单号、付款明细、作者信息,留存交易凭证; 管理员通知:实时新打赏提醒,同步展示今日 / 本月打赏订单统计数据,方便平台运营。 06 作者主页专属打赏入口,拓宽打赏渠道 除文章页底部原生打赏按钮外,插件将在作者个人主页自动注入打赏按钮,访客无需阅读文章,可直接打赏喜欢的创作者,进一步提升作者收入。 按钮样式与子比主题原生设计完全一致,视觉风格高度融合,不破坏页面整体美观度。 07 现代化后台管理面板,一站式高效管控 插件搭载基于 Vue 3 + Element Plus 构建的现代化后台管理界面,操作简洁、功能全面,打赏管理更高效: 打赏设置中心:功能开关、金额配置、收入模式、抽成比例等所有功能,一站式集中管理,无需多页面切换; 完整打赏记录:支持按关键词搜索、按日期 / 状态筛选,展示打赏者、被赏作者、关联文章、打赏金额、留言、支付方式等全维度明细,流水可查可追溯。 08 全场景样式适配,兼顾体验与美观 插件样式深度适配子比主题使用场景,确保不同设备、不同显示模式下均有优质体验: 完美兼容主题深色模式,通过 .dark-theme 类自动响应模式切换,色彩搭配协调统一; 针对移动端做专属响应式布局优化,适配手机、平板等不同尺寸设备,操作流畅无卡顿。 安全设计 插件从多维度构建安全防护体系,全方位保障打赏交易安全与站点数据安全: 所有 AJAX 请求均验证 WordPress Nonce 令牌,有效防止 CSRF 跨站请求伪造攻击; 后台所有操作严格校验 manage_options 权限,杜绝未授权访问; 所有用户输入内容均经过 sanitize_text_field /sanitize_textarea_field 专业消毒处理,防止 XSS 跨站脚本攻击; 内置自我打赏拦截机制,在弹窗展示、订单提交等全环节,自动阻止用户打赏自己,避免恶意操作; 支付成功回调环节进行二次数据校验,确保订单金额、状态等信息一致性,防止数据篡改。 版本兼容 插件完美兼容子比主题主流版本,自动检测主题版本并匹配对应的订单数据处理方式,无需用户手动配置,即装即用: 子比主题 v8.5+:采用 initiate_order_data_type_{type} 过滤器 + order_meta 表存储打赏额外数据,适配主题新版数据结构; 子比主题 v8.1:采用 initiate_order_data 过滤器 + other 字段存储打赏额外数据,兼容主题旧版逻辑。 环境要求 插件运行环境要求贴合子比主题通用配置,无需额外升级服务器,低门槛部署: 表格 运行项目最低要求WordPress5.0+PHP7.2+子比主题全版本(需开启主题支付功能) 最后说明 子比在线打赏插件的核心开发理念是:不重新造轮子,只做精准增强。 插件全程复用子比主题原生的支付通道、模态框机制、消息系统和 UI 组件,不改变主题原有操作逻辑,仅针对「打赏」单一场景做深度优化,解决原生二维码打赏的无追踪、无管理痛点,让每一笔打赏都有据可查、有迹可循,实现打赏者、创作者、平台三方共赢。 如果你正在运营基于子比主题的多作者内容平台,或是希望让读者的打赏更便捷、更透明,真正触达创作者 —— 这款插件值得你一试。
2026年-5月-15日
2 阅读
0 评论
网站插件
2026-5-15
速看-子比主题视频播放器(插件版)
核心功能 – ✅ **视频点播**:通过文章/页面设置轻松添加视频 – ✅ **播放列表**:支持多个视频组成播放列表,自动播放下一集 – ✅ **多源切换**:支持多个视频源,用户可以自由切换 – ✅ **响应式设计**:自适应各种屏幕尺寸,支持移动端播放 – ✅ **键盘快捷键**:支持空格键播放/暂停,方向键快进/快退和音量控制 – ✅ **视频播放**:支持MP4格式的视频文件直接播放 – ✅ **可视化设置**:无需短代码,在文章编辑页直接设置 安装教程 1. 下载插件压缩包2. 登录WordPress后台,进入“插件”->“添加新插件”3. 点击“上传插件”,选择下载的压缩包4. 安装并激活插件 使用方法 1、基本视频播放 1. 新建或编辑文章/页面 2. 在右侧属性区域找到“子比视频播放器设置” 3. 勾选“启用视频播放器” 4. 选择“单个视频”类型 5. 输入视频URL和封面图片URL 6. 设置播放器宽度、高度等参数 7. 发布文章即可自动播放视频 2、视频播放列表 1. 新建或编辑文章/页面 2. 在右侧属性区域找到“子比视频播放器设置” 3. 勾选“启用视频播放器” 4. 选择“播放列表”类型 5. 输入视频ID列表(用逗号分隔) 6. 发布文章即可看到播放列表 3、多源视频播放列表 1. 新建或编辑文章/页面 2. 在右侧属性区域找到“子比视频播放器设置” 3. 勾选“启用视频播放器” 4. 选择“多源视频”类型 5. 输入JSON格式的视频源配置 6. 发布文章即可支持多源切换 设置参数 通用设置 – **启用视频播放器**:是否在当前文章/页面中启用视频播放器 – **视频类型**:单个视频、播放列表、多源视频 – **播放器宽度**:设置播放器宽度(支持百分比和像素) – **播放器高度**:设置播放器高度(支持像素值) – **自动播放**:是否自动播放视频 – **循环播放**:是否循环播放视频 – **静音播放**:是否静音播放视频 单个视频播放设置 -**视频URL**:视频文件的URL地址 – **封面图片URL**:视频封面图片的URL地址 视频播放列表 – **视频ID列表**:WordPress媒体库中的视频ID,用逗号分隔 多源播放视频 – **多源视频配置**:JSON格式的视频源配置 [{"src":"mp4视频链接","label":"1080P"},{"src":"mp4视频链接","label":"720P"}]
2026年-5月-15日
2 阅读
0 评论
网站插件
2026-5-15
高效管理 WordPress 文章分类:批量操作插件(饺子优化+美化)
效果图如下 高效管理 WordPress 文章分类:批量操作插件开发与优化实战在 WordPress 站点运营过程中,文章分类管理是内容维护的核心环节之一。尤其是当站点文章量较大时,逐个修改文章分类不仅效率低下,还容易出现操作失误。基于这一痛点,我们开发了一款「批量更改文章分类」插件,通过实战优化解决了功能实现、样式美化、性能调优等多个核心问题,让分类管理变得高效且便捷。一、插件核心功能设计:解决批量分类管理痛点这款插件的核心目标是实现文章分类的批量操作,覆盖日常运营中最常用的三类需求:批量更改文章分类、批量为文章添加分类、批量从文章中移除分类。为了让操作更贴合实际使用场景,我们在功能设计上做了多维度优化: 精准筛选,快速定位目标文章插件提供了多条件筛选功能,支持按「分类」「关键词」筛选文章,还可根据「发布日期」「修改日期」进行排序。运营者只需设置筛选条件,点击搜索按钮,即可快速定位需要调整分类的文章,避免在海量文章中逐个查找的麻烦。 可视化批量操作,降低操作门槛在插件界面中,左侧为「选择文章」区域,清晰展示文章标题、当前分类等信息,支持全选 / 单选文章;右侧为「选择分类」区域,除了显示分类名称、文章数量外,还新增了「分类 ID」列 —— 分类 ID 是 WordPress 中分类的唯一标识,显示该信息能帮助开发者或高级运营者精准定位分类,避免因分类名称重复导致的操作错误。 分页优化,提升大数据量处理体验考虑到站点可能存在大量文章,我们将分页按钮(上一页 / 下一页)从文章表格下方调整至「选择文章」标题右侧,既节省了页面空间,又让分页操作更贴近视觉焦点,大幅提升了大数据量下的操作流畅度。 二、界面美化升级,兼顾视觉与实用性为提升操作体验,我们对插件界面进行了精细化美化:顶部标题模块采用三色渐变背景(#2563eb → #4f46e5 → #7c3aed),搭配半透明圆形装饰和柔和阴影,视觉层次更丰富;按钮、表格等元素统一使用圆角和渐变样式,操作区域区分清晰,降低视觉疲劳;提示框、加载动画等交互元素的优化,让操作反馈更直观,避免用户因等待而重复操作。 细节打磨,适配不同使用场景权限校验:仅赋予「编辑文章」权限的用户访问插件,保障站点数据安全;容错处理:批量操作时校验文章和分类选择状态,若未选择则给出清晰提示,避免无效请求;设置灵活:支持自定义「每页显示文章数量」(1-100 可调),适配不同服务器性能和操作习惯。三、插件使用场景与价值这款插件适用于各类 WordPress 内容站点,尤其是资讯站、博客、文档站等文章量较大的场景:站点改版时,批量调整历史文章的分类体系;内容整理时,为同一主题的文章批量添加标签类分类;清理无效分类时,批量移除文章中的废弃分类。相比手动操作,插件将分类调整效率提升了数倍,同时避免了人工操作的疏漏,让内容运营者能将更多精力投入到内容创作而非重复劳动中。 代码如下 代码也是从网络搜集而来 我只是把功能优化了一下 美化了一下设置页面放到这个文件 /wp-content/plugins <?php /** * Plugin Name: 饺子批量更改文章分类工具 * Plugin URI: https://bk.yykbk.com/ * Version: 1.0.4 * Author: 开发者 * Author URI: https://bk.yykbk.com/ * Text Domain: batch-category-editor * License: GPL2 */ // ===================== 第一步:终极拦截 - 定义所有缺失的旧函数(空函数) ===================== // 直接定义所有被调用的旧函数,让WordPress调用时不会报错 function bcat_add_admin_page() {} function bcat_add_config_page() {} function bcat_register_settings() {} function bcat_script_action() {} // ===================== 第二步:立即清理所有旧钩子(最高优先级) ===================== function bce_final_cleanup() { global $wp_filter, $wpdb; // 1. 定义所有要清理的旧函数名 $old_functions = ; // 2. 遍历所有钩子,删除包含旧函数的回调 foreach ($wp_filter as $hook_name => $callbacks) { if (isset($wp_filter)) { foreach ($wp_filter as $priority => $callback_group) { foreach ($callback_group as $callback_id => $callback) { // 清理直接调用的函数 if (is_string($callback) && in_array($callback, $old_functions)) { unset($wp_filter); } // 清理数组形式的回调 elseif (is_array($callback) && isset($callback) && in_array($callback, $old_functions)) { unset($wp_filter); } } } } } // 3. 强制清理WordPress菜单缓存和所有临时数据 delete_transient('wp_menu_cache'); wp_cache_flush(); $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%_transient_%'"); // 4. 禁用PHP错误输出(彻底隐藏剩余警告) error_reporting(0); ini_set('display_errors', 0); ini_set('log_errors', 1); // 5. 启动输出缓冲,防止headers already sent错误 if (!ob_get_level()) { ob_start(); } } // 插件加载时立即执行(最早的时机) add_action('muplugins_loaded', 'bce_final_cleanup', -99999); add_action('plugins_loaded', 'bce_final_cleanup', -99999); add_action('init', 'bce_final_cleanup', -99999); // ===================== 第三步:核心功能实现(完全独立,无任何旧函数) ===================== // 1. 注册菜单 function bce_add_menu() { add_management_page( '批量更改文章分类', '批量更改文章分类', 'edit_posts', 'batch-category-editor', 'bce_render_page' ); } add_action('admin_menu', 'bce_add_menu', 999); // 2. 注册设置和AJAX function bce_register_hooks() { // 注册设置 register_setting( 'bce_options_group', 'bce_options', [ 'sanitize_callback' => 'bce_validate_settings', 'default' => ] ); // 注册AJAX处理 add_action('wp_ajax_bce_set_cat', 'bce_ajax_set_cat'); add_action('wp_ajax_bce_add_cat', 'bce_ajax_add_cat'); add_action('wp_ajax_bce_del_cat', 'bce_ajax_del_cat'); // 确保选项存在 if (!get_option('bce_options')) { add_option('bce_options', ); } } add_action('admin_init', 'bce_register_hooks'); // 3. 验证设置 function bce_validate_settings($input) { $valid = ; $valid = isset($input) && is_numeric($input) ? (intval($input) >= 1 && intval($input) <= 100 ? intval($input) : 15) : 15; return $valid; } // 4. 主页面渲染(功能完整+美化) function bce_render_page() { // 权限检查 if (!current_user_can('edit_posts')) { wp_die( '<div style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; padding:50px; background:#f8fafc;"> <div style="max-width:600px; margin:0 auto; background:white; padding:40px; border-radius:12px; box-shadow:0 4px 20px rgba(0,0,0,0.05);"> <h1 style="color:#dc2626; font-size:28px; margin-bottom:20px;">权限不足</h1> <p style="font-size:16px; line-height:1.8; color:#475569;">您需要具备编辑文章的权限才能访问此页面。</p> <p style="margin-top:30px;"> <a href="'.admin_url().'" style="padding:10px 25px; background:#3b82f6; color:white; text-decoration:none; border-radius:8px; font-weight:600;">返回后台首页</a> </p> </div> </div>', '权限不足', ); } // 获取参数 $current_cat = isset($_GET) ? intval($_GET) : -1; $current_keyword = isset($_GET) ? esc_attr($_GET) : ''; $current_sort = isset($_GET) ? $_GET : 'post_date'; $current_order = isset($_GET) ? $_GET : 'desc'; $options = get_option('bce_options', ); $per_page = intval($options) ?: 15; $paged = isset($_GET) ? max(1, intval($_GET)) : 1; // 构建文章查询 $args = [ 'post_type' => 'post', 'posts_per_page' => $per_page, 'paged' => $paged, 'post_status' => 'publish', 'orderby' => $current_sort, 'order' => $current_order ]; if (!empty($current_keyword)) $args = sanitize_text_field($current_keyword); if ($current_cat > 0) $args = $current_cat; $query = new WP_Query($args); $posts = $query->posts; // 获取分类列表 $categories = get_categories([ 'type' => 'post', 'hide_empty' => 0, 'orderby' => 'name', 'order' => 'ASC' ]); // 禁用自动添加的保存按钮 remove_action('admin_notices', 'settings_errors'); ?> <div class="wrap" style="max-width:1400px; margin:0 auto; padding:20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;"> <!-- 顶部标题 - 美化背景样式 --> <div style="background: linear-gradient(135deg, #2563eb 0%, #4f46e5 50%, #7c3aed 100%); color:white; padding:30px 40px; border-radius:16px; margin-bottom:30px; box-shadow:0 12px 30px rgba(37, 99, 235, 0.25); position:relative; overflow:hidden;"> <!-- 装饰元素 --> <div style="position:absolute; top:-50px; right:-50px; width:200px; height:200px; background:rgba(255,255,255,0.1); border-radius:50%;"></div> <div style="position:absolute; bottom:-30px; left:-30px; width:150px; height:150px; background:rgba(255,255,255,0.08); border-radius:50%;"></div> <div style="position:relative; z-index:1;"> <h1 style="font-size:36px; margin:0; font-weight:700; letter-spacing:0.8px; text-shadow:0 2px 10px rgba(0,0,0,0.1);">批量更改文章分类工具</h1> <p style="font-size:18px; margin:12px 0 0 0; opacity:0.95; line-height:1.6; text-shadow:0 1px 5px rgba(0,0,0,0.1);">高效管理您的文章分类,支持批量修改、添加、删除操作</p> </div> </div> <!-- 标签页 --> <div style="margin-bottom:25px; display:flex; gap:8px;"> <button class="bce-tab-btn active" data-tab="main" style="padding:12px 30px; background: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%); color:white; border:none; border-radius:8px; cursor:pointer; font-size:16px; font-weight:600; transition:all 0.3s ease; box-shadow:0 4px 12px rgba(59, 130, 246, 0.15);"> 批量操作 </button> <button class="bce-tab-btn" data-tab="settings" style="padding:12px 30px; background:#f8fafc; color:#1e40af; border:1px solid #dbeafe; border-radius:8px; cursor:pointer; font-size:16px; font-weight:600; transition:all 0.3s ease;"> 显示设置 </button> </div> <!-- 批量操作区 --> <div id="bce-tab-main" class="bce-tab-content" style="display:block; background: linear-gradient(180deg, #f0f7ff 0%, #f8fafc 100%); padding:25px; border-radius:12px; box-shadow:0 4px 20px rgba(0, 0, 0, 0.05); border:1px solid #e0e7ff;"> <!-- 搜索区域 --> <div style="background:white; padding:25px; border-radius:10px; box-shadow:0 2px 10px rgba(0, 0, 0, 0.03); margin-bottom:25px;"> <div style="display:flex; flex-wrap:wrap; gap:20px; align-items:center;"> <div> <label style="font-weight:600; color:#1e40af; margin-right:10px; font-size:15px;">选择分类:</label> <?php wp_dropdown_categories([ 'id' => 'bce-cat-filter', 'hide_empty' => 0, 'hierarchical' => 1, 'selected' => $current_cat, 'show_option_all' => '所有分类', 'style' => 'padding:10px 15px; border:2px solid #e0e7ff; border-radius:8px; font-size:14px; min-width:200px;' ]); ?> </div> <div> <label for="bce-keyword" style="font-weight:600; color:#1e40af; margin-right:10px; font-size:15px;">关键词:</label> <input type="text" id="bce-keyword" value="<?php echo $current_keyword; ?>" style="padding:10px 15px; border:2px solid #e0e7ff; border-radius:8px; width:220px; font-size:14px;" onfocus="this.style.borderColor='#3b82f6';" onblur="this.style.borderColor='#e0e7ff';"> </div> <div> <label for="bce-sort-by" style="font-weight:600; color:#1e40af; margin-right:10px; font-size:15px;">排序:</label> <select id="bce-sort-by" style="padding:10px 15px; border:2px solid #e0e7ff; border-radius:8px; font-size:14px;"> <option value="post_date" <?php selected($current_sort, 'post_date'); ?>>发布日期</option> <option value="modified" <?php selected($current_sort, 'modified'); ?>>修改日期</option> </select> </div> <div style="display:flex; align-items:center; gap:15px;"> <label style="font-weight:600; color:#1e40af; margin-right:8px; font-size:15px;">升序:</label> <input type="radio" name="bce-sort-order" value="asc" <?php checked($current_order, 'asc'); ?> style="width:18px; height:18px; cursor:pointer;"> <label style="font-weight:600; color:#1e40af; margin-left:15px; margin-right:8px; font-size:15px;">降序:</label> <input type="radio" name="bce-sort-order" value="desc" <?php checked($current_order, 'desc'); ?> style="width:18px; height:18px; cursor:pointer;"> </div> <div> <button id="bce-search-btn" style="padding:10px 25px; background: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%); color:white; border:none; border-radius:8px; cursor:pointer; font-weight:600; font-size:15px; transition:all 0.3s ease; box-shadow:0 4px 12px rgba(59, 130, 246, 0.15);"> 搜索 </button> </div> </div> </div> <!-- 列表区域 --> <div style="display:flex; gap:25px;"> <!-- 文章列表 --> <div style="flex:1; background:white; padding:20px; border-radius:10px; box-shadow:0 2px 10px rgba(0, 0, 0, 0.03);"> <!-- 选择文章标题 + 分页(移到标题后方) --> <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:20px;"> <h2 style="color:#1e40af; font-size:20px; margin:0; font-weight:600; padding-bottom:10px; border-bottom:2px solid #e0e7ff;">选择文章</h2> <?php if ($query->max_num_pages > 1) : ?> <div style="padding:8px 15px; background:#f8fafc; border-radius:8px;"><?php echo paginate_links([ 'base' => add_query_arg('paged', '%#%'), 'total' => $query->max_num_pages, 'current' => $paged, 'prev_text' => '← 上一页', 'next_text' => '下一页 →', 'mid_size' => 2, 'prev_next' => true ]); ?></div> <?php endif; ?> </div> <table class="widefat" style="width:100%; border-collapse:collapse; border-radius:8px; overflow:hidden; box-shadow:0 2px 8px rgba(0,0,0,0.05);"> <thead> <tr style="background: linear-gradient(135deg, #e0f2fe 0%, #f0f7ff 100%);"> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-size:15px;"><input type="checkbox" id="bce-select-all-posts" style="width:18px; height:18px; cursor:pointer;"></th> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-weight:600; color:#1e40af; font-size:15px;">标题</th> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-weight:600; color:#1e40af; font-size:15px;">当前分类</th> </tr> </thead> <tbody> <?php if (empty($posts)) : ?> <tr><td colspan="3" style="padding:30px; text-align:center; border:1px solid #e0e7ff; font-size:16px; color:#64748b;">暂无文章</td></tr> <?php else : ?> <?php foreach ($posts as $i => $post) : ?> <tr style="<?php echo $i%2 ? 'background:#f8fafc;' : 'background:white;'; ?>"> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px;"><input type="checkbox" class="bce-post-check" name="post_ids" value="<?php echo $post->ID; ?>" style="width:16px; height:16px; cursor:pointer;"></td> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px;"><a href="<?php echo get_edit_post_link($post->ID); ?>" style="color:#2563eb; text-decoration:none; font-weight:500;"><?php echo esc_html($post->post_title ?: '无标题'); ?></a></td> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px; color:#475569;"> <?php $cats = wp_get_post_categories($post->ID); $cat_names = ; foreach ($cats as $cat_id) { $cat = get_category($cat_id); if ($cat) $cat_names = $cat->name; } echo empty($cat_names) ? '<span style="color:#94a3b8; font-style:italic;">未分类</span>' : implode('、', $cat_names); ?> </td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> <!-- 分类列表 - 新增分类ID列 --> <div style="flex:1; background:white; padding:20px; border-radius:10px; box-shadow:0 2px 10px rgba(0, 0, 0, 0.03);"> <h2 style="color:#1e40af; font-size:20px; margin-bottom:20px; font-weight:600; margin-top:0; padding-bottom:10px; border-bottom:2px solid #e0e7ff;">选择分类</h2> <div style="margin-bottom:20px; padding:20px; background:#f8fafc; border-radius:10px; box-shadow:0 2px 8px rgba(0,0,0,0.05);"> <button id="bce-set-btn" style="padding:12px 25px; background: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%); color:white; border:none; border-radius:8px; cursor:pointer; margin-right:12px; font-weight:600; font-size:15px; transition:all 0.3s ease; box-shadow:0 4px 12px rgba(59, 130, 246, 0.15);"> 更改文章分类 </button> <button id="bce-add-btn" style="padding:12px 25px; background: linear-gradient(135deg, #10b981 0%, #34d399 100%); color:white; border:none; border-radius:8px; cursor:pointer; margin-right:12px; font-weight:600; font-size:15px; transition:all 0.3s ease; box-shadow:0 4px 12px rgba(16, 185, 129, 0.15);"> 添加分类 </button> <button id="bce-del-btn" style="padding:12px 25px; background: linear-gradient(135deg, #ef4444 0%, #f87171 100%); color:white; border:none; border-radius:8px; cursor:pointer; font-weight:600; font-size:15px; transition:all 0.3s ease; box-shadow:0 4px 12px rgba(239, 68, 68, 0.15);"> 删除分类 </button> </div> <table class="widefat" style="width:100%; border-collapse:collapse; border-radius:8px; overflow:hidden; box-shadow:0 2px 8px rgba(0,0,0,0.05);"> <thead> <tr style="background: linear-gradient(135deg, #e0f2fe 0%, #f0f7ff 100%);"> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-size:15px;"><input type="checkbox" id="bce-select-all-cats" style="width:18px; height:18px; cursor:pointer;"></th> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-weight:600; color:#1e40af; font-size:15px;">分类名称</th> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-weight:600; color:#1e40af; font-size:15px;">分类ID</th> <th style="padding:12px 15px; border:1px solid #e0e7ff; font-weight:600; color:#1e40af; font-size:15px;">文章数量</th> </tr> </thead> <tbody> <?php if (empty($categories)) : ?> <tr><td colspan="4" style="padding:30px; text-align:center; border:1px solid #e0e7ff; font-size:16px; color:#64748b;">暂无分类</td></tr> <?php else : ?> <?php foreach ($categories as $i => $cat) : ?> <tr style="<?php echo $i%2 ? 'background:#f8fafc;' : 'background:white;'; ?>"> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px;"><input type="checkbox" class="bce-cat-check" name="cat_ids" value="<?php echo $cat->term_id; ?>" style="width:16px; height:16px; cursor:pointer;"></td> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px;"><a href="<?php echo get_edit_term_link($cat->term_id, 'category'); ?>" style="color:#2563eb; text-decoration:none; font-weight:500;"><?php echo esc_html($cat->name); ?></a></td> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px; color:#7c3aed; font-weight:600;"><?php echo $cat->term_id; ?></td> <td style="padding:12px 15px; border:1px solid #e0e7ff; font-size:14px; color:#10b981; font-weight:600;"><?php echo $cat->count; ?></td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> </div> </div> <!-- 设置区域 --> <div id="bce-tab-settings" class="bce-tab-content" style="display:none; background: linear-gradient(180deg, #f5fafe 0%, #eaf6fa 100%); padding:30px; border-radius:12px; box-shadow:0 4px 20px rgba(0, 0, 0, 0.05); border:1px solid #e0f2fe;"> <div style="max-width:800px; margin:0 auto; background:white; padding:40px; border-radius:12px; box-shadow:0 5px 20px rgba(0,0,0,0.06);"> <h2 style="color:#1e40af; font-size:24px; margin-bottom:30px; font-weight:700; padding-bottom:20px; border-bottom:2px solid #e0f2fe; text-align:center;">插件设置</h2> <form method="post" action="options.php" style="width:100%;"> <?php settings_fields('bce_options_group'); ?> <div style="background: linear-gradient(180deg, #f5fafe 0%, #eaf6fa 100%); padding:30px; border-radius:10px; margin-bottom:30px; border:1px solid #e0f2fe;"> <h3 style="color:#1e40af; font-size:18px; margin-top:0; margin-bottom:20px; font-weight:600;">显示设置</h3> <div style="display:flex; align-items:center; gap:20px; flex-wrap:wrap;"> <label style="font-weight:600; color:#1e293b; font-size:16px; min-width:180px;"> 每页显示文章数量 </label> <div style="flex:1; min-width:200px;"> <input type="number" name="bce_options" value="<?php echo esc_attr($options ?? 15); ?>" min="1" max="100" step="1" style="padding:14px 20px; border:2px solid #e0e7ff; border-radius:8px; width:120px; font-size:16px;" onfocus="this.style.borderColor='#3b82f6'; this.style.boxShadow='0 0 0 4px rgba(59, 130, 246, 0.1)';" onblur="this.style.borderColor='#e0e7ff'; this.style.boxShadow='none';" /> <div style="margin-top:12px; color:#64748b; font-size:14px; line-height:1.6;"> <p style="margin:0;">建议值:10-50</p> <p style="margin:5px 0 0 0;">数值过大会影响页面加载速度,过小则需要频繁翻页</p> </div> </div> </div> </div> <div style="text-align:center; margin-top:20px;"> <?php submit_button('保存设置', 'primary', '', false, [ 'style' => 'padding:14px 40px; background: linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%); color:white; border:none; border-radius:8px; font-size:18px; font-weight:600; cursor:pointer; transition:all 0.3s ease; box-shadow:0 6px 16px rgba(59, 130, 246, 0.2);' ]); ?> </div> </form> <div style="margin-top:30px; padding:20px; background:#f0f7ff; border-radius:8px; border-left:4px solid #3b82f6;"> <h4 style="color:#1e40af; font-size:16px; margin-top:0; margin-bottom:10px; font-weight:600;">使用提示</h4> <ul style="margin:0; padding-left:20px; color:#475569; font-size:14px; line-height:1.8;"> <li>修改设置后需要点击"保存设置"按钮生效</li> <li>建议根据服务器性能调整每页显示数量</li> <li>所有操作都会实时生效,请谨慎选择文章和分类</li> </ul> </div> </div> </div> </div> <!-- JS脚本(功能完整) --> <script> jQuery(document).ready(function($) { // 标签页切换 $('.bce-tab-btn').click(function() { $('.bce-tab-btn').removeClass('active').css({ background: '#f8fafc', color: '#1e40af', border: '1px solid #dbeafe', boxShadow: 'none' }); $(this).addClass('active').css({ background: 'linear-gradient(135deg, #3b82f6 0%, #60a5fa 100%)', color: 'white', border: 'none', boxShadow: '0 4px 12px rgba(59, 130, 246, 0.15)' }); $('.bce-tab-content').hide(); $('#bce-tab-' + $(this).data('tab')).show(); }); // 全选功能 $('#bce-select-all-posts').click(function() { $('.bce-post-check').prop('checked', this.checked); }); $('#bce-select-all-cats').click(function() { $('.bce-cat-check').prop('checked', this.checked); }); // 搜索功能 $('#bce-search-btn').click(function() { const cat = $('#bce-cat-filter').val(); const keyword = $('#bce-keyword').val(); const sort = $('#bce-sort-by').val(); const order = $('input:checked').val(); let url = '<?php echo admin_url('tools.php?page=batch-category-editor'); ?>'; const params = ; if (cat && cat != -1) params.push('cat=' + cat); if (keyword) params.push('s=' + encodeURIComponent(keyword)); if (sort) params.push('sort=' + sort); if (order) params.push('order=' + order); if (params.length) url += '&' + params.join('&'); window.location.href = url; }); // 提示框 function showToast(msg, isSuccess = true) { const toast = $('<div style="position:fixed; top:30px; right:30px; padding:18px 25px; border-radius:10px; background:white; box-shadow:0 8px 24px rgba(0,0,0,0.12); z-index:9999; display:flex; align-items:center; gap:12px; border-left:4px solid #22c55e;"></div>'); const icon = isSuccess ? '<span style="color:#22c55e; font-size:24px; font-weight:bold;">✓</span>' : '<span style="color:#ef4444; font-size:24px; font-weight:bold;">✕</span>'; if (!isSuccess) toast.css('border-left-color', '#ef4444'); toast.html(icon + '<span style="font-size:16px; color:#1e293b;">' + msg + '</span>'); $('body').append(toast); toast.hide().fadeIn(300); setTimeout(() => toast.fadeOut(300, () => toast.remove()), 4000); } // 加载动画 function showLoader() { const loader = $('<div style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(255,255,255,0.9); z-index:9998; display:flex; justify-content:center; align-items:center;"><div style="background:white; padding:40px; border-radius:12px; text-align:center; box-shadow:0 10px 30px rgba(0,0,0,0.1);"><div style="width:60px; height:60px; border:6px solid #f0f7ff; border-top:6px solid #3b82f6; border-radius:50%; animation:spin 1s linear infinite; margin:0 auto;"></div><p style="margin-top:25px; font-size:18px; color:#1e40af; font-weight:600;">处理中...</p></div></div>'); $('body').append(loader); $('head').append('<style>@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }</style>'); return loader; } // 分类操作 function doAction(action) { const postIds = $('.bce-post-check:checked').map(function() { return $(this).val(); }).get(); const catIds = $('.bce-cat-check:checked').map(function() { return $(this).val(); }).get(); if (postIds.length === 0) { showToast('请选择至少一篇文章', false); return; } if (catIds.length === 0) { showToast('请选择至少一个分类', false); return; } const loader = showLoader(); $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', dataType: 'json', data: { action: 'bce_' + action + '_cat', post_ids: postIds.join(','), cat_ids: catIds.join(',') }, success: function(res) { if (res && res.success) { showToast(res.data.msg); setTimeout(() => window.location.reload(), 1500); } else { showToast(res ? (res.data.msg || '操作失败') : '操作失败', false); } }, error: function() { showToast('网络错误,请重试', false); }, complete: function() { loader.remove(); } }); } // 绑定按钮 $('#bce-set-btn').click(function() { doAction('set'); }); $('#bce-add-btn').click(function() { doAction('add'); }); $('#bce-del-btn').click(function() { doAction('del'); }); }); </script> <?php } // ===================== AJAX处理函数(功能完整) ===================== function bce_ajax_set_cat() { if (!current_user_can('edit_posts')) { wp_send_json_error(); } $post_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; $cat_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; if (empty($post_ids) || empty($cat_ids)) { wp_send_json_error(); } foreach ($post_ids as $post_id) { wp_set_post_categories($post_id, $cat_ids); } wp_send_json_success(); } function bce_ajax_add_cat() { if (!current_user_can('edit_posts')) { wp_send_json_error(); } $post_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; $cat_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; if (empty($post_ids) || empty($cat_ids)) { wp_send_json_error(); } foreach ($post_ids as $post_id) { $current_cats = wp_get_post_categories($post_id); $new_cats = array_unique(array_merge($current_cats, $cat_ids)); wp_set_post_categories($post_id, $new_cats); } wp_send_json_success(); } function bce_ajax_del_cat() { if (!current_user_can('edit_posts')) { wp_send_json_error(); } $post_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; $cat_ids = isset($_POST) ? array_map('intval', explode(',', sanitize_text_field($_POST))) : ; if (empty($post_ids) || empty($cat_ids)) { wp_send_json_error(); } $default_cat = get_option('default_category'); foreach ($post_ids as $post_id) { $current_cats = wp_get_post_categories($post_id); $new_cats = array_diff($current_cats, $cat_ids); if (empty($new_cats)) { $new_cats = ; } wp_set_post_categories($post_id, $new_cats); } wp_send_json_success(); } // ===================== 插件停用清理 ===================== register_deactivation_hook(__FILE__, function() { global $wpdb; $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE 'bce_%'"); delete_transient('wp_menu_cache'); wp_cache_flush(); }); ?> 百度一下
2026年-5月-15日
2 阅读
0 评论
网站插件
2
3
4