PMPRO会员等级角标显示异常求助:仅首页生效,归档页出错
问题分析与解决方案
原代码的核心问题
- 自定义分类/标签无输出:原代码仅调用
wp_get_post_categories和wp_get_post_tags获取默认分类与标签,未处理自定义分类(自定义Taxonomy),导致自定义分类归档页中$post_terms为空,最终查询不到关联的会员等级。 - 分类归档页显示异常:大概率是循环中
$mypost变量未正确更新,导致所有文章复用了第一个文章的查询结果,出现所有文章显示同一等级、错误添加pmpro-has-access类的问题。 - 直接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
相关产品推荐
相关产品推荐

