栏目API接口概述
织梦CMS本身没有内置的RESTful API,但在小程序开发、APP对接、前后端分离等场景中,为栏目提供API接口是常见需求。通过编写简单的PHP接口脚本,可以将栏目数据以JSON格式输出供外部调用。
一、获取栏目列表API
<?php
// api/category_list.php
require_once(dirname(__FILE__)."/../include/common.inc.php");
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$reid=isset($_GET['reid']) ? intval($_GET['reid']) : 0;
$sql="SELECT id,typename,typedir,description,seotitle,
reid,ispart,ishidden
FROM dede_arctype
WHERE reid={$reid} AND ishidden=0
ORDER BY sortrank ASC";
$dsql->SetQuery($sql);
$dsql->Execute();
$categories=array();
while($row=$dsql->GetArray()){
$categories[]=array(
'id'=> intval($row['id']),
'name'=> $row['typename'],
'url'=> $GLOBALS['cfg_basehost'].str_replace('{cmspath}',
$GLOBALS['cfg_cmspath'], $row['typedir']),
'description'=> $row['description'],
'parent_id'=> intval($row['reid']),
'has_children'=> $row['reid'] > 0 ? false : true
);
}
echo json_encode([
'code'=> 200,
'data'=> $categories,
'total'=> count($categories)
], JSON_UNESCAPED_UNICODE);
?>
二、获取栏目文章列表API
<?php
// api/article_list.php
require_once(dirname(__FILE__)."/../include/common.inc.php");
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
$typeid=isset($_GET['typeid']) ? intval($_GET['typeid']) : 0;
$page=isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$pagesize=isset($_GET['pagesize']) ? min(50, intval($_GET['pagesize'])) : 20;
$offset=($page - 1) * $pagesize;
// 获取总数
$totalRow=$dsql->GetOne("SELECT COUNT(*) as c FROM dede_archives
WHERE typeid={$typeid} AND arcrank=0");
$total=$totalRow['c'];
// 获取文章列表
$sql="SELECT a.id,a.title,a.description,a.litpic,a.pubdate,
a.click,a.writer,ad.body
FROM dede_archives a
LEFT JOIN dede_addonarticle ad ON a.id=ad.aid
WHERE a.typeid={$typeid} AND a.arcrank=0
ORDER BY a.pubdate DESC
LIMIT {$offset},{$pagesize}";
$dsql->SetQuery($sql);
$dsql->Execute();
$articles=array();
while($row=$dsql->GetArray()){
$articles[]=array(
'id'=> intval($row['id']),
'title'=> $row['title'],
'description'=> $row['description'],
'content'=> $row['body'],
'thumbnail'=> $GLOBALS['cfg_basehost'].$row['litpic'],
'author'=> $row['writer'],
'views'=> intval($row['click']),
'pubdate'=> date('Y-m-d H:i:s', $row['pubdate'])
);
}
echo json_encode([
'code'=> 200,
'data'=> $articles,
'page'=> $page,
'pagesize'=> $pagesize,
'total'=> $total,
'total_pages'=> ceil($total / $pagesize)
], JSON_UNESCAPED_UNICODE);
?>
三、栏目树形结构API
<?php
// api/category_tree.php - 返回完整的栏目树
function buildTree($reid=0){
global $dsql;
$sql="SELECT id,typename,typedir FROM dede_arctype
WHERE reid={$reid} AND ishidden=0 ORDER BY sortrank";
$dsql->SetQuery($sql);
$dsql->Execute();
$tree=array();
while($row=$dsql->GetArray()){
$children=buildTree($row['id']);
$tree[]=array(
'id'=> intval($row['id']),
'name'=> $row['typename'],
'url'=> $GLOBALS['cfg_basehost'].$row['typedir'],
'children'=> $children
);
}
return $tree;
}
echo json_encode([
'code'=> 200,
'data'=> buildTree(0)
], JSON_UNESCAPED_UNICODE);
?>
四、API接口调用示例
// JavaScript前端调用示例
fetch('/api/article_list.php?typeid=3&page=1&pagesize=10')
.then(res=> res.json())
.then(data=> {
if(data.code===200){
data.data.forEach(article=> {
console.log(article.title, article.pubdate);
});
}
});
// 小程序中调用示例
wx.request({
url: 'https://yourdomain.com/api/article_list.php',
data: { typeid: 3, page: 1, pagesize: 10 },
success: (res)=> {
if(res.data.code===200){
this.setData({ articles: res.data.data });
}
}
});
安全建议:API接口应添加访问频率限制(Rate Limit)和Token验证,防止被恶意调用导致服务器负载过高。同时通过
Access-Control-Allow-Origin 头限制允许跨域访问的域名白名单。