Wenn Sie nicht möchten, dass Personen nach einem bestimmten Zeitraum automatisch aus der Gruppe entfernt werden – also wenn sie lebenslangen Zugang zur Gruppe erwerben und nicht nur einen zeitlich begrenzten oder wiederkehrenden Zugang –, können Sie den Hook woocommerce_payment_complete verwenden und sie beim Kauf zur Gruppe hinzufügen. Sie können auch den SSO-Hook nutzen und ihre Gruppenzugehörigkeiten beim Login aktualisieren.
Danke, Jay!
Von Anfang an werden wir keine Option für lebenslangen Zugang für eine unserer Mitgliedschaftsgruppen anbieten. Die Natur unseres „Mentoren-Marktplatzes
Wenn Sie die neueste Version dieses Codes möchten, finden Sie sie in diesem Repository: GitHub - paviliondev/discourse-woocommerce · GitHub.
Dieser wird in der Produktion verwendet und funktioniert weiterhin wie beschrieben.
Schritte
- Installieren Sie den Code als WordPress-Plugin.
- Aktualisieren Sie die Gruppen- und Plan-IDs.
- Die Synchronisierung erfolgt bei jeder Änderung des Mitgliedschaftsstatus.
Wenn jemand den ursprünglichen Beitrag (OP) wikifizieren könnte, werde ich ihn mit besseren Anweisungen aktualisieren.
Hallo! Ich habe das Plugin „WooCommerce Memberships
Installierst du das Plugin also zuerst im OP?
Ich bin wie du und nutze Wordpress als Anbieter für unser SSO… nicht Discourse (wie im Titel dieses Themas und im OP erwähnt).
Ich weiß, dass der Originalbeitrag (OP) sich auf das Synchronisieren von Gruppen bezieht, wenn Discourse der SSO-Anbieter ist. Aber wäre es nicht sinnvoll, den Titel des Themas zu aktualisieren und auch Anweisungen für die Synchronisierung aufzunehmen, wenn WordPress der SSO-Anbieter ist?
@Ed_Bobkov hat einige Details dazu geliefert, wie man die Synchronisierung mit einem umgekehrten SSO-Anbieter durchführt…
Also nur zur Klarstellung…
Es wäre wirklich großartig und wahrscheinlich langfristig hilfreich für andere, wenn es im OP zwei verschiedene Anweisungssets gäbe:
WooCommerce-Mitgliedschaften mit Discourse-Gruppen synchronisieren, wenn:
- Discourse der SSO-Anbieter ist
- WordPress der SSO-Anbieter ist
Das ist nicht korrekt. Ich nutze Discourse als SSO-Anbieter. Das ändert aber nichts am Kern der Sache.
Hier findest du Themen mit Anleitungen, wenn WP der SSO-Anbieter ist.
Das Wichtigste ist:
- Du kannst deine Gruppenmitgliedschaften, Abonnements und Konditionen in allen Fällen – egal ob WP oder Discourse der SSO-Anbieter ist – mit dem Plugin „WooCommerce Memberships
Dieser Link führt jetzt auf eine 404-Seite. Wurde er verschoben?
Der Eröffnungspost ist jetzt ein Wiki.
Ich habe den Eröffnungspost mit einem Link zur neuesten Version des Codes und den Anweisungen aktualisiert.
Ah, ich hatte vergessen, ihn öffentlich zu machen. Danke.
@jord8on Wie Ed erwähnt, solltest du das offizielle Discourse-Wordpress-Plugin verwenden, wenn Wordpress der SSO-Anbieter ist.
Ich habe ein Problem mit der WooCommerce-Integration mit Discourse.
Wenn ein Benutzer eine bestimmte Mitgliedschaft kauft, wird er automatisch der entsprechenden Gruppe in Discourse zugeordnet.
Dies funktioniert in den meisten Fällen einwandfrei.
Manchmal ist es jedoch nicht automatisiert. Zum Beispiel wurden 8 von 10 Benutzern beim Kauf einer Mitgliedschaft einer bestimmten Discourse-Gruppe zugeordnet, die anderen beiden jedoch nicht. Ich möchte es also für alle Benutzer automatisieren.
Haben Sie Vorschläge, wie ich es vollständig automatisieren kann?
Hallo ![]()
Können Sie mir diese Dinge bitte bestätigen:
- Sie verwenden Discourse als Ihren Discourse Connect Provider (Leute melden sich mit dem Discourse-Login-Formular an, um sich bei WordPress anzumelden)
- Sie verwenden das WP Discourse-Plugin in WordPress
- Sie verwenden den Code, den ich im ersten Beitrag dieses Themas gepostet habe, in WordPress
Stimmt das?
Ihre zweite Option ist richtig, ich verwende ein Discourse-Plugin, und wie ich bereits erwähnt habe, werden meinen Benutzern automatisch bestimmte Gruppen zugewiesen, wenn sie eine bestimmte Mitgliedschaft erwerben.
Alles funktioniert einwandfrei. Nur dass nach ein paar Monaten oder mehr (gelegentlich) dieses Problem auftritt, dass ein zufälliger Benutzer nach dem Kauf einer Mitgliedschaft nicht der entsprechenden Gruppe zugewiesen wird.
Ich möchte dieses gelegentlich auftretende Problem ebenfalls loswerden.
Wenn nur die zweite Option richtig ist, dann funktionieren diese Anweisungen für Sie leider nicht. Alle drei müssen wahr sein. Es scheint, dass Sie eine Synchronisierung haben. Nur damit ich Sie verstehe, haben Sie:
-
Das WP Discourse-Plugin installiert; und
-
Code zum Synchronisieren Ihrer WooCommerce-Gruppen (z. B. wie dieser) ← Haben Sie das hinzugefügt? Könnten Sie mitteilen, was Sie hinzugefügt haben?
Nein, ich glaube, das Plugin hat die gesamte Automatisierung übernommen. Ich erinnere mich nicht, Code zur Integration platziert zu haben.
Möglicherweise ist mein Plugin Version 2.2.3 und veraltet, da das verfügbare Update 2.4.1 ist.
Vielleicht liegt es an dieser Version. Aber ich bin etwas neugierig, ob ein Update meine aktuellen Funktionalitäten beeinträchtigt hat oder nicht.
Um Gruppen zwischen WooCommerce und Discourse zu synchronisieren, benötigen Sie benutzerdefinierten Code. Das WP Discourse-Plugin erledigt dies nicht von selbst. Sie haben höchstwahrscheinlich eine Implementierung der hier beschriebenen Funktionen.
Sie müssen zuerst identifizieren, wie die Synchronisierung erfolgt (es ist nicht nur das WP Discourse-Plugin), bevor ich Ihnen weiterhelfen kann.
Ich habe Code zu meinem WordPress hinzugefügt – den, den @Ed_Bobkov veröffentlicht hat:
<?php
//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“112” => “41”
];
//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', 'Das WP Discourse Plugin wurde nicht richtig konfiguriert.' );
}
$user_info = get_userdata( $user_id );
$user_email = $user_info->user_email;
$logger = wc_get_logger();
$logger->info( sprintf( '%s Mitgliedschaft von %s geändert zu %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( 'Sende %s Anfrage an %s mit %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( 'Antwort von 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', 'Beim Abrufen der Benutzerdaten von Discourse ist ein Fehler aufgetreten.' );
}
}
function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();
$logger->info( sprintf( 'Führe handle_wc_membership_saved aus %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('Führe full_wc_membership_sync aus') );
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('Überprüfe Mitgliedschaft von %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('Aktualisiere Gruppenberechtigung von %s', $user->user_login) );
update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);
$logger->info( sprintf('Warte 5 Sekunden') );
sleep(5);
}
}
}
add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);
Ich habe auch run_full_wc_membership_sync über WP Crontrol hinzugefügt und ausgeführt.
Leider… wird ein WordPress-Benutzer mit aktiver Mitgliedschaft (ID 112) nicht zur Discourse-Gruppe (ID 41) hinzugefügt. Was übersehe ich hier?
Da dies die Leute immer wieder verwirrt, werde ich eine vollständige Anleitung zur WooCommerce-Mitgliedersynchronisierung veröffentlichen (egal ob WordPress oder Discourse der DiscourseConnect-Anbieter ist) :). Schauen Sie hier Anfang nächster Woche vorbei, falls ich Sie noch nicht darauf hingewiesen habe.
Danke! Habe gerade versucht, es herauszufinden… Ich habe sogar ein Plugin GitHub - paviliondev/discourse-woocommerce verwendet, aber auch ohne Erfolg