Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
cf91a77
fix(integrity-check): show hub status for in-sync nodes instead of em…
adekbadek Mar 25, 2026
f85d285
feat(memberships): propagate ownership transfers across the network
adekbadek Mar 25, 2026
765d84b
fix(memberships): address review feedback on transfer logic
adekbadek Mar 25, 2026
6d2e7fe
refactor(integrity-check): add post_modified and membership_id to mem…
adekbadek Mar 25, 2026
7e78753
feat(integrity-check): add managed memberships endpoint for reconcili…
adekbadek Mar 25, 2026
c8121e9
feat(memberships): add reconcile-memberships CLI command
adekbadek Mar 25, 2026
1d14512
test(memberships): add tests for reconcile discrepancy classification
adekbadek Mar 25, 2026
26db0c2
fix(reconcile): guard WP_CLI calls in classify_discrepancies for test…
adekbadek Mar 25, 2026
db2a9fe
refactor(integrity-check): move reconciliation into --fix flag on int…
adekbadek Mar 25, 2026
c1b98f7
feat(integrity-check): detect membership transfers via remote_id cros…
adekbadek Mar 25, 2026
5a48dba
feat(integrity-check): add sync lag check and progress bar for --fix
adekbadek Mar 26, 2026
cda0e25
fix(integrity-check): address review feedback on timestamps, constant…
adekbadek Mar 26, 2026
4634766
fix(integrity-check): harden queries, error handling, and input sanit…
adekbadek Mar 26, 2026
6cce586
feat(integrity-check): fix missing_on_hub discrepancies by pulling fr…
adekbadek Mar 26, 2026
ee2550f
fix(integrity-check): sync lag check should only consider pullable ev…
adekbadek Mar 26, 2026
e6c5139
fix(integrity-check): skip push_to_node when node lacks the membershi…
adekbadek Mar 26, 2026
976ea14
fix(integrity-check): fix linting issues
adekbadek Mar 26, 2026
29552b0
fix(integrity-check): address review feedback
adekbadek Mar 27, 2026
c350b2d
fix(integrity-check): use subscription presence instead of timestamps…
adekbadek Mar 30, 2026
794fbd4
feat(integrity-check): detect circular managed membership links
adekbadek Apr 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 19 additions & 10 deletions includes/class-integrity-check-utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,34 @@ private static function build_membership_query( $start_email = null, $end_email

// phpcs:disable WordPressVIPMinimum.Variables.RestrictedVariables.user_meta__wpdb__users
$query = "
SELECT
SELECT
u.user_email,
p.post_status as status,
pm_network.meta_value as network_id
pm_network.meta_value as network_id,
p.post_modified_gmt as post_modified,
p.ID as membership_id,
CASE WHEN pm_sub.meta_value IS NOT NULL AND pm_sub.meta_value != '' THEN 1 ELSE 0 END as has_subscription
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->users} u ON p.post_author = u.ID
INNER JOIN {$wpdb->postmeta} pm_network ON p.post_parent = pm_network.post_id AND pm_network.meta_key = %s
LEFT JOIN {$wpdb->postmeta} pm_sub ON p.ID = pm_sub.post_id AND pm_sub.meta_key = '_subscription_id'
INNER JOIN (
SELECT
SELECT
p2.post_author,
pm2.meta_value,
MAX(p2.post_date) as max_date
MAX(p2.post_modified_gmt) as max_modified
FROM {$wpdb->posts} p2
INNER JOIN {$wpdb->postmeta} pm2 ON p2.post_parent = pm2.post_id AND pm2.meta_key = %s
WHERE p2.post_type = 'wc_user_membership'
AND p2.post_status != 'trash'
AND pm2.meta_value IS NOT NULL
AND pm2.meta_value != ''
GROUP BY p2.post_author, pm2.meta_value
) latest ON p.post_author = latest.post_author
AND pm_network.meta_value = latest.meta_value
AND p.post_date = latest.max_date
) latest ON p.post_author = latest.post_author
AND pm_network.meta_value = latest.meta_value
AND p.post_modified_gmt = latest.max_modified
WHERE p.post_type = 'wc_user_membership'
AND p.post_status != 'trash'
AND pm_network.meta_value IS NOT NULL
AND pm_network.meta_value != ''";

Expand Down Expand Up @@ -86,9 +92,12 @@ private static function execute_membership_query( $query, $prepare_args, $max_re
$membership_data = [];
foreach ( $results as $result ) {
$membership_data[] = [
'email' => strtolower( $result->user_email ),
'status' => $result->status,
'network_id' => $result->network_id,
'email' => strtolower( $result->user_email ),
'status' => $result->status,
'network_id' => $result->network_id,
'post_modified' => $result->post_modified,
'membership_id' => (int) $result->membership_id,
'has_subscription' => (bool) ( $result->has_subscription ?? false ),
];
}

Expand Down
Loading
Loading