基于 JSON 结构创建 WordPress 插件选项

有一天,我想知道如何让 wordpress 插件选项由 json 文件控制,以便将来可以更轻松地添加其他设置,而无需调整代码本身。

本文提供了一个极其简单的 wordpress 插件示例,该插件的单个设置页面由 2 个部分和 3 个字段/选项组成。

完整代码可以在github上找到。

设置基地

该插件最初由 3 个文件组成。

adventures.jsonadventures.phpclass.adventures.php

adventures.php 带有基本插件注册:

<?php/*plugin name: adventuresplugin uri: https://mortenhartvig.dkdescription: lorem ipsum dolor sit amet, consectetur adipiscing elit. sed pharetra nisi eu varius pellentesque. aenean posuere, velit mollis sodales convallis, ipsum lectus feugiat nunc, ac auctor sapien enim eu metus.version: 1requires at least: 6.1requires php: 8.3author: morten hartvigauthor uri: https://mortenhartvig.dklicense: do whatever you want*/define('adv__plugin_dir', plugin_dir_path(__file__));define('adv__plugin_view', adv__plugin_dir . 'views');define('adv__plugin_slug', 'adv');require_once adv__plugin_dir . 'class.adventures.php';(new adventures());

class.adventures.php 带有一个空类:

<?phpclass adventures {    public function __construct() {    }}

adventures.json 包含插件设置的 json 结构:

{    "settings": {        "pages": [            {                "title": "adventures",                "capability": "manage_options",                "slug": "adv"            }        ],        "sections": [            {                "id": "portal_base",                "title": "base configuration",                "description": "lorem 1, ipsum dolor sit amet consectetur adipisicing elit. cumque nulla in officiis. laborum quisquam illo eaque, deserunt facere mollitia sint doloremque maiores, obcaecati reiciendis voluptate itaque iure fugiat quia architecto!",                "view": "section"            },            {                "id": "portal_appearance",                "title": "appearance",                "description": "lorem 2, ipsum dolor sit amet consectetur adipisicing elit. cumque nulla in officiis. laborum quisquam illo eaque, deserunt facere mollitia sint doloremque maiores, obcaecati reiciendis voluptate itaque iure fugiat quia architecto!",                "view": "section"            }        ],        "fields": [            {                "id": "adv_portal_key",                "title": "portal key",                "section": "portal_base",                "type": "text",                "placeholder": "enter your portal key",                "view": "field.text"            },            {                "id": "adv_api_host",                "title": "host api",                "section": "portal_base",                "type": "text",                "placeholder": "enter api host",                "default": "https://api.mortenhartvig.dk",                "view": "field.text"            },            {                "id": "adv_portal_theme",                "title": "theme",                "section": "portal_appearance",                "type": "select",                "options": {                    "rounded.v1": "round (v1)",                    "squared.v1": "square (v1)",                    "standard": "standard"                },                "default": "standard",                "view": "field.select"            }        ]    }}

读取 json 数据

为您的设置创建一个属性并调用 set_settings():

private $settings;public function __construct() {    $this->set_settings();}

创建 set_settings() 和 get_json_data():

private function set_settings() {    $data = $this->get_json_data();    $this->settings = $data['settings'];}private function get_json_data() {    $file = adv__plugin_dir . 'adventures.json';    if (!file_exists($file)) {        die('adventures.json not found');    }    return json_decode(file_get_contents($file), true);}

如果您将 die(print_r($this->settings)) 添加到您的 __construct 中,您可以确认您确实已加载设置。

基于 JSON 结构创建 WordPress 插件选项

设置页面

从构造函数中调用 init_hooks():

public function __construct() {    $this->set_settings();    $this->init_hooks();}

创建init_hooks():

private function init_hooks() {    add_action('admin_menu', [$this, 'register_settings_pages']);}

创建register_settings_pages()和settings_page_callback()。

public function register_settings_pages() {    foreach ($this->settings['pages'] as $page) {        add_options_page($page['title'], $page['title'], $page['capability'], $page['slug'], [$this, 'settings_page_callback']);        }}public function settings_page_callback() {    $this->render('settings.php');}

