以下是一个简单的 Typecho 接口插件的示例代码:

创建一个名为 api.php 的文件,并将其放置在 Typecho 的插件目录中。

在 api.php 文件中,添加插件的头文件和插件类定义:

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

require_once 'ApiHandler.php';

class ApiPlugin implements Typecho_Plugin_Interface
{
    public static function activate() {
        // 插件激活时执行的操作
    }

    public static function deactivate() {
        // 插件停用时执行的操作
    }

    public static function config(Typecho_Widget_Helper_Form $form) {
        // 插件设置页面的表单
    }

    public static function personalConfig(Typecho_Widget_Helper_Form $form) {
        // 插件个人设置页面的表单
    }

    public static function handle() {
        // 处理接口请求
        $handler = new ApiHandler();
        $handler->handleRequest();
    }
}
?>

在上面的代码中,ApiHandler 是我们将要创建的接口处理类,处理客户端请求并返回结果。

创建一个名为 ApiHandler.php 的文件,并将其放置在插件目录下。

在 ApiHandler.php 文件中,添加代码以处理客户端请求:

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

class ApiHandler
{
    public function handleRequest() {
        // 处理客户端请求

        switch ($_REQUEST['action']) {
            case 'get_post':
                $this->getPost();
                break;
            case 'get_page':
                $this->getPage();
                break;
            default:
                $this->returnError('Invalid action');
        }
    }

    private function getPost() {
        // 获取文章数据
        $pid = $_REQUEST['pid'];
        $post = Typecho_Widget::widget('Widget_Abstract_Contents')->filter('cid=' . $pid)->create();
        if (empty($post)) {
            $this->returnError('Post not found');
        } else {
            $data = array(
                'title' => htmlspecialchars($post->title),
                'content' => $post->content,
                'date' => $post->date->format('Y-m-d H:i:s')
            );
            $this->returnData($data);
        }
    }

    private function getPage() {
        // 获取页面数据
        $pid = $_REQUEST['pid'];
        $page = Typecho_Widget::widget('Widget_Abstract_Contents')->filter('cid=' . $pid)->create();
        if (empty($page)) {
            $this->returnError('Page not found');
        } else {
            $data = array(
                'title' => htmlspecialchars($page->title),
                'content' => $page->content,
                'date' => $page->date->format('Y-m-d H:i:s')
            );
            $this->returnData($data);
        }
    }

    private function returnData($data) {
        // 返回正常响应
        header('Content-Type: application/json');
        echo json_encode($data);
        exit;
    }

    private function returnError($errorMsg) {
        // 返回错误响应
        header('Content-Type: application/json');
        echo json_encode(array('error' => $errorMsg));
        exit;
    }
}
?>

在这个代码中,我们定义了处理客户端请求的 ApiHandler 类,它有三个私有方法:

getPost():获取文章数据。

getPage():获取页面数据。

returnData():返回正常响应。

returnError():返回错误响应。

这个插件提供了两个 API:

get_post:获取指定 ID 的文章数据。

get_page:获取指定 ID 的页面数据。

最后,在 Typecho 的插件管理页面激活该插件即可。现在,可以使用下面的代码从客户端调用这些 API:

// 获取文章数据
$.ajax({
    url: '/api.php',
    type: 'GET',
    data: {
        action: 'get_post',
        pid: 1
    },
    dataType: 'json',
    success: function(data) {
        console.log(data);
    },
    error: function(xhr, status, error) {
        console.error(error);
    }
});

// 获取页面数据
$.ajax({
    url: '/api.php',
    type: 'GET',
    data: {
        action: 'get_page',
        pid: 1
    },
    dataType: 'json',
    success: function(data) {
        console.log(data);
    },
    error: function(xhr, status, error) {
        console.error(error);
    }
});

上面的代码将获取 ID 为 1 的文章和页面的数据。注意,为了简洁起见,这里我们直接返回了整个文章或页面的内容,你可以根据需要对返回数据进行调整。


扫描二维码,在手机上阅读!