Skip to content
Back to skills

Fluentcart Customers Portal

ASecurity

Implements and audits FluentCart customer identity, WP_User linkage, addresses, ownership checks, account creation, customer-scoped queries, and custom portal endpoints. Use when working with Customer, CustomerResource, getCurrentCustomer(), fct_customers, customer-profile REST routes, fluent_cart_api() customer-dashboard endpoint registration, customer merges or email changes, portal menus, order/subscription ownership, or long-running tests that switch users.

  • 22 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 5, 2026
dataphpshellreactapifrontend

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 5, 2026

npx -y skills add Lonsdale201/wp-agent-skills --skill fluentcart-customers-portal --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Fluentcart Customers Portal?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Fluentcart Customers Portal
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lonsdale201-fluentcart-customers-portal/badge)](https://www.skillsdirectory.com/skills/lonsdale201-fluentcart-customers-portal)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: fluentcart-customers-portal
description: >-
  Implements and audits FluentCart customer identity, WP_User linkage,
  addresses, ownership checks, account creation, customer-scoped queries, and
  custom portal endpoints. Use when working with Customer, CustomerResource,
  getCurrentCustomer(), fct_customers, customer-profile REST routes,
  fluent_cart_api() customer-dashboard endpoint registration, customer merges or email
  changes, portal menus, order/subscription ownership, or long-running tests
  that switch users.
metadata:
  wp-skills-author: "Soczó Kristóf"
  wp-skills-contact: "mailto:lonsdale201@hotmail.com"
  wp-skills-plugin: "fluent-cart"
  wp-skills-plugin-version-tested: "1.6.0"
  wp-skills-wp-version-tested: "7.0.2"
  wp-skills-php-min: "7.4"
  wp-skills-last-updated: "2026-08-06"
---

# FluentCart customers and portal

Treat Customer as the commerce identity and WP_User as an optional login
identity. Enforce ownership for every customer-facing object.

Read [customer-identity.md](references/customer-identity.md) before changing
email/user links, moving resources, or exposing customer data.

## Resolve identity safely

- Customer rows live in fct_customers and may link to WP users by user_id.
- Orders, subscriptions, addresses, licenses, statistics, and labels reference
  Customer IDs, not WP user IDs.
- CustomerResource::getCurrentCustomer() first resolves the logged-in WP user by
  user_id or matching email and may attach that user_id to the existing row.
- Passing true may create a Customer from the current WP user.
- Email matching is a linking operation. Validate verified ownership and
  duplicate/merge consequences before changing an address.

Use Customers/CustomerResource and the normal resource-moving hooks for
coordinated changes. Do not update order and subscription customer_id values
piecemeal.

## Enforce object ownership

CustomerFrontendPolicy only proves that a WP user is logged in. It does not
authorize an arbitrary order, subscription, address, download, or license.

For every custom handler:

1. resolve CustomerResource::getCurrentCustomer();
2. query the requested object with customer_id equal to that customer;
3. reject absent/mismatched objects without revealing whether another customer
   owns them;
4. authorize the requested mutation separately;
5. use FluentCart lifecycle methods for the mutation.

Never authorize solely by UUID, license key, address ID, download ID, or portal
URL.

## Add a portal page

Register at fluent_cart/init or later. Use a unique kebab-case slug that is not
dashboard, purchase-history, subscriptions, licenses, downloads, or profile.

~~~php
fluent_cart_api()->addCustomerDashboardEndpoint('acme-benefits', [
    'title'           => __('Benefits', 'acme-addon'),
    'render_callback' => static function (): void {
        $customer = \FluentCart\Api\Resource\CustomerResource::getCurrentCustomer();
        if (!$customer) {
            return;
        }

        echo '<div>' . esc_html__('Your benefits', 'acme-addon') . '</div>';
    },
]);
~~~

The render callback receives no arguments and echoes content inside the logged-in
portal shell. Escape output and recheck any resource ownership inside it. A
page_id can be supplied instead, but its content must still avoid exposing
unscoped customer data.

## Keep caches request-scoped

CustomerResource caches the current customer statically. Call
resetCurrentCustomerRuntimeCache() between simulated users/requests in PHPUnit,
WP-CLI loops, workers, or multisite switches. Do not let one user's cached
Customer bleed into another iteration.

## Handle account and email changes

- Do not create duplicate WP users merely because an order is paid; core may
  create/link an account according to store/order policy.
- Normalize and validate email, then search both Customer and WP_User collision
  cases.
- Move all connected resources through the normal move/change operation.
- React to fluent_cart/customer_email_changed and
  fluent_cart/customer_resources_moved only after verifying their payload.
- Recount customer statistics after repair/import, not on every read.
- Never include PII in public cache keys, logs, HTML data attributes, or URLs.

## Cross-references

- Use fluentcart-rest-headless for customer-facing endpoints.
- Use fluentcart-orders-transactions for customer order queries.
- Use fluentcart-licensing-pro for Pro license ownership.

## References

- Official customer hooks: <https://dev.fluentcart.com/hooks/actions/customers-users/>
- Verified Free source paths:
  - fluent-cart/app/Models/Customer.php
  - fluent-cart/api/Customers.php
  - fluent-cart/api/Resource/CustomerResource.php
  - fluent-cart/api/Resource/CustomerAddressResource.php
  - fluent-cart/app/Http/Policies/CustomerFrontendPolicy.php
  - fluent-cart/app/Http/Controllers/FrontendControllers/
  - fluent-cart/api/FluentCartGeneralApi.php
  - fluent-cart/app/Hooks/Handlers/ShortCodes/CustomerProfileHandler.php
  - fluent-cart/app/Hooks/Handlers/UserHandler.php

Files in this skill

  • SKILL.md4.9 KB
  • agents/openai.yaml313 B
  • references/customer-identity.md1.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.