define('IN_PHPMPS', true); require dirname(__FILE__) . '/include/common.php'; // ========== 数据获取 ========== // 1. SEO 信息 $seo = array( 'title' => $CFG['webname'] . ' - 新加坡华人分类信息平台|房屋出租·招聘求职·二手买卖', 'keywords' => '新加坡分类信息,新加坡房屋出租,新加坡二手交易,新加坡招聘求职,新加坡华人社区,新加坡生活服务', 'description' => $CFG['webname'] . '是面向新加坡华人社区的免费分类信息平台,提供房屋出租、二手买卖、招聘求职、生活服务、商业服务等分类信息发布与搜索。每日更新,真实可靠,华人首选。', // 首页 canonical 永远指向纯首页(areaid 筛选页不应被单独收录) 'canonical' => rtrim($CFG['weburl'], '/') . '/index.php', ); // 1.5 地区分组数据(三级地理路由) $area_groups = get_area_groups(); // 地区筛选参数 $areaid = isset($_REQUEST['areaid']) ? intval($_REQUEST['areaid']) : 0; // 排序参数(白名单校验) $order = isset($_REQUEST['order']) ? trim($_REQUEST['order']) : 'new'; if (!in_array($order, array('new', 'hot', 'recommend'))) { $order = 'new'; } // 分页参数 $page = max(1, intval($_GET['page'] ?? 1)); $page_size = 30; $page_start = ($page - 1) * $page_size; // 2. 分类数据(带信息数量,包括子分类,按地区筛选) $category_count_sql = $areaid > 0 ? "AND areaid = $areaid" : ""; $categories = $db->getAll(" SELECT c.catid, c.catname, c.parentid, c.catorder, (SELECT COUNT(*) FROM {$table}info i LEFT JOIN {$table}category subc ON i.catid=subc.catid WHERE (i.catid=c.catid OR subc.parentid=c.catid) AND i.is_check=1 {$category_count_sql}) as info_count FROM {$table}category c WHERE c.parentid=0 ORDER BY c.catorder "); // 3. 热门分类(取前6个带信息的) $hot_categories = array_slice(array_filter($categories, function($c) { return $c['info_count'] > 0; }), 0, 6); // 4. 主信息流(根据 order 参数切换排序策略) $area_sql = $areaid > 0 ? " AND i.areaid = $areaid" : ""; $base_fields = "i.id, i.title, i.thumb, i.postdate, i.click, i.catid, i.areaid, i.userid, i.content, COALESCE(m.identity_tag, 'personal') as identity_tag, c.catname, a.areaname, CASE WHEN i.thumb != '' THEN 1 ELSE 0 END as has_thumb, CASE WHEN i.userid > 0 THEN 1 ELSE 0 END as is_member, COALESCE(m.suspicious_flag, 0) as suspicious_flag, COALESCE(m.suspicious_count, 0) as suspicious_count, m.certified_expire_at"; $base_join = "FROM {$table}info i LEFT JOIN {$table}category c ON i.catid=c.catid LEFT JOIN {$table}area a ON i.areaid=a.areaid LEFT JOIN {$table}member m ON i.userid=m.userid WHERE i.is_check=1 AND (i.enddate=0 OR i.enddate>=".time()."){$area_sql}"; switch ($order) { case 'hot': // 热门:按点击量倒序 $total_count = $db->getOne("SELECT COUNT(*) {$base_join}"); $new_infos = $db->getAll("SELECT {$base_fields} {$base_join} ORDER BY i.click DESC, i.postdate DESC LIMIT {$page_start}, {$page_size}"); break; case 'recommend': // 推荐:is_pro 优先,不足则用热门综合排序补足,永不空列表 $pro_infos = $db->getAll("SELECT {$base_fields} {$base_join} AND i.is_pro >= ".time()." ORDER BY (CASE WHEN i.is_top >= UNIX_TIMESTAMP() AND (i.enddate = 0 OR i.enddate >= UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) DESC, i.postdate DESC, (CASE WHEN i.postarea != '' AND i.postarea IS NOT NULL THEN 1 ELSE 0 END) DESC LIMIT {$page_start}, {$page_size}"); $pro_count = count($pro_infos); if ($pro_count < $page_size) { // 补足到 page_size 条:按点击量 + 置顶 + 有地区描述综合排序 $exclude_ids = array_column($pro_infos, 'id'); $exclude_sql = !empty($exclude_ids) ? " AND i.id NOT IN (" . implode(',', $exclude_ids) . ")" : ""; $need = $page_size - $pro_count; $supplement = $db->getAll("SELECT {$base_fields} {$base_join} AND i.is_pro < ".time()." {$exclude_sql} ORDER BY i.click DESC, (CASE WHEN i.is_top >= UNIX_TIMESTAMP() AND (i.enddate = 0 OR i.enddate >= UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) DESC, i.postdate DESC, (CASE WHEN i.postarea != '' AND i.postarea IS NOT NULL THEN 1 ELSE 0 END) DESC LIMIT {$need}"); $new_infos = array_merge($pro_infos, $supplement); } else { $new_infos = $pro_infos; } $total_count = $db->getOne("SELECT COUNT(*) {$base_join}"); break; case 'new': default: $total_count = $db->getOne("SELECT COUNT(*) {$base_join}"); $new_infos = $db->getAll("SELECT {$base_fields} {$base_join} ORDER BY (CASE WHEN i.is_top >= UNIX_TIMESTAMP() AND (i.enddate = 0 OR i.enddate >= UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) DESC, i.postdate DESC, (CASE WHEN i.postarea != '' AND i.postarea IS NOT NULL THEN 1 ELSE 0 END) DESC LIMIT {$page_start}, {$page_size}"); break; } // 5. 推荐信息(认证商家,包含身份标签) $recommend_infos = $db->getAll(" SELECT i.id, i.title, i.thumb, i.postdate, i.click, i.catid, i.areaid, i.userid, i.content, i.identity_tag, c.catname, a.areaname, CASE WHEN i.userid > 0 THEN 1 ELSE 0 END as is_member, COALESCE(m.suspicious_flag, 0) as suspicious_flag FROM {$table}info i LEFT JOIN {$table}category c ON i.catid=c.catid LEFT JOIN {$table}area a ON i.areaid=a.areaid LEFT JOIN {$table}member m ON i.userid=m.userid WHERE i.is_check=1 AND i.is_pro>= ".time()." ORDER BY (CASE WHEN i.is_top >= UNIX_TIMESTAMP() AND (i.enddate = 0 OR i.enddate >= UNIX_TIMESTAMP()) THEN 1 ELSE 0 END) DESC, i.postdate DESC, (CASE WHEN i.postarea != '' AND i.postarea IS NOT NULL THEN 1 ELSE 0 END) DESC LIMIT 6 "); // 6. 便民服务 $facilities = get_fac('8'); // 7. 热门地区 $hot_areas = $db->getAll(" SELECT areaid, areaname, (SELECT COUNT(*) FROM {$table}info WHERE areaid=a.areaid AND is_check=1) as info_count FROM {$table}area a WHERE parentid=0 ORDER BY info_count DESC LIMIT 5 "); // 8. 最新资讯 (article表没有is_check字段,改查所有) $articles = $db->getAll(" SELECT id, title, addtime FROM {$table}article ORDER BY addtime DESC LIMIT 5 "); // ========== 数据处理 ========== // 从内容中提取价格和属性的简单函数 function extract_info_meta($content, $catname) { $result = array('price' => '面议', 'tags' => array()); // 尝试从内容中提取价格 (如 S$800, $800, 800元 等) if(preg_match('/(?:价格|售价|租金|月租|转让|卖|租)[^\d\n]{0,10}S?\$?\s*(\d+(?:,\d{3})*)/i', $content, $matches)) { $price_num = str_replace(',', '', $matches[1]); if($price_num > 0 && $price_num < 100000) { $result['price'] = 'S$ ' . $price_num; } } // 根据分类添加默认标签 if(stripos($catname, '房屋') !== false || stripos($catname, '租房') !== false) { $result['tags'][] = '房屋'; } elseif(stripos($catname, '招聘') !== false || stripos($catname, '工作') !== false) { $result['tags'][] = '招聘'; } elseif(stripos($catname, '二手') !== false || stripos($catname, '闲置') !== false) { $result['tags'][] = '二手'; } return $result; } // 处理信息数据 function process_info(&$info) { // 标题截取 $info['title_short'] = cut_str($info['title'], 26); // 发布时间友好显示 $info['postdate_friendly'] = get_time_ago($info['postdate']); $info['postdate'] = date('Y-m-d', $info['postdate']); // URL $info['url'] = url_rewrite('view', array('vid'=>$info['id'])); // 从内容提取价格和标签 $meta = extract_info_meta($info['content'], $info['catname']); $info['price'] = $meta['price']; $info['tags'] = $meta['tags']; // 获取完整地区名称 $info['areaname'] = get_full_areaname($info['areaid']); // 身份标签(默认个人) $info['identity_tag'] = $info['identity_tag'] ?? 'personal'; // 身份标签显示文本 $identity_labels = array( 'personal' => '个人', 'merchant' => '商家', 'agent' => '中介', 'verified' => '认证商家' ); $info['identity_label'] = $identity_labels[$info['identity_tag']] ?? '个人'; // 是否个人标签(用于模板判断) $info['is_person'] = ($info['identity_tag'] == 'personal' || $info['identity_tag'] == 'verified_personal') ? 1 : 0; // 是否疑似商家 $info['is_suspicious'] = !empty($info['suspicious_flag']); // ===== cats-pro: 报纸摘要 + 内联图片缩略图 ===== $raw_content = $info['content'] ?? ''; // 提取第一张 @image 作为缩略图 $info['inline_thumb'] = ''; $info['has_inline_image'] = false; if (preg_match('/@image:([^\s\r\n<]+)/i', $raw_content, $im)) { $img_file = preg_replace('/[^a-zA-Z0-9_\-\.]/', '', $im[1]); if ($img_file) { $thumb_path = 'data/upload/inline/' . $img_file; if (file_exists($thumb_path)) { $info['inline_thumb'] = $thumb_path; $info['has_inline_image'] = true; } } } // 去掉 @image 标记,生成纯文字摘要(80字以内) $excerpt_text = preg_replace('/@image:[^\s\r\n<]+/i', '', $raw_content); $excerpt_text = strip_tags(str_replace(array("\r\n","\n","\r"), ' ', $excerpt_text)); $info['excerpt'] = mb_substr(trim($excerpt_text), 0, 80, 'UTF-8'); } foreach ($new_infos as &$info) { process_info($info); } unset($info); foreach ($recommend_infos as &$info) { process_info($info); } unset($info); // 分类URL处理 foreach ($categories as &$cat) { $cat['url'] = url_rewrite('category', array('cid'=>$cat['catid'])); } unset($cat); // 便民服务URL foreach ($facilities as &$fac) { $fac['url'] = 'bianmin.php'; } unset($fac); // 资讯日期处理 foreach ($articles as &$article) { $article['postdate'] = date('m-d', $article['addtime']); } unset($article); // 如果没有资讯,显示空数组以避免错误 if(empty($articles)) { $articles = array(); } // ========== 模板变量 ========== $hot_categories = !empty($hot_categories) ? $hot_categories : array(); $hot_areas = !empty($hot_areas) ? $hot_areas : array(); // 生成分页器 $base_params = array('order' => $order); if ($areaid > 0) $base_params['eid'] = $areaid; $base_query = http_build_query($base_params); $pager = get_pager('index.php', $base_params, $total_count, $page, $page_size); $page_count = intval(ceil($total_count / $page_size)); $has_pagination = $total_count > $page_size; // 构建分页 HTML(直接渲染,不依赖模板组件的 url_rewrite) $pages = ''; if ($has_pagination) { $pages = ''; } // 加载更多参数(供 JS 使用) $loadmore_params = json_encode(array('order' => $order, 'areaid' => $areaid, 'page_size' => $page_size, 'total' => $total_count), JSON_HEX_TAG | JSON_HEX_APOS); // ===== SEO Title / Description(首页默认 + 地区筛选覆盖 + 分页 noindex)===== if (empty($seo['title'])) { $seo['title'] = $CFG['webname'] . ' - 新加坡华人分类信息平台|免费发布招聘·租房·二手广告'; } if (empty($seo['description'])) { $seo['description'] = $CFG['webname'] . '是新加坡领先的中文分类信息平台,免费发布房屋出租、招聘求职、二手买卖、汽车交易等信息,免登录快速发布,覆盖全岛华人社区。'; } // 第 2 页及以后分页设 noindex if ($page > 1) { $seo['robots'] = 'noindex, follow'; } // 有地区筛选时动态覆盖 SEO if ($areaid > 0) { $area_array_idx = get_area_array(); $filter_areaname = $area_array_idx[$areaid] ?? ''; if (!empty($filter_areaname)) { $seo['title'] = $filter_areaname . '分类信息 - ' . $CFG['webname'] . '|新加坡华人分类信息平台'; $seo['description'] = '浏览新加坡' . $filter_areaname . '地区的最新分类信息,包括房屋出租、招聘求职、二手买卖、生活服务等。' . $CFG['webname'] . '是新加坡华人社区免费信息平台。'; } } // ===== JSON-LD 结构化数据 ===== $_weburl = rtrim($CFG['weburl'], '/'); add_jsonld(array( '@context' => 'https://schema.org', '@type' => 'Organization', 'name' => $CFG['webname'], 'url' => $_weburl, 'description' => '面向新加坡华人社区的免费分类信息平台,提供房屋出租、二手买卖、招聘求职、生活服务、商业服务等分类信息发布与搜索。', 'inLanguage' => 'zh-Hans-SG', ), true); add_jsonld(array( '@context' => 'https://schema.org', '@type' => 'WebSite', 'name' => $CFG['webname'], 'url' => $_weburl, 'potentialAction' => array( '@type' => 'SearchAction', 'target' => $_weburl . '/search.php?keywords={search_term_string}', 'query-input' => 'required name=search_term_string', ), ), true); // FAQPage Schema(首页) add_jsonld(array( '@context' => 'https://schema.org', '@type' => 'FAQPage', 'mainEntity' => array( array( '@type' => 'Question', 'name' => '0065.info 发布广告免费吗?', 'acceptedAnswer' => array( '@type' => 'Answer', 'text' => '是的,0065.info 完全免费发布广告,无需注册登录即可快速发布房屋出租、招聘求职、二手买卖等信息。', ), ), array( '@type' => 'Question', 'name' => '如何在 0065.info 发布信息?', 'acceptedAnswer' => array( '@type' => 'Answer', 'text' => '点击页面顶部的"发布"按钮,填写标题、描述、价格等信息,选择对应的分类和地区后提交即可。免登录发布,三步完成。', ), ), array( '@type' => 'Question', 'name' => '0065.info 覆盖新加坡哪些地区?', 'acceptedAnswer' => array( '@type' => 'Answer', 'text' => '0065.info 覆盖新加坡全岛,包括裕廊东、牛车水、乌节路、榜鹅、淡滨尼等各大区域,可按地区筛选查看本地信息。', ), ), ), ), true); unset($_weburl); // 加载模板 include template('index'); ?>