织梦cms栏目API接口

栏目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 头限制允许跨域访问的域名白名单。