Mitgliederstatus mit pmpro und wp-discourse aktualisieren

Ich habe sowohl das Discourse-Plugin als auch das Paid Memberships Pro (PMPro)-Plugin sowie das PMPro-Zapier-Add-on verwendet. Ich versuche, das Mitgliedschaftslevel eines Benutzers an Discourse zu aktualisieren.

Ich erwarte, dass sich das Mitgliedschaftslevel, wenn ich es über das wp-admin-Interface eines Benutzers ändere, automatisch im Admin-Bereich der Benutzerverwaltung meiner Discourse-Site aktualisiert.

Was muss ich tun, um dies zu erreichen? Geben Sie mir bitte einige Hinweise dazu.

Du musst eine Aktion zu deiner functions.php hinzufügen

/* Siehe Beispiel unter http://hookr.io/actions/pmpro_after_change_membership_level/ */
do_action( 'pmpro_after_change_membership_level', $level_id, $user_id, $cancel_level );
function action_pmpro_after_change_membership_level( $level_id, $user_id, $cancel_level ) {

 . . . . Code, der die Mitgliedschaftsstufe und die Gruppe abruft und sie zur Gruppe hinzufügt

}

Kannst du mir bitte erklären, wie ich die Werte für $level_id, $user_id, $cancel_level und den Gruppennamen für den aktualisierten Benutzer abrufen kann?

Ich habe auf die Dokumentation verlinkt. Ich gehe davon aus, dass sie über den Action-Hook übergeben werden.

Hi Jay, danke für deine Antwort. Es hat bei mir funktioniert, aber der alte Wert ist noch vorhanden. Das heißt, ich habe sowohl den neuen als auch den alten Mitgliedschaftslevel-Wert. Hast du eine Idee, wie man den alten Wert des Mitgliedschaftslevels entfernen kann?

Ich verwende Folgendes:

DiscourseUtilities::remove_user_from_discourse_group( $user_id, $group_name );

Das ist meine Entfernen-Funktion:

function dcpmp_remove_member_from_group( $level_id, $user_id, $cancel_level ) {
    if ( ! empty( $cancel_level ) ) {
        $group_name = dcpmp_get_level_for_id( $cancel_level );
        if ( is_wp_error( $group_name ) ) {

            return null;
        }

        // Entfernt den Benutzer.
        $result = DiscourseUtilities::remove_user_from_discourse_group( $user_id, $group_name );
        if ( ! empty( $result->success ) ) {
           // Entfernt den Metadaten-Schlüssel für den Mitgliedschaftslevel.
            delete_user_meta( $user_id, "dcpmp_group_{$group_name}" );
        }

        return $result;
    }

    return null;
}

Ich glaube, es gibt eine Funktion in wp-discourse, mit der man jemanden aus einer Gruppe entfernen kann.

Dies ist dieselbe Funktion, die von [Simon Cossar] (https://meta.discourse.org/u/Simon_Cossar)team verwendet wird. Siehe diesen Link:

Manage group membership in Discourse with WP Discourse SSO

Ich habe dieselbe Funktion verwendet. Bitte helfe mir. Ich habe den Code ebenfalls oben gepostet.
Dies ist mein aktualisierter Code für die Mitgliedschaftsstufe:
function action_pmpro_after_change_membership_level( $level_id, $user_id, $cancel_level ) {

	$group_name = dcpmp_get_level_for_id( $level_id );
	if ( is_wp_error( $group_name ) ) {

		return null;
	}
	$groupname = DiscourseUtilities::get_discourse_user( $user_id, false );

	// Entfernt den Benutzer.
    $result = DiscourseUtilities::remove_user_from_discourse_group( $user_id, $groupname );
    if ( ! empty( $result->success ) ) {
       // Entfernt den Metadaten-Schlüssel für die Mitgliedschaftsstufe.
        delete_user_meta( $user_id, "dcpmp_group_{$groupname}" );
    }
    
    $result1 = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );

    if ( ! empty( $result1->success ) ) {

        // Wenn der Benutzer zur Gruppe hinzugefügt wurde, fügt ein Metadaten-Schlüssel/Wert-Paar hinzu, das später verwendet werden kann.
        add_user_meta( $user_id, "dcpmp_group_{$group_name}", 1, true );
    }

return $result;
return $result1;

}
add_action( ‘pmpro_after_change_membership_level’, ‘action_pmpro_after_change_membership_level’, 10, 3 );

Ich bin mir nicht sicher, was diese Zeile in deinem Code bewirkt:

$groupname = DiscourseUtilities::get_discourse_user( $user_id, false );

Dadurch wird $groupname auf ein Discourse-Benutzerobjekt gesetzt. Ich denke, du musst diese Zeile entfernen und stattdessen die Variable $group_name verwenden, die du in der ersten Zeile deines Codes setzt.

Ich habe das schon einmal verwendet, aber es funktioniert nicht. Bitte geben Sie mir eine Lösung.

Wenn Sie möchten, dass wir Ihnen eine Lösung anbieten, müssen Sie uns bezahlen. Melden Sie sich für einen Hosting-Plan an unter https://discourse.org/buy