# Sync WooCommerce Memberships with Discourse groups

**URL:** https://meta.discourse.org/t/sync-woocommerce-memberships-with-discourse-groups/118485
**Category:** Extras
**Tags:** pavilion
**Created:** [May 23, 2019, 7:13am UTC](https://meta.discourse.org/t/sync-woocommerce-memberships-with-discourse-groups/118485 "2019-05-23T07:13:06Z")
**Posts on this page:** 1
**Showing post:** 19

<div class="post-metadata">

### Author: ![Ed\_Bobkov](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ed_bobkov/32/200014_2.png) [@Ed\_Bobkov](https://meta.discourse.org/u/Ed_Bobkov)
#### Post date: [May 15, 2020, 8:41am UTC](https://meta.discourse.org/t/sync-woocommerce-memberships-with-discourse-groups/118485/19 "2020-05-15T08:41:35Z")

</div>

> [@Ed\_Bobkov](#):
>
> What may cause it?

Solved. May help smbd. I needed to choose ‘At’ in the ‘Next Run’ field and put there a date like 2020-05-10 10:00:00.

Tested syncing - now it is working.

Here is a working solution if you have multiple WooCommerce membership plans and groups in Discourse. You need to change your membership IDs and Discourse Group IDs to yours.

1. WooCommerce membership plans IDs can be found from the url while editing the plan in Wordpress: [https://site/wp-admin/post.php?post=\*\*441\*\*&action=edit](https://site/wp-admin/post.php?post= **441** &action=edit)
2. Discourse Groups IDs can be found here: [https://site/groups/group\_name.json](https://site/groups/group_name.json)

Working code to include in functions.php:

> **Summary**
>
> //wp+discourse  
> use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
> 
> const MEMBERSHIP\_PLAN\_DISCOURSE\_GROUP = [  
> “347” =\> “42”,  
> “357” =\> “43”,  
> “441” =\> “44”  
> ];
> 
> //const ACTIVE\_STATUSES = array( ‘wcm-active’ );  
> const ACTIVE\_STATUSES = array( ‘wcm-active’, ‘wcm-free\_trial’ );
> 
> function update\_discourse\_group\_access( $user\_id, $membership\_plan\_id, $membership\_plan\_name, $status ) {  
> $options = DiscourseUtilities::get\_options();  
> $base\_url = $options[‘url’];  
> $api\_key = $options[‘api-key’];  
> $api\_username = $options[‘publish-username’];
> 
> ```
> if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
> return new \WP_Error( 'discourse_configuration_error', 'The WP Discourse plugin has not been properly configured.' );
> }
> 
> $user_info = get_userdata( $user_id );
> $user_email = $user_info->user_email;
> $logger = wc_get_logger();
> 
> $logger->info( sprintf( '%s membership of %s changed to %s', $user_email, $membership_plan_name, $status ) );
> 
> if ( in_array( $status, ACTIVE_STATUSES ) ) {
> $action = 'PUT';
> } else {
> $action = 'DELETE';
> }
> 
> $external_url = esc_url_raw( $base_url . "/groups/" . MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id] . "/members" );
> 
> $logger->info( sprintf( 'Sending %s request to %s with %s', $action, $external_url, $user_email ) );
> 
> $response = wp_remote_request( $external_url,
> array(
> 'method' => $action,
> 'headers' => array(
> 'Api-Key' => sanitize_key( $api_key ),
> 'Api-Username' => sanitize_text_field( $api_username ),
> ),
> 'body' => array( 'user_emails' => $user_email ),
> )
> );
> 
> $logger->info( sprintf( 'Response from Discourse: %s %s',
> wp_remote_retrieve_response_code( $response ),
> wp_remote_retrieve_response_message( $response ) ) );
> 
> if ( ! DiscourseUtilities::validate( $response ) ) {
> 
> return new \WP_Error( 'discourse_response_error', 'There has been an error in retrieving the user data from Discourse.' );
> }
> 
> ```
> 
> }
> 
> function handle\_wc\_membership\_saved( $membership\_plan, $args ) {  
> $logger = wc\_get\_logger();
> 
> ```
> $logger->info( sprintf( 'Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );
> 
> $user_id = $args['user_id'];
> 
> $membership = wc_memberships_get_user_membership( $args['user_membership_id'] );
> 
> $membership_plan_id = $membership->plan->id;
> 
> if ( $membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
> $membership_plan_name = $membership_plan->name;
> $status = $membership->status;
> update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );
> }
> 
> ```
> 
> }  
> add\_action( ‘wc\_memberships\_user\_membership\_saved’, ‘handle\_wc\_membership\_saved’, 10, 2 );
> 
> /_run\_full\_wc\_membership\_sync_/  
> function full\_wc\_membership\_sync() {  
> $allusers = get\_users();  
> $logger = wc\_get\_logger();
> 
> ```
> $logger->info( sprintf('Running full_wc_membership_sync') );
> 
> foreach ( $allusers as $user ) {
> 
> $user_id = $user->id;
> 
> $membership = wc_memberships_get_user_membership($user_id);
> 
> $membership_plan_id = $membership->plan->id;
> 
> $logger->info( sprintf('Checking membership of %s', $user->user_login) );
> 
> if ($membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
>        
> $membership_plan_name = $membership->plan->name;
>       
> $status = $membership->status;
>       
> $logger->info( sprintf('Updating group access of %s', $user->user_login) );
> 
> update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);
> 
> $logger->info( sprintf('Sleeping for 5 seconds') );
>       
> sleep(5);
> }
> }
> 
> ```
> 
> }
> 
> add\_action(‘run\_full\_wc\_membership\_sync’, ‘full\_wc\_membership\_sync’);

You need to change in the first column - Membership plans ids, 2nd column - Discourse groups ids.

> **Summary**
>
> ```
> "347" => "42",
> "357" => "43",
> "441" => "44"
> 
> ```

---

_[View the full topic](https://meta.discourse.org/t/sync-woocommerce-memberships-with-discourse-groups/118485)._
