基于 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 插件选项的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1418170.html

(0)
上一篇 2025年2月17日 22:57:23
下一篇 2025年2月17日 22:57:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • EHVIew下载方法

    要下载 EHVIew,请访问 its GitHub 页面,单击“代码”,选择“下载 ZIP”,解压缩文件,并启动应用程序。 EHVIew下载方法 如何下载EHVIew? EHVIew是一款用于查看和编辑HomeKit设备配对数据的工具。您可…

    2025年3月14日
    200
  • 非线性悬疑侦探新作《心灵警探》将于2024年Q4发售

    来源:官方 你能在5天内找到真凶吗?非线性悬疑侦探新作《心灵警探》将于2024 Q4登陆PC、PS5和Switch! 著名的心灵警探和助手琳达抵达了梅里林环形山营地,案件真相即将浮出水面! 2024年9月5日,法国·蒙彼利埃 – 发行商De…

    2025年3月14日 编程技术
    200
  • python写火车票抢票软件下载

    可以下载 Python 火车票抢票软件来解决抢票难题,最常用的软件是 12306 抢票助手。下载步骤: 1. 访问 GitHub 项目。2. 下载 ZIP 文件。3. 解压文件。使用步骤: 1. 运行“run.py”。2. 输入账号密码。3…

    2025年3月14日
    200
  • 在 CFML 输出缓冲区中搜索字符串

    在大约 10 年前的一个项目中,我们从受信任的第三方获取 HTML 片段以包含在网站上。 我们偶尔会在后台获取内容并更新网页,而不是使用 iFrame 或合并 ajax(这可能会对我们的 SEO 产生负面影响)。虽然这种方法工作得很好,但有…

    2025年3月14日
    200
  • 网易云音乐怎么下载无损到mp3

    网易云音乐不支持直接下载无损音质到 MP3。可通过以下间接方法下载:使用 foobar2000 软件和网易云音乐解锁插件,将 FLAC 无损歌曲转换为 MP3。使用在线音乐转换网站,将网易云音乐无损歌曲 URL 转换为 MP3。 网易云音乐…

    2025年3月14日
    200
  • volumeshader_bm测试介绍

    揭秘volumeshader_bm:抖音热议的神秘软件对于近期风靡于抖音的volumeshader_bm,许多用户对其用途感到好奇。volumeshader_bm是一款受到广泛关注的神秘软件。为了解开它的谜团,php小编新一特此为您带来vo…

    2025年3月14日 编程技术
    200
  • 华为商城怎么预约购买手机

    通过华为商城预约购买手机的步骤依序为:登录华为商城官网或 App,使用华为 ID 登录。搜索并选择您要购买的手机型号,点击“立即预约”。填写预约信息,包含姓名、手机号和手机型号、颜色、内存等。提交预约,华为商城会安排预计发货时间。 如何预约…

    2025年3月14日
    200
  • 华为商城怎么预约购买手机的

    如何预约购买华为手机:登录华为商城官网或 App。选择要购买的手机型号。点击“预约购买”。填写预约信息(姓名、联系方式、收货地址)。选择预约时间和门店。确认预约信息并提交。预约成功后前往门店支付并取货。 华为商城预约购买手机指南 视频教程:…

    2025年3月14日
    200
  • nodejs如何用命令行更新

    node.js 命令行更新方法取决于你的安装方式。 没有一种放之四海而皆准的方案。 如果你使用的是 Node Version Manager (nvm),更新过程最为便捷。 我曾经在开发一个需要特定 Node.js 版本的项目时,就深受 n…

    2025年3月14日
    200
  • 小红书收藏怎么去掉水印

    可通过以下步骤去除小红书收藏图片中的水印:1. 下载并安装小红书收藏去水印工具;2. 将收藏链接粘贴到工具中;3. 点击”去水印”按钮;4. 保存无水印的图片。 小红书收藏去水印 小红书收藏可通过以下步骤去除水印: …

    2025年3月14日
    200

发表回复

登录后才能评论