创建渲染():

private function render($filename, $args) {    if (is_array($args)) {        $value = get_option($args['id']);        if (empty($value) && isset($args['default'])) {            $value = $args['default'];        }        $args = array_merge($args, ['value' => $value]);    }    $file = adv__plugin_view . $filename;    if (!str_ends_with($file,'.php')) {        $file .= '.php';    }    if(!file_exists($file)) {        die('file not found ' . $filename);    }    require $file;}

创建views/settings.php:

adventures

基于 JSON 结构创建 WordPress 插件选项

部分

在 init_hooks 中添加另一个操作:

private function init_hooks() {    add_action('admin_menu', [$this, 'register_settings_pages']);    add_action('admin_init', [$this, 'register_settings_sections']);}

创建register_settings_sections()和settings_section_callback():

public function register_settings_sections() {    foreach ($this->settings['sections'] as $section) {        add_settings_section($section['id'], $section['title'], [$this, 'settings_section_callback'], adv__plugin_slug, $section);    }}public function settings_section_callback($args) {    $this->render($args['view'], $args);}

创建views/section.php:

领域

在 init_hooks 中添加第三个操作:

private function init_hooks() {    add_action('admin_menu', [$this, 'register_settings_pages']);    add_action('admin_init', [$this, 'register_settings_sections']);    add_action('admin_init', [$this, 'register_settings_fields']);}

创建register_settings_fields()和settings_field_callback():

public function register_settings_fields() {    foreach ($this->settings['fields'] as $field) {        add_settings_field($field['id'], $field['title'], [$this, 'settings_field_callback'], adv__plugin_slug, $field['section'], $field);        register_setting(adv__plugin_slug, $field['id']);    }}public function settings_field_callback($args) {    $this->render($args['view'], $args);}

创建views/field.select.php:

 $val) {    $html_options .= sprintf('%s', $key, selected($args['value'], $key, false), $val);}printf('%s', $args['id'], $args['id'], $html_options);

创建views/field.text.php:

<?phpprintf('', $args['id'], $args['id'], $args['value'], $args['placeholder']);

保存

要查看并保存您的选项,请在 settings.php 中添加一个表单:

adventures

更改选项并尝试保存。保存应该成功。

基于 JSON 结构创建 WordPress 插件选项

您的设置现已保存,可以通过以下方式在整个网站上访问:

<?phpecho get_option('adv_portal_theme'); // squared.v1

添加新字段

将以下 json 添加到 adventures.json:

{    "id": "adv_api_token",    "title": "Host API Token",    "section": "portal_base",    "type": "text",    "placeholder": "Enter API host token",    "default": "",    "view": "field.text"}

它将自动添加到您的设置中:

基于 JSON 结构创建 WordPress 插件选项

以上就是基于 JSON 结构创建 WordPress 插件选项的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1251930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 23:34:04
下一篇 2025年12月9日 23:34:14

相关推荐

  • 如何将PPT转换为HTML5格式并保留视频和动画?

    ppt转html5,保留视频和动画的解决方法 问题:如何将ppt文档转换为html5格式,并保留其内部的视频和动画效果? 答案: 使用ppt导出为html 打开ppt文档。点击“文件”菜单。选择“导出”。在“导出为”选项中选择“html”。 注意:该方法仅适用于简单的ppt文档,无法保留复杂的动画和…

    好文分享 2025年12月10日
    000
  • 使用JetBrains教育许可证开发商业项目:风险有多大?

    使用JetBrains教育许可证开发商业软件的风险与责任 利用JetBrains教育许可证进行商业项目开发存在显著风险,本文将详细分析这些风险及应对策略。 许可协议的限制 JetBrains教育许可证明确禁止将开发的软件用于商业或盈利目的。违反此协议将带来法律风险。 规模与风险的关系 小型初创企业可…

    2025年12月10日
    000
  • 使用JetBrains教育许可开发商业项目:风险有多大?

    JetBrains教育许可与商业项目开发:风险分析 部分企业利用JetBrains开发工具(例如PhpStorm、IDEA)的教育许可开发商业项目。然而,此举存在潜在法律风险,务必谨慎。 JetBrains教育许可条款明确禁止将使用该许可开发的代码用于商业盈利活动。若企业以此类代码获利,则构成违约。…

    2025年12月10日
    000
  • 教育版许可开发商业项目:风险有多大?如何规避?

    JetBrains教育版许可用于商业项目:风险评估与解决方案 部分企业利用JetBrains教育版许可开发商业项目,此举存在显著风险。本文将分析其潜在影响,并提供相应的规避策略。 教育版许可的限制与违规后果 JetBrains教育版许可明确规定禁止用于商业盈利活动。任何基于教育版许可开发的商业项目都…

    2025年12月10日
    000
  • PPT转HTML5如何保留视频和动画效果?

    将PPT转换为HTML5并保留视频和动画效果 本文介绍两种将PPT转换为HTML5格式,同时保留视频和动画效果的方法。 方法一:使用PowerPoint内置功能 这是最简单直接的方法: 立即学习“前端免费学习笔记(深入)”; 打开您的PPT文件,点击“文件”>“导出”。选择“创建网页”,或类似…

    2025年12月10日
    000
  • 白天夜晚模式切换后刷新页面就失效了,如何解决?

    白天/夜晚模式切换失效的解决方法 本文将解决白天/夜晚模式切换后刷新页面失效的问题。 问题在于,模式设置没有持久化保存,刷新页面后丢失了之前的选择。以下提供一种改进方案,利用cookie存储模式设置,并在页面加载时读取cookie恢复模式。 问题描述: 一个白天/夜晚模式切换按钮,刷新页面后,选择的…

    2025年12月10日
    000
  • 使用JetBrains教育许可证开发商业项目,会面临哪些风险?

    使用JetBrains教育许可证开发商业应用的风险分析 在企业级项目中使用JetBrains教育许可证存在诸多法律风险,务必谨慎。 违反许可协议 教育许可证明确禁止将基于其开发的软件用于商业用途或营利活动。 任何商业化行为,例如软件销售或商业交易,都将构成违反许可协议。 许可证合规性审查 虽然Jet…

    2025年12月10日
    000
  • PHP数组如何高效地添加子数组?

    高效php数组操作:向数组添加子数组的多种方法 本文将探讨在PHP中高效添加子数组到现有数组的几种方法,并比较其优缺点。 下图展示了本文将讨论的几种方法的对比。 方法一:使用foreach循环 这是最直观的方法,适合处理各种类型的子数组。 立即学习“PHP免费学习笔记(深入)”; $mainArra…

    2025年12月10日
    000
  • MySQL正则替换:如何用REGEXP_REPLACE()删除“@&”及其后的内容?

    MySQL REGEXP_REPLACE() 函数实现特定字符串及后续内容的正则替换 本文介绍如何使用MySQL的REGEXP_REPLACE()函数,删除字段中“@&”及其后的所有内容。 需求:需要处理包含如下格式数据的字段: 123@&baidugoogle@&sohu …

    2025年12月10日
    000
  • 如何设计MySQL+PHP商城每周抽奖活动及奖金分配统计系统?

    基于MySQL和PHP的商城每周抽奖活动及奖金分配统计系统 本文阐述一个设计方案,用于实现商城每周抽奖活动,并对奖金进行统计和分配。 系统需求: 该系统需满足以下功能需求: 立即学习“PHP免费学习笔记(深入)”; 参与资格: 每周交易次数达到10次的用户方可参与抽奖。奖金分配: 当期奖池的50%按…

    2025年12月10日
    000
  • MySQL中如何用正则表达式替换特定字符串及其后内容?

    MySQL正则表达式替换:删除特定字符串及后续内容 本文介绍如何在MySQL中使用正则表达式替换特定字符串及其之后的所有内容。例如,数据库字段中以“@&”分隔的数据,可以使用regexp_replace函数进行处理。 regexp_replace函数用法: regexp_replace(目标…

    2025年12月10日
    000
  • Java免签支付App监控代码如何添加“你已成功收款”消息的检测功能?

    增强Java免签支付App监控代码,实现“你已成功收款”消息检测 现有代码能够识别支付宝收款通知栏中“某某人通过扫码收款”类型的消息,但无法识别“你已成功收款”类型的消息。 为了解决这个问题,只需在代码中添加一个简单的判断条件: if (v0.contains(“通过扫码向你付款”) || v0.c…

    2025年12月10日
    000
  • MySQL字符查询不准确:字符集和排序规则如何影响搜索结果?

    MySQL字符集差异导致查询结果不精确 在MySQL数据库中,字符查询不精确的问题通常源于字符集设置的差异。例如,搜索“竹”字时,结果中可能意外包含“⺮”字。这是因为MySQL数据库默认的字符集和排序规则可能将这两个字识别为相同字符。 造成此现象的原因在于排序规则。排序规则决定了字符的排列顺序。My…

    2025年12月10日
    000
  • CI框架中如何异步渲染移动端列表页的分类新闻?

    使用CI框架异步加载移动端分类新闻 本文介绍如何利用CodeIgniter (CI)框架实现移动端列表页分类新闻的异步加载,提升用户体验。 实现步骤: 前端 (JavaScript): 为每个分类标题添加点击事件监听器,并将分类ID作为参数传递。使用AJAX向后端发送请求,获取指定分类的新闻数据。 …

    2025年12月10日
    000
  • CodeIgniter框架下如何实现异步处理分类渲染以提升移动端网站性能?

    提升移动端网站性能:CodeIgniter框架下的异步分类渲染 移动端网站列表页面的用户体验至关重要。本文将介绍如何利用CodeIgniter框架实现异步处理分类渲染,从而优化用户体验。 实现方案 我们采用简洁高效的Ajax请求实现异步渲染。用户点击不同分类时,系统会向服务器发送包含分类标识的请求。…

    2025年12月10日
    000
  • MySQL+PHP抽奖活动:如何设计高效的数据库表结构及数据统计方案?

    MySQL与PHP抽奖活动:高效数据库设计及数据统计方案 本文介绍一个基于MySQL和PHP的抽奖活动方案,重点阐述数据库表结构设计和数据统计方法,确保活动高效运行。 数据库表结构 为实现高效的数据管理,我们设计以下三个数据库表: 立即学习“PHP免费学习笔记(深入)”; 用户订单表 (orders…

    2025年12月10日
    000
  • MySQL中“⺮”和“竹”为何被视为同一字符?

    MySQL数据库中“⺮”和“竹”字符混淆的原因及解决方法 在MySQL数据库进行文本搜索时,用户可能会发现“⺮”和“竹”这两个字被系统识别为同一个字符。这是由于MySQL的字符集和排序规则导致的。 根本原因在于MySQL使用的字符集及其对应的排序规则。不同的排序规则对字符的排序方式有所不同。“⺮”和…

    2025年12月10日
    000
  • MySQL中如何用正则表达式替换指定字符串及之后文本?

    MySQL中如何利用正则表达式替换特定字符串及其后续文本 本文介绍如何在MySQL数据库中使用正则表达式替换指定字符串及其后的所有内容。 假设您的表字段包含如下数据: 123@&baidugoogle@&sohu 目标是移除所有以”@&”开头的字符串及…

    2025年12月10日
    000
  • PHP语法基础到原生PHP网站开发:如何循序渐进地构建我的第一个网站?

    从PHP语法基础到原生PHP网站开发:循序渐进构建你的第一个网站 掌握PHP语法基础后,跃升至原生PHP网站开发是许多开发者的目标。然而,这需要清晰的规划和步骤。 学习资源:视频与代码示例 高效学习的关键在于结合视频教程和实际代码练习: 立即学习“PHP免费学习笔记(深入)”; 推荐视频教程: bi…

    2025年12月10日
    000
  • PHP SOAP请求:如何使用PHP发送SOAP请求并处理错误?

    利用PHP高效发送SOAP请求及错误处理 本文将指导您如何使用PHP发送SOAP请求并有效处理可能出现的错误。 代码示例:获取SOAP函数和类型列表 以下代码演示如何获取SOAP服务的函数和类型列表: 立即学习“PHP免费学习笔记(深入)”; $wsdl = “https://www.xxx.com…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信