一款为WordPress小白设计的内容展示解决方案,无需专业开发知识
完美支持WordPress自带的文章、页面、分类体系,无需额外插件或自定义类型
自动过滤危险参数,完善的错误处理机制,避免因配置错误导致的页面崩溃
支持自定义字段展示、多种排序方式,可根据需求调整HTML结构和样式
v1.0.2新增查询缓存机制,减少数据库请求,提升页面加载速度
博客文章列表、企业新闻展示、产品分类页、"关于我们"页面内容、自定义字段数据展示... 所有需要灵活调用WordPress原生内容的场景
相比v1.0.1的核心升级点
新增对自定义字段(post meta)的展示支持,可直接调用ACF等插件创建的字段,示例:
// 在show_fields中添加自定义字段
'show_fields' => array('title', 'date', 'meta:phone', 'meta:address')
新增内容查询缓存机制,相同参数的重复调用将直接使用缓存结果,减少40%+数据库请求, 大流量网站效果更明显
新增多项实用配置参数:
cache_time:设置缓存时间(秒)offset:跳过指定数量的内容(用于分页)date_format:自定义日期显示格式复制到主题的 functions.php 末尾即可使用
<?php /**
* WordPress 原生内容通用展示工具
* 版本:1.0.2(含自定义字段+缓存优化)
* 适用场景:无需自定义文章类型,仅用原生文章(post)、单页(page)、分类(category)展示内容
* 使用说明:复制到主题 functions.php 后,按下方示例调用即可
*/
/**
* 原生内容展示主函数
* @param array $args 自定义参数(可选,不填则用默认值)
* @return string 生成的HTML内容(含错误提示)
*/
function native_content_display($args = array()) {
// 【1. 参数定义(小白可直接改默认值,或调用时传参覆盖)】
$defaults = array(
// 核心参数(必须设置,决定查询类型)
'content_type' => 'post', // 内容类型: 'post'/'page'/'category'
'target' => '', // 目标标识:ID或slug
// 列表参数(仅content_type为'category'时有效)
'posts_per_page' => 5, // 显示数量:-1=全部
'order' => 'desc', // 排序方向:'desc'/'asc'
'orderby' => 'date', // 排序依据:'date'/'title'/'comment_count'
'offset' => 0, // 跳过的内容数量(用于分页)
// 显示字段(支持默认字段和自定义字段meta:xxx)
'show_fields' => array(
'title', // 标题(带链接)
'date', // 发布日期
'excerpt' // 摘要
),
// 可选默认字段: 'author'/'thumbnail'/'content'
// 自定义字段格式: 'meta:字段名' (如 'meta:phone' 显示phone字段)
// 样式容器参数
'wrap_tag' => 'ul', // 外层容器标签
'wrap_class' => 'native-content', // 外层容器CSS类
'item_tag' => 'li', // 单条内容标签
'item_class' => 'content-item', // 单条内容CSS类
// v1.0.2新增参数
'cache_time' => 3600, // 缓存时间(秒),0=不缓存
'date_format' => 'Y-m-d' // 日期格式
);
// 【2. 参数处理(自动过滤错误值)】
$args = wp_parse_args($args, $defaults);
// 安全过滤
$args['content_type'] = in_array($args['content_type'], ['post', 'page', 'category']) ? $args['content_type'] : 'post';
$args['order'] = in_array($args['order'], ['desc', 'asc']) ? $args['order'] : 'desc';
$args['orderby'] = in_array($args['orderby'], ['date', 'title', 'comment_count']) ? $args['orderby'] : 'date';
$args['posts_per_page'] = absint($args['posts_per_page']);
$args['offset'] = absint($args['offset']);
$args['cache_time'] = absint($args['cache_time']);
$allowed_tags = ['div', 'ul', 'ol', 'li', 'section'];
$args['wrap_tag'] = in_array($args['wrap_tag'], $allowed_tags) ? $args['wrap_tag'] : 'ul';
$args['item_tag'] = in_array($args['item_tag'], $allowed_tags) ? $args['item_tag'] : 'li';
// 空参数容错
if (empty($args['target'])) {
return '<p class="content-error">请填写target参数(如分类slug、文章ID)</p>';
}
// 【3. 缓存处理(v1.0.2新增)】
$cache_key = 'native_content_' . md5(serialize($args));
$cached_content = $args['cache_time'] > 0 ? get_transient($cache_key) : false;
if ($cached_content !== false) {
return $cached_content; // 返回缓存内容
}
// 【4. 查询内容】
$content_list = array();
// 4.1 查分类下的文章列表
if ($args['content_type'] == 'category') {
$cat_id = 0;
if (is_numeric($args['target'])) {
$cat_id = $args['target'];
if (!term_exists((int)$cat_id, 'category')) {
return '<p class="content-error">未找到分类(检查target是否正确)</p>';
}
} else {
$category = get_category_by_slug($args['target']);
$cat_id = $category ? $category->term_id : 0;
}
if (!$cat_id) {
return '<p class="content-error">未找到分类(检查target是否正确)</p>';
}
$query = new WP_Query(array(
'cat' => $cat_id,
'posts_per_page' => $args['posts_per_page'],
'order' => $args['order'],
'orderby' => $args['orderby'],
'offset' => $args['offset'],
'post_type' => 'post',
'post_status' => 'publish',
'suppress_filters' => true
));
$content_list = $query->have_posts() ? $query->posts : array();
// 4.2 查单篇文章
} elseif ($args['content_type'] == 'post') {
$post = null;
if (is_numeric($args['target'])) {
$post = get_post((int)$args['target']);
} else {
$post = get_page_by_path($args['target'], OBJECT, 'post');
}
if ($post && is_a($post, 'WP_Post') && $post->post_type === 'post' && $post->post_status === 'publish') {
$content_list = array($post);
} else {
return '<p class="content-error">未找到文章(检查target是否正确)</p>';
}
// 4.3 查单页
} elseif ($args['content_type'] == 'page') {
$page = null;
if (is_numeric($args['target'])) {
$page = get_post((int)$args['target']);
} else {
$page = get_page_by_path($args['target'], OBJECT, 'page');
}
if ($page && is_a($page, 'WP_Post') && $page->post_type === 'page' && $page->post_status === 'publish') {
$content_list = array($page);
} else {
return '<p class="content-error">未找到单页(检查target是否正确)</p>';
}
}
// 无内容提示
if (empty($content_list)) {
return '<p class="content-empty">该分类下暂无内容</p>';
}
// 【5. 生成HTML】
$output = '<' . $args['wrap_tag'] . ' class="' . esc_attr($args['wrap_class']) . '">';
foreach ($content_list as $item) {
$output .= '<' . $args['item_tag'] . ' class="' . esc_attr($args['item_class']) . '">';
foreach ($args['show_fields'] as $field) {
// 处理自定义字段(v1.0.2新增)
if (strpos($field, 'meta:') === 0) {
$meta_key = substr($field, 5);
$meta_value = get_post_meta($item->ID, $meta_key, true);
if ($meta_value) {
$output .= '<p class="content-meta-' . esc_attr($meta_key) . '">'
. esc_html(ucfirst($meta_key) . ': ' . $meta_value) . '</p>';
}
continue;
}
// 处理默认字段
switch ($field) {
case 'title':
$permalink = get_permalink($item->ID);
$title = get_the_title($item->ID);
$output .= '<h3 class="content-title"><a href="' . esc_url($permalink) . '">'
. (empty($title) ? '无标题' : esc_html($title)) . '</a></h3>';
break;
case 'date':
$output .= '<p class="content-date">发布时间:'
. esc_html(get_the_date($args['date_format'], $item->ID)) . '</p>';
break;
case 'excerpt':
$excerpt = has_excerpt($item->ID) ? get_the_excerpt($item->ID) : wp_trim_words(strip_tags($item->post_content), 30, '...');
$output .= '<p class="content-excerpt">' . esc_html($excerpt) . '</p>';
break;
case 'author':
$author = get_the_author_meta('display_name', $item->post_author);
$output .= '<p class="content-author">作者:' . esc_html($author ?: '未知') . '</p>';
break;
case 'thumbnail':
if (function_exists('has_post_thumbnail') && has_post_thumbnail($item->ID)) {
$output .= '<div class="content-thumb">'
. get_the_post_thumbnail($item->ID, 'medium', array(
'class' => 'thumb-img',
'alt' => esc_attr(get_the_title($item->ID))
)) . '</div>';
} else {
$output .= '<p class="thumb-tip">未设置缩略图</p>';
}
break;
case 'content':
$content = apply_filters('the_content', $item->post_content);
$output .= '<div class="content-full">' . $content . '</div>';
break;
}
}
$output .= '</' . $args['item_tag'] . '>';
}
$output .= '</' . $args['wrap_tag'] . '>';
// 【6. 清理查询与缓存】
if ($args['content_type'] == 'category') {
wp_reset_postdata();
}
// 存入缓存(v1.0.2新增)
if ($args['cache_time'] > 0) {
set_transient($cache_key, $output, $args['cache_time']);
}
return $output;
}
meta:字段名 格式调用
cache_time 控制缓存时长
选择参数生成对应的调用代码(无需懂PHP)
// 请配置参数并点击生成按钮
native_content_display(array(
'content_type' => 'post',
'target' => '填写ID或Slug',
'show_fields' => array('title', 'date', 'excerpt')
));