You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PMPRO会员等级角标显示异常求助:仅首页生效,归档页出错

问题分析与解决方案

原代码的核心问题

  1. 自定义分类/标签无输出:原代码仅调用wp_get_post_categories和wp_get_post_tags获取默认分类与标签,未处理自定义分类(自定义Taxonomy),导致自定义分类归档页中$post_terms为空,最终查询不到关联的会员等级。
  2. 分类归档页显示异常:大概率是循环中$mypost变量未正确更新,导致所有文章复用了第一个文章的查询结果,出现所有文章显示同一等级、错误添加pmpro-has-access类的问题。
  3. 直接SQL查询的风险:手动编写SQL容易出现变量污染、安全漏洞,且未兼容PMPro插件的后续更新逻辑。

无需数据库查询的优化方案

Paid Memberships Pro内置了pmpro_get_post_membership_levels()函数,专门用于获取文章/页面关联的会员等级,该函数已处理所有分类类型(含自定义分类)、页面关联等级等场景,无需自行编写数据库查询。

实现代码示例

方法1:通过钩子自动添加到缩略图

使用post_thumbnail_html钩子,在所有输出文章缩略图的位置自动插入会员等级角标,兼容首页、所有归档页:

add_filter('post_thumbnail_html', 'pmpro_add_ribbon_to_thumbnail', 10, 5);
function pmpro_add_ribbon_to_thumbnail($html, $post_id, $post_thumbnail_id, $size, $attr) {
    // 读取主题设置(替换为你实际的选项获取方式)
    $opt = get_option('your_theme_options');
    if (empty($opt['pmpro_ribbon']) || $opt['pmpro_ribbon'] !== 1) {
        return $html;
    }

    // 获取当前文章关联的会员等级
    $membership_levels = pmpro_get_post_membership_levels($post_id);
    if (!empty($membership_levels)) {
        foreach ($membership_levels as $level) {
            $ribbon_html = sprintf(
                '<div class="ribbon-wrapper"><div class="ribbon ribbon-%d">%s</div></div>',
                intval($level->id),
                esc_html($level->name)
            );
            // 将角标添加到缩略图前方
            $html = $ribbon_html . $html;
        }
    }

    return $html;
}

方法2:在模板中直接调用

如果需要手动在归档模板中插入角标,可在文章循环内添加以下代码:

while (have_posts()) : the_post();
    // 检查是否启用角标
    $opt = get_option('your_theme_options');
    if ($opt['pmpro_ribbon'] == 1) {
        $levels = pmpro_get_post_membership_levels(get_the_ID());
        if (!empty($levels)) {
            foreach ($levels as $level) {
                echo sprintf(
                    '<div class="ribbon-wrapper"><div class="ribbon ribbon-%d">%s</div></div>',
                    intval($level->id),
                    esc_html($level->name)
                );
            }
        }
    }
    // 输出缩略图及其他内容
    the_post_thumbnail();
    the_title();
    // ...其他模板代码
endwhile;

关键优势

  • 依赖PMPro官方函数,自动兼容所有分类类型、文章类型,避免自定义SQL的错误。
  • 每次基于当前文章ID获取等级,彻底解决循环中变量污染的问题。
  • 代码简洁,无需维护复杂的数据库查询逻辑,随PMPro插件更新自动适配新功能。

内容的提问来源于stack exchange,提问作者Mario Rossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:20:15