东风不来
三月的柳絮不飞

修复DUX主题开启Ajax阅读计数后不展示阅读数量问题

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")}

赞(0) 打赏
未经允许不得转载:文字咖 » 修复DUX主题开启Ajax阅读计数后不展示阅读数量问题

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