WP Manifestindependent plugin directory
manifest / users / wp-power-membership

Power Membership | 訂製版本 for elittleworld WP Registry grade D+. High-severity findings · 3 findingsWP RegistryHigh-severity findings · 3 findingsOpen the reportD+

Power Membership 可以設定會員升級需要的累積消費門檻,並針對特定會員等級發放優惠,也改善介面,可輕鬆查看會員的消費總覽。

★ 9stars
381release downloads
≈10active sites
v1.0.7latest · 7mo ago

Install

Download power-membership.zip From the v1.0.7 release on GitHub, Mar 4, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/j7-dev/wp-power-membership/releases/download/v1.0.7/power-membership.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

Power Membership | 讓每個人都可以輕鬆建立會員制網站👌

一句話講完 Power Membership :

Power Membership 可以設定會員升級需要的累積消費門檻,並針對特定會員等級發放優惠,也改善介面,可輕鬆查看會員的消費總覽。




⚡ 主要功能

1. 所有用戶消費數據一覽無遺

使用者列表頁面 新增用戶的消費數據欄位 & 會員等級欄位

⚠ 會員消費數據並非即時,為了性能優化有做 transient 快取,快取時間為 24 小時

image

會員等級篩選器 & 顯示會員等級的使用者有多少數量

⚠ 會員等級的使用者數量並非即時,為了性能優化有做 transient 快取,快取時間為 24 小時

image

2. 更簡潔的會員頁面

揮別預設的 WordPress 會員介面

image

此套件依賴 Gamipress 套件,如果你希望使用 Gamipress 的其他功能,可以關閉 簡易後台 選項

image

3. 累積消費滿額自動升級會員等級

在 會員等級 頁面,可以設定用戶需要 累積消費 到多少金額才可以升級到這個等級

升級判斷邏輯是,當該用戶訂單變為 已完成 、 處理中 時會觸發判斷

image

4. 針對特定會員等級發放折價券

image

image

5. 可以設定首次購買優惠

功能:

  • 用戶必須登入,且為首次購買
  • 可與其他條件並行,ex 消費 500元 且為首購,且必須包含特定商品 以上打9折

例如

  • 針對某商品的首購
  • 針對某會員的首購
  • 針對不同消費級距的首購優惠

image

6. 可以設定購買數量限制

功能:

  • 可以實現 滿XX件打XX折 的優惠
  • 可與其他條件並行,ex 滿 3 件,消費 500元 以上打9折
  • 🚩 限制購買 N 件特定商品功能尚未實現,如果你與 限制商品一起使用,條件會是 "只要購物車含有該特定商品,且總件數達標" 就可以使用優惠

image

7. 結帳頁折價券優化

  1. 會自動顯示可用的折價券,折價金額由大排到小
  2. 如果有多筆可用的折價券,只會顯示一筆最大的折價券
  3. 會顯示後續等級的折價券,讓用戶知道下個等級還差多少金額可以升級,條件金額由小排到大

image

後台自訂選項

  1. 只顯示一張最大張的折價券 - 關閉後,checkout 頁面將顯示所有 "可用" 的折價券
  2. 顯示更高消費門檻的折價券 - 關閉後,checkout 頁面將隱藏所有 "不可用" 的折價券

image




🐞 Bug 回報

請至 ISSUE 描述遭遇的問題,並幫我付上外掛還有 WP 版本資訊

有建議功能的話也可以開 ISSUE




🗺️ 開發 RoadMap

🔲 後台、註冊 新增生日欄位

🔲 後台可以決定訂單什麼狀態才判斷

🔲 讓用戶決定快取的時間

🔲 handle coupon 的 js 還要整理

🔲 tailwindcss 打包後重新 enqueue

🔲 直接用 sql 計算業績,並保存在用戶身上

🔲 My Account 新增會員等級頁

🔲 累積消費金額的時限

🔲 批次調整會員等級

🔲 移除員等級 前端頁面




💻 依賴套件

  1. Gamipress
  2. WooCommerce
  3. WP-Toolkit




⬇️ 安裝方式

請至 release 下載安裝檔案,之後如同一般 WordPress 套件安裝即可

Releases

17 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v1.0.7 latest
Mar 4, 2026 7mo ago
power-membership.zip
8
Oct 25, 2025 12mo ago
power-membership.zip
9
Oct 22, 2025 1 year ago
power-membership.zip
6
Oct 16, 2025 1 year ago
power-membership.zip
2
Mar 4, 2025 1 year ago
power-membership.zip
20
Feb 2, 2024 2 years ago
power-membership.zip
64
Jan 21, 2024 2 years ago
power-membership.zip
202
Jan 21, 2024 2 years ago
power-membership.zip
8
Jan 17, 2024 2 years ago
power-membership.zip
9
Jan 12, 2024 2 years ago
power-membership.zip
7
Jan 11, 2024 2 years ago
power-membership.zip
7
Jan 11, 2024 2 years ago
power-membership.zip
7
Jan 11, 2024 2 years ago
power-membership.zip
7
Jan 10, 2024 2 years ago
power-membership.zip
6
Jan 9, 2024 2 years ago
power-membership.zip
7
Jan 9, 2024 2 years ago
power-membership.zip
7
Jan 8, 2024 2 years ago
power-membership.zip
5

Active-site estimate ≈10 comes from the median of recent superseded releases. Method.

D+ grade

Security

Power Membership | 訂製版本 for elittleworld 1.0.7 · audited by WP Registry

High-severity findings.

3 high
Audited release
1.0.7
Findings
3
Worst severity
high
Content hash
81a372f6e2c970cfad2e9a49…

Findings

  • high Any user who can edit their profile can assign themselves an arbitrary membership rank

    missing_capability

    UserEdit hooks show_user_profile and personal_options_update, so the membership <select name="member_lv"> is rendered on the user's own profile and saved in update_fields. The only gate is current_user_can('edit_user', $user_id). WordPress map_meta_cap allows every logged-in user to edit themselves, so this is not an administrator check. The POST value is written unsanitized into _gamipress_member_lv_rank. MemberDiscount::apply_member_discount reads that meta as a post ID, loads power_membership_discount, and add_fee('會員折扣', -subtotal * percent/100) with no check that the post is member_lv. Coupon View::filter_condition_by_membership_ids also trusts gamipress_get_user_rank_id. A customer (when WooCommerce wp-admin lock is off) or any author/contributor (always has profile.php) can pick the highest published rank, skip the 12-month spend threshold, and receive that rank's cart discount plus membership-only coupons. They can also point the meta at a post they control whose discount meta was set to 100 via the save_post handler (see next finding). Users.php column set_users_column_values echoes get_the_title($member_lv_id) unescaped, so a malicious post title becomes stored XSS in the admin users list. Core profile nonce is present, so this is missing capability, not CSRF.

    inc/classes/Admin/Users/UserEdit.php:21-25,57-79,144-151

    Recommendation

    On show_user_profile hide or disable the rank field; only save it on edit_user_profile_update after current_user_can('edit_users') or manage_woocommerce. absint the post ID and verify get_post_type() === member_lv before update_user_meta. MemberDiscount must reject non-member_lv post IDs. Escape get_the_title() with esc_html in UserColumns.

  • high save_post writes membership discount meta on every post type a user can edit

    missing_capability

    MemberLv\Metabox::save_metabox is hooked to save_post for all post types. After current_user_can('edit_post', $post_id) it always update_post_meta power_membership_threshold and power_membership_discount (0–100), even when those keys are absent from POST (defaults to 0). There is no post_type === member_lv check and no metabox nonce. An author can include power_membership_discount=100 on a normal post save (core update-post nonce they already have). MemberDiscount does not verify the rank post type: once UserEdit (or a crafted profile POST) sets _gamipress_member_lv_rank to that post ID, checkout applies a 100% 會員折扣 fee. The same handler also lets anyone with edit_post stamp discount/threshold meta onto products, pages, or shop_coupon posts. This is the write path for a checkout-pricing key that a generic XSS sweep would treat as admin-only metabox state.

    inc/classes/MemberLv/Metabox.php:34,85-98

    Recommendation

    Return unless $post->post_type is member_lv. Verify a metabox nonce and skip autosave/revisions. Only update meta when the keys are present in POST. MemberDiscount must confirm the ID is a published member_lv rank before applying a fee.

  • high Unsanitized birthday user meta stored and echoed into the admin profile form

    xss_stored

    UserEdit::update_fields writes $_POST['birthday'] to user meta with no sanitize_text_field (unlike FrontEnd\Membership::save_birthday_field on the WooCommerce account form). add_fields echoes it into <input type="date" value="<?php echo $birthday; ?>"> without esc_attr. That is an HTML-attribute breakout on profile.php and user-edit.php. When PowerPlugins simple-admin is enabled, admin-user-edit.js copies the input's outerHTML and assigns it to #your-profile innerHTML, which executes event-handler payloads. A low-privileged user who can save their profile (author/contributor always; customer if wp-admin is not locked) plants the payload; an administrator viewing or editing that user runs it in wp-admin. WooCommerce's date field is not this sink — this plugin's admin profile is.

    inc/classes/Admin/Users/UserEdit.php:110-116,153-155

    Recommendation

    Sanitize with sanitize_text_field (and validate YYYY-MM-DD) on save. Echo with esc_attr. Do not rebuild the profile form with innerHTML of unsanitized field HTML.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.