register_rest_route('nv','front-stage/get-post',{
methods: 'post',
callback(data,req) {
if (!nv_validator(data,{
id: Number,
slug: String,
password: String,
})) {return new NV_Error("参数错误");}
var {id,slug,password} = data;
if ( !(id||slug) ) {
return new NV_Error('参数错误');
}
var post = get_post(id || slug);
if (is_nv_error(post)) {
return post;
}
id = post.id;
slug = post.slug;
//读取这个post对应posttype所注册的所有taxonomy
var post_taxs = get_taxonomies(post.post_type);
var taxonomies = { /*taxonomyName: [term_ids]*/ }
post_taxs.forEach(tax=>{
var terms = nv_get_object_terms(id, tax.taxonomy);
taxonomies[tax.taxonomy] = terms.map(term=>{
delete term.taxonomy;
return term;
})
})
var result = {
require_password: false,
is_preview: false,
...post,
author_name: get_user_by_id(post.author).name || "",
metas: get_post_meta(id),
taxonomies,
}
// 如果文章是未发布状态(不含私有),那么必须是作者本人或者编辑以上才可以预览显示。
if ( ['pending','draft'].includes(post.status) || post.modified_time > Date.now() ) {
var user = get_user_by_nonce(req.headers.nvnonce);
var currentUserPower = user.power || 0;
if ( post.author == user.id || currentUserPower >= 8) {
//预览模式
result.title = `预览:${result.title}`
result.is_preview = true;
} else {
//禁止访问
return new NV_Error('文章禁止访问');
}
}
// 如果文章类型支持密码,那么有密码时必须提供密码才可以访问
var post_type_supports = get_post_type_supports(post.post_type);
if ( post.password.length > 0 && password !== post.password && post_type_supports.includes('password')) {
result.content = null;
result.require_password = true;
} else {
// 前台文章内容过滤器
result.content = apply_filters('get_the_content',result.content,post);
}
delete result.password;
return result;
}
});
register_rest_route('nv','front-stage/get-post-list',{
methods: 'post',
callback(data,req) {
// data就是query的参数
var queried_posts = query_posts({
...data,
status: 'publish',
date_query: {before:Date.now()}
});
//处理数据,增加作者、分类、meta信息
var gotted_users = {};
queried_posts.data.forEach(post=>{
delete post.content;
post.has_password = !!post.password;
delete post.password;
// 读取作者
if ( gotted_users[post.author] == undefined ) {
gotted_users[post.author] = get_user_by_id(post.author).name || "";
}
post.author_name = gotted_users[post.author];
// 读取分类
post.taxonomies = {};
var post_taxs = get_taxonomies(post.post_type);
post_taxs.forEach(tax=>{
post.taxonomies[tax.taxonomy] = nv_get_object_terms(post.id, tax.taxonomy).map(term=>{
delete term.taxonomy;
return term;
});
})
// Meta
post.metas = get_post_meta(post.id)
})
return queried_posts;
}
});
register_rest_route('nv','front-stage/get-comment-list',{
methods: 'post',
callback(data,req) {
if (!nv_validator(data,{
post: Number,
order: String,
current_page: Number,
comments_per_page: Number,
})) {return new NV_Error("参数错误");}
// 前台所有人都可以使用。强制使用树形
const {
post,
order,
current_page,
comments_per_page, // 原则上,对外的每页数量应该由后台设置来控制。因此前端不传这个参数即可
} = data;
var comments = query_comments({
parent: 0,
status: 'publish',
post,
order,
current_page,
comments_per_page, // 原则上,对外的每页数量应该由后台设置来控制。因此前端不传这个参数即可
hierarchical: true,
});
var user_temp = {};
// 如果有父评论,找到父评论的 name
var parentIDs = comments.data.filter(r=>r.parent>0).map(r=>r.parent);
var parentNames = {};
nvdb.comments.find(r=>parentIDs.includes(r.id)).map(cmt=>{
var user_id = cmt.user_id;
if (user_id > 0) {
if (!user_temp[user_id]) {
var {name,url,email,avatar_url} = get_user_by_id(user_id);
user_temp[user_id] = {name,url,email,avatar_url}
}
parentNames[cmt.id] = user_temp[user_id].name || cmt.name;
} else {
parentNames[cmt.id] = cmt.name || '';
}
})
// 评论是站内用户发表时,忽略 name、url、email,数据需要从user_id读出来
// 读出文章标题
var post_temp = {};
comments.data.forEach(cmt=>{
var user_id = cmt.user_id;
// user_id: -1:用户被删除了,但评论保留。 0:非站内用户评论
if (user_id > 0) {
if (!user_temp[user_id]) {
var {name,url,email,avatar_url} = get_user_by_id(user_id);
user_temp[user_id] = {name,url,email,avatar_url}
}
cmt.name = user_temp[user_id].name || cmt.name;
cmt.url = user_temp[user_id].url || cmt.url;
cmt.email = user_temp[user_id].email || cmt.email;
cmt.avatar_url = user_temp[user_id].avatar_url || '';
}
var post_id = cmt.post_id;
if ( !post_temp[post_id] ) {
var {title} = get_post(post_id);
post_temp[post_id] = {title}
}
cmt.post_title = post_temp[post_id].title;
cmt.parent_name = parentNames[cmt.parent] || '';
//前台读取时,部分数据不提供
delete cmt.post_id;
delete cmt.email;
delete cmt.status;
delete cmt.user_id;
delete cmt.ip;
})
return comments;
},
});