搜索全站
安装部署 9 分钟阅读

WordPress 黄页商家目录站搭建:商家 CPT、付费入驻与排序规则

目录站赚的是"排序"的钱。本文讲清商家 CPT 设计、付费套餐入驻流程、置顶与权重排序的实现逻辑,以及收录与反垃圾的平衡,附排序代码。

U
UFO_PF 2023-03-20 · 阅读 9 分钟
Wo 安装部署
阅读提示
本文约 3,436 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:商家入驻了三百家,列表页却像一锅粥

做本地黄页、行业供应商目录、服务商榜单这类站点,早期最容易犯的错是把所有商家一视同仁地按时间倒序排列。结果付费入驻的商家发现自己花了钱,位置却被后来免费入驻的挤下去,第二年全部不续费。而免费商家也抱怨:明明评分更高,却排在一条信息都不全的商家后面。

目录站的商业模式本质上就是卖”曝光位置”。它的技术核心不是列表展示,而是排序规则的透明与可控:付费等级、距离、评分、完善度、更新时间,这几个因子怎么加权,直接决定了商家是否愿意付费、用户是否找得到好商家。

原理分析:排序因子的加权模型

因子 来源 权重建议 说明
付费等级 套餐 meta 最高 决定基础档位
评分 评价聚合 高 保证质量导向
距离 经纬度计算 中(本地站) 需地理查询
完善度 字段填充率 低 抑制空壳条目
更新时间 时间戳 低 抑制死条目

实现上不必一上来就做复杂打分。推荐的分层做法是:先用付费等级做主排序(meta 数值),再用评分做次级排序,最后用日期兜底。这个结构用 pre_get_posts 改 orderby 就能实现,简单可靠,后续要加距离排序再扩展。

需要说明的是:付费置顶如果完全压过质量因子,用户会越来越不信任列表(因为看到的都是花钱的),长期反而伤害站点价值。合理的做法是付费只决定”档位”,档位内按评分排序。

保姆级实操

步骤 1:选目录框架

需要完整的入驻、套餐、评价、消息体系,用 GeoDirectory 或 HivePress;轻量方案用 Business Directory Plugin;如果你的目录本质是” listings + 付费发布”,也可以直接用 WP Job Manager 配 WC Paid Listings 扩展(用 WooCommerce 卖套餐)。选择标准是:要不要地图、要不要商家后台。

步骤 2:商家条目字段设计

必备字段:名称、分类(用分类法,便于生成 /category/region/ 这类 URL)、电话、地址、经纬度、简介、图集、套餐等级(plan_level,数值型 0/1/2/3)、评分(rating_avg,数值型)。套餐等级和评分都要存成数值,排序才有效。

步骤 3:付费入驻流程

用 WooCommerce 建三个虚拟商品作为套餐(免费 / 标准 / 尊享),购买后把等级写入商家条目。用 WC Paid Listings 或自己挂订单完成钩子写入:

add_action( 'woocommerce_order_status_completed', function ( $order_id ) {
    $order = wc_get_order( $order_id );
    foreach ( $order->get_items() as $item ) {
        $listing_id = (int) $item->get_meta( '_listing_id' );
        if ( ! $listing_id ) {
            continue;
        }
        $level = 1; // 根据商品 ID 映射:免费=0 标准=1 尊享=2
        update_post_meta( $listing_id, 'plan_level', $level );
        update_post_meta( $listing_id, 'plan_expire', time() + 365 * DAY_IN_SECONDS );
    }
} );

步骤 4:用 pre_get_posts 实现分层排序

add_action( 'pre_get_posts', function ( $q ) {
    if ( is_admin() || ! $q->is_main_query() ) {
        return;
    }
    if ( ! is_post_type_archive( 'business' ) && ! is_tax( 'business_cat' ) ) {
        return;
    }
    $q->set( 'meta_query', array(
        'relation'    => 'AND',
        'plan_clause' => array( 'key' => 'plan_level', 'compare' => 'EXISTS', 'type' => 'NUMERIC' ),
        'rate_clause' => array( 'key' => 'rating_avg', 'compare' => 'EXISTS', 'type' => 'NUMERIC' ),
    ) );
    $q->set( 'orderby', array(
        'plan_clause' => 'DESC',
        'rate_clause' => 'DESC',
        'date'        => 'DESC',
    ) );
} );

WordPress 4.2 起支持命名子句(named clause)排序,这是实现多字段加权排序最干净的方式。

步骤 5:套餐到期自动降级

写一个每日跑的任务检查 plan_expire,过期则把 plan_level 改回 0。不要用 WP-Cron(依赖访问触发),低流量站点会漏跑,应该用服务器 crontab 调 WP-CLI:

# 每天凌晨检查套餐到期并降级
0 3 * * * /usr/bin/wp --path=/var/www/example.com eval 'mf_downgrade_expired_plans();' --allow-root

步骤 6:反垃圾与内容质量

目录站是垃圾外链的重灾区。三条必做:前台入驻必须审核后发布;简介字段设最少字数校验;联系方式字段做重复检测(同一电话出现超过 2 次直接转待审)。

步骤 7:让优质条目有独立 SEO 价值

每个商家一个独立 URL,含结构化数据(LocalBusiness)、图集、评价。分类页 + 地区页组合成 /electrician/beijing-chaoyang/ 这类落地页,是目录站长尾流量的主要来源。

常见踩坑

  1. 排序只看付费等级:用户看到的都是广告,列表失去价值,流量和复访持续下滑。
  2. 套餐等级存成字符串:"premium" 无法排序,必须存数字。
  3. pre_get_posts 忘了判断 is_main_query():会把后台列表、小工具的查询也改掉,出现各种诡异排序。
  4. 用 WP-Cron 跑到期检查:低流量站点半夜没人访问,任务延迟一整天,已过期商家仍在享受置顶。
  5. 地区 × 分类组合页无限生成:会产生海量空页面拖累收录,必须限制”有结果才生成”。
  6. 案例:某装修服务商目录的”续费崩塌”:第一年 180 家付费入驻,按发布时间排序,先入驻的排最后,续费率只有 23%。第二年改成”套餐等级 + 评分”的分层排序,并把排序规则写在商家后台的显眼位置,续费率回升到 61%。
  7. 评价系统完全开放:刷分严重,评分因子失去意义,应限制为”已下单用户可评”或做手机号验证。

总结

目录站是否健康,看三个数字:付费商家的续费率(健康值 >50%)、列表页的跳出率(越低说明排序越准)、入驻审核通过率(过低说明表单体验差,过高说明反垃圾失效)。行动清单:先把套餐等级与评分设计成数值字段,再用命名子句 meta_query 实现”等级主序 + 评分次序”的分层排序,然后接 WooCommerce 售卖套餐并在订单完成时写入等级,最后用真实 crontab 做到期降级并把排序规则对商家公开透明。排序规则透明,商家才愿意为位置付费。商家信息与地图部分可参考 本地服务类站点搭建,多条目的结构化展示思路与 房产租赁站房源管理 相通。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。