1. 问题描述
最近发现 DUX 主题存在一个 bug,就是当 DUX 主题开启 “Ajax阅读计数” 功能后,对于只有单条记录的文章列表,不显示阅读数量,如下图所示:

2. 修改 functions-theme.php 文件
找到 DUX 主题根目录下的 functions-theme.php 文件,并找到这个文件的 tb_the_postview() 方法,将该方法改成如下:
function tb_the_postview() {
$postid = isset($_GET['postid']) ? trim(htmlspecialchars($_GET['postid'], ENT_QUOTES)) : '';
$current = strstr($postid, ',') ? false : true;
$callback = isset($_GET['callback']) ? trim(htmlspecialchars($_GET['callback'], ENT_QUOTES)) : '';
if ($current) {
$post_views = (int) get_post_meta($postid, 'views', true);
$post_views = $post_views + 1;
if (!update_post_meta($postid, 'views', $post_views)) {
add_post_meta($postid, 'views', 1, true);
}
$post_views = tb_new_views($post_views);
} else {
// 1. 分割字符串为数组
$post_ids_arr = explode(',', $postid);
// 2. 确保每个元素都是正整数,这可以一步完成清理和安全过滤
// array_map('absint', ...) 会将每个数组元素转换为绝对整数。
// 例如 '123' -> 123, 'abc' -> 0, '' -> 0
$post_ids_arr = array_map('absint', $post_ids_arr);
// 3. 移除所有无效或为空的ID(例如由末尾逗号产生的空字符串转换成的0)
// array_filter() 会移除数组中所有等同于false的值(如 0, null, '')
$post_ids_arr = array_filter($post_ids_arr);
// 4. 如果过滤后数组为空,则无需查询数据库
if (empty($post_ids_arr)) {
$post_views = array();
} else {
// 5. 将干净的ID数组重新组合为安全的、用于IN查询的字符串
$postid_safe = implode(',', $post_ids_arr);
global $wpdb;
// 使用清理过的 $postid_safe 变量进行查询
$query = "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'views' AND post_id IN (" . $postid_safe . ")";
$results = $wpdb->get_results($query);
$post_views = array();
foreach ($results as $one) {
$vw = (int) $one->meta_value;
$vw = tb_new_views($vw);
$post_views[$one->post_id] = $vw;
}
}
}
$data = json_encode(array('views' => $post_views));
echo $callback . '(' . $data . ')';
exit;
}
3. 修改 main.js 文件
找到 dux/assets/js 路径下的 main.js ,对下面原始代码进行修改
function s(){var e=[],i=t(".ajaxlistpv[data-id]");i.each((function(){e.push(t(this).data("id"))})),e.length&&t.get(TBUI.ajaxurl,{action:"tb_the_postview",postid:e.toString()},(function(e,a,n){i.each((function(){e.views[t(this).data("id")]&&t(this).html(e.views[t(this).data("id")]).removeAttr("data-id")}))}),"jsonp")}
用下面代码进行替换:
function s(){var e=[],i=t(".ajaxlistpv[data-id]");i.each((function(){e.push(t(this).data("id"))}));e.length&&t.get(TBUI.ajaxurl,{action:"tb_the_postview",postid:1===i.length?e.toString()+",":e.toString()},(function(e,a,n){i.each((function(){e.views[t(this).data("id")]&&t(this).html(e.views[t(this).data("id")]).removeAttr("data-id")}))}),"jsonp")}