Emlog 插件与主题开发入门指南

Emlog 是一款轻量、高效的 PHP 博客系统,其灵活的插件和主题机制让开发者能够轻松扩展功能、美化界面。本文将带你从零开始,掌握 Emlog 插件与主题开发的核心知识。


一、环境准备与基础概念

1.1 开发环境搭建

  • 本地环境:推荐使用 PHPStudy、XAMPP 等集成环境,PHP 版本建议 7.2+。
  • 开发工具:VS Code、PHPStorm 等,配合 Git 进行版本管理。
  • 调试工具:开启 Emlog 开发者模式(config.php 中定义 ENVIRONMENTdevelop)。

1.2 Emlog 目录结构

├── admin/          # 后台管理
├── content/        # 主题和插件存放目录
│   ├── themes/     # 主题目录
│   └── plugins/    # 插件目录
├── include/        # 核心库
├── config.php      # 配置文件
└── index.php       # 入口文件

二、插件开发入门

2.1 插件基本结构

一个插件通常包含以下文件:

myplugin/
├── myplugin.php       # 主文件(必须)
├── plugin_config.php  # 配置界面(可选)
├── install.php        # 安装脚本(可选)
├── uninstall.php      # 卸载脚本(可选)
└── assets/            # 静态资源目录

2.2 插件主文件规范

插件主文件必须包含插件说明信息,以注释形式写在文件头部:

<?php
/**
 * @package  MyPlugin
 * @name     我的插件
 * @version  1.0.0
 * @link     https://example.com
 * @des     这是一个示例插件
 */

2.3 挂载钩子(Hook)

Emlog 提供了丰富的钩子机制,常用钩子如下:

<?php
// 文章发布时触发
define('MYPLUGIN_POST_ADD', 'post_add');

// 初始化钩子 - 所有页面都会执行
function myplugin_init() {
    // 你的初始化代码
}
addAction('init', 'myplugin_init');

// 文章保存后触发
function myplugin_post_save($gid) {
    // 处理文章 ID 为 $gid 的数据
}
addAction('post_save', 'myplugin_post_save');

// 在页面底部输出自定义内容
function myplugin_footer() {
    echo '<p>自定义底部内容</p>';
}
addAction('footer', 'myplugin_footer');

2.4 插件配置界面

创建 plugin_config.php 文件,为插件提供后台设置页面:

<?php
// 保存配置
if (isset($_POST['submit'])) {
    $config = array(
        'title' => trim($_POST['title']),
        'enable' => isset($_POST['enable']) ? 1 : 0
    );
    savePluginConfig('myplugin', $config);
    emMsg('配置已保存');
}

// 读取当前配置
$config = getPluginConfig('myplugin');
?>
<form method="post" action="">
    <p>
        <label>标题:</label>
        <input type="text" name="title" value="<?php echo htmlspecialchars($config['title'] ?? ''); ?>" />
    </p>
    <p>
        <label><input type="checkbox" name="enable" <?php echo !empty($config['enable']) ? 'checked' : ''; ?> /> 启用功能</label>
    </p>
    <p><input type="submit" name="submit" value="保存" /></p>
</form>

三、主题开发入门

3.1 主题文件结构

mytheme/
├── header.php       # 头部模板
├── footer.php       # 底部模板
├── index.php        # 首页模板
├── post.php         # 文章页模板
├── page.php         # 独立页面模板
├── sort.php         # 分类页模板
├── search.php       # 搜索页模板
├── log_list.php     # 文章列表模块
├── sidebar.php      # 侧边栏模板
├── module.php       # 侧边栏组件模板
├── style.css        # 样式文件(必须)
├── content.css      # 文章内容样式(可选)
├── preview.png      # 预览图(建议 300x200)
└── functions.php    # 功能扩展文件(可选)

3.2 基础模板标签

以下为模板中常用的核心函数:

<?php
// 输出文章标题
<?php echo $log_title; ?>

// 输出文章内容
<?php echo $log_content; ?>

// 输出发布时间
<?php echo date('Y-m-d', $date); ?>

// 输出分类名称
<?php echo $sortname; ?>

// 输出文章作者
<?php echo $author; ?>

// 输出文章点击数
<?php echo $views; ?>

3.3 常用模板标签示例

首页文章列表(index.php)核心代码:

<?php if (!empty($logs)): ?>
    <?php foreach ($logs as $value): ?>
        <article class="post">
            <h2><a href="<?php echo $value['log_url']; ?>"><?php echo $value['log_title']; ?></a></h2>
            <div class="meta">
                <span><?php echo $value['sort_name']; ?></span>
                <span><?php echo date('Y-m-d', $value['date']); ?></span>
                <span><?php echo $value['views']; ?> 次阅读</span>
            </div>
            <div class="content">
                <?php echo $value['log_description']; ?>
            </div>
        </article>
    <?php endforeach; ?>
<?php else: ?>
    <p>暂无文章</p>
<?php endif; ?>

3.4 侧边栏组件开发

module.php 中定义可配置的侧边栏组件:

<?php
// 注册一个自定义组件
function theme_custom_widget($title, $content) {
    echo '<div class="widget custom-widget">';
    if (!empty($title)) {
        echo '<h3>' . $title . '</h3>';
    }
    echo '<div class="widget-content">' . $content . '</div>';
    echo '</div>';
}

3.5 主题配置选项

在主题的 functions.php 中添加配置功能:

<?php
// 获取主题配置
$theme_config = getThemeConfig();

// 输出自定义配置项
function theme_display_config() {
    global $theme_config;
    echo isset($theme_config['custom_css']) ? $theme_config['custom_css'] : '';
}

四、实用技巧与最佳实践

4.1 数据库操作

插件中操作数据库时,建议使用 Emlog 提供的数据库工具类:

<?php
// 使用数据库类
$db = Database::getInstance();

// 查询数据
$result = $db->query("SELECT * FROM " . DB_PREFIX . "blog WHERE sortid = 1");

// 插入数据
$db->query("INSERT INTO " . DB_PREFIX . "blog (title, content) VALUES ('标题', '内容')");

4.2 安全规范

  • 对用户输入使用 htmlspecialchars() 过滤输出。
  • 数据库操作使用参数绑定或转义函数。
  • 后台操作前检查用户权限:if (ROLE != 'admin') exit;

4.3 性能优化

  • 善用缓存,减少重复查询。
  • 合理加载静态资源,避免加载不必要的 JS/CSS。
  • 图片尽量压缩后上传。

4.4 兼容性检查

  • 遵循 Emlog 官方 API 规范,避免使用过时函数。
  • 做好新旧版本兼容处理(如函数存在性检查)。
  • 主题和插件代码风格保持统一、注释清晰。

五、发布与更新

5.1 插件打包发布

  1. 确保插件功能完整、无重大 Bug。
  2. 编写详细的 README 和更新日志。
  3. 打包为 ZIP 压缩包上传至 Emlog 官方应用商店或社区。

5.2 主题发布要点

  1. 提供多浏览器兼容测试结果。
  2. 包含响应式布局,适配移动端。
  3. 提供丰富的自定义选项,方便用户配置。

结语

Emlog 的插件和主题开发并不复杂,关键在于理解其钩子机制和模板标签体系。希望本指南能帮助你快速上手,开发出功能强大、外观精美的 Emlog 扩展!如有问题,欢迎在 Emlog 官方社区交流讨论。


提示:本文所有代码示例基于 Emlog 6.x 版本,不同版本可能存在差异,请以官方文档为准。