Was ist das Problem mit meiner cURL-Anfrage?

Hallo! Ich versuche, eine cURL-Anfrage für meine Wordpress-Website zu schreiben, um Discourse mit Woo-Abonnements zu integrieren. Hier ist meine Funktion, die anscheinend nicht funktioniert. Fehlt etwas?

function execute_discourse_curl_request($subscription) {

    $subscription_status = $subscription->get_status();

    $user_id = $subscription->get_user_id();
    $user = get_user_by('ID', $user_id);
    $username = $user->user_login;

    $request = "";

    if ($subscription_status == 'active') {
        $request = "PUT";
    }

    if ($subscription_status == 'cancelled' || $subscription_status == 'on-hold') {
        $request = "DELETE";
    }

    $api_key = get_option( 'discourse_custom_api_key' );

    $group_id = 41;
    $api_url = 'https://forum.example.com/groups/' . $group_id . '/members.json';
    
    $data = [
        'usernames' => [$username],
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $request,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            "Api-Key: " . $api_key,
            "Api-Username: system",
            "Content-Type: application/json"
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);

    if ($err) {
        $to = 'hello@example.com';
        $subject = 'Error in Discourse User Update cURL Request';
        $message = 'There was an error';
        wp_mail($to, $subject, $message);
    }
}
1 „Gefällt mir“

Hallo,

Welchen Fehler erhalten Sie? Was gibt die Antwort zurück?
Dies sollte helfen, das Problem zu verstehen.

Das Problem ist, dass ich keine Fehlermeldung oder Bestätigung erhalte. Es scheint, dass cURL einfach nicht funktioniert. Ich kann sehen, dass der Discourse API-Schlüssel bei der Ausführung von cURL verwendet wurde, also gibt es einen gewissen Erfolg, aber der Benutzer wird nicht wie beabsichtigt zur Gruppe hinzugefügt oder daraus entfernt. Ich kann jedoch bestätigen, dass die Variablen alle korrekt sind.

Es sollte eine Nutzlast bei Erfolg oder Misserfolg zurückgegeben werden.

Haben Sie den Inhalt von $response überprüft?

Außerdem glaube ich, dass das Format des usernames-Parameters stattdessen ein String sein sollte: “username1,username2,...”.

1 „Gefällt mir“

Wenn ich nichts falsch mache, ist die Anfrage an \"/groups/${group_id}/members.json\" irgendwie unintuitiv. Sie scheint auch nicht dokumentiert zu sein und kann nicht im Netzwerk-Tab des Browsers eingesehen werden, wenn das Discourse-Formular “Benutzer hinzufügen” auf der Gruppenseite abgeschickt wird. Auch hier könnte ich etwas falsch machen.

Auf jeden Fall ist der Pfad für die Anfrage /groups/${group_id}/members.json, wobei die numerische ID der Gruppe für group_id eingesetzt wird. Der Body der Anfrage benötigt einen group_id-Parameter, aber dieser Parameter muss auf den name der Gruppe gesetzt werden. Die Argumente sehen dann etwa so aus:

$group_id = 45;
$group_name = 'publishers';
$args     = array(
    'method' => 'DELETE', // oder 'PUT'
	'body'   => array(
		// 'group_id'  => $group_name, edit: dieser Parameter wird nicht benötigt, ich bin mir nicht sicher, was los war, als ich ihn getestet habe.
		'usernames' => 'sally,Ben',
	)
);

// Pfad:
/groups/${group_id}/members.json

Wenn Sie das WP Discourse-Plugin auf Ihrer WordPress-Site konfiguriert haben, können Sie seine statische discourse_request-Hilfsfunktion verwenden, um die Verwendung von curl zu vermeiden. Beachten Sie, dass ich auf die statische Funktion im plugin-utilities-File verlinkt habe, aber der Namespace, den Sie für externe Anfragen verwenden müssen, stammt von https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php.

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

function zalg_add_users_to_group() {
	$group_id = 45;
    $group_name = 'publishers';
    $method = 'PUT'; // 'PUT' zum Hinzufügen von Benutzern; 'DELETE' zum Entfernen von Benutzern
	$args     = array(
		'method' => $method,
		'body'   => array(
			// 'group_id'  => $group_name, edit: dieser Parameter wird nicht benötigt
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // die Antwort zurückgeben, protokollieren oder verarbeiten
}

Wenn Sie WordPress als SSO-Provider für Discourse verwenden, gibt es eine Hilfsfunktion, mit der Sie einen Benutzer zu einer oder mehreren Gruppen hinzufügen können:

function zalg_sso_add_users_to_group() {
    $user_id = 1; // die WordPress-Benutzer-ID des Benutzers
    $group_names = 'foo,bar,baz'; // ein oder mehrere durch Kommas getrennte Gruppennamen, ohne Leerzeichen nach den Kommas!
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

Um mehrere Benutzer zu einer einzigen Gruppe hinzuzufügen, müssten Sie immer noch die discourse_request-Methode verwenden, die im ersten Codebeispiel enthalten ist.

3 „Gefällt mir“

Die Antwort ist nur ein 500er-Fehler :frowning:

Das ist heroische Hilfe, danke Simon! Das wäre viel einfacher, wenn ich bestehende Hilfsfunktionen im WP Discourse-Plugin nutzen könnte. Ich benutze meine Wordpress-Seite für SSO.

Ich erhalte jedoch immer noch einen kritischen Fehler in meinem Fall, wenn die Funktion ausgelöst wird. Ich bin mir nicht sicher, warum. Was Sie sagen, ist ein wenig über meinen Kopf, aber hier ist, was ich in meiner functions.php verwende:

<?php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

add_action('woocommerce_subscription_status_cancelled', 'zalg_sso_add_users_to_group', 10, 3);

function zalg_sso_add_users_to_group($subscription) {
    $user_id = $subscription->get_user_id();
    $group_names = 'premium';
    DiscourseUtilities::remove_user_to_discourse_group($user_id, $group_names);
}

Ich bin mir nicht sicher, was ich vermisse?

Die Funktion zum Entfernen eines Benutzers aus einer oder mehreren Gruppen heißt remove_user_from_discourse_group, Sie haben sie remove_user_to_discourse_group genannt.

Die Funktionen zum Hinzufügen und Entfernen eines Benutzers aus einer oder mehreren Gruppen finden Sie hier: wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub.

3 „Gefällt mir“

Sie haben Recht! Dummer Fehler. Vielen Dank für Ihre Hilfe, Simon. Ich wünschte, es gäbe einen Spenden-Button. Lassen Sie mich wissen, wenn ich etwas für Sie tun kann. Prost!

1 „Gefällt mir“

Um dies zu erweitern, sind Sie sich bewusst, wo ich Hilfsfunktionen finden könnte, um das Benutzerprofil weiter zu bearbeiten? Es wäre großartig, wenn ich das Benutzerprofilbild und die Biografie einstellen könnte, wenn möglich.

Es gibt eine Hilfsfunktion in der Datei Utilities dafür:

DiscourseUtilities::sync_sso_record( $sso_params );

Gestern habe ich ein Beispiel gepostet, wie man sie benutzt: I cannot add user to the discouse forum from a wordpress website when user added in a membership - #10 by simon. Der knifflige Teil ist die Erstellung des Arrays für das Argument sso_params. Dieses Array muss das Feld external_id enthalten. Es wird auf die WordPress-ID des Benutzers gesetzt:

	$sso_params = array(
		'external_id' => $user_id,
	);

Sie können beliebige Felder aus dieser Liste in die Nutzlast aufnehmen: discourse/lib/discourse_connect_base.rb at 8f52fd1051e20fdff41321c5cff99fda05af86c1 · discourse/discourse · GitHub. Beachten Sie das Array BOOLS, das direkt unter der Liste ACCESSORS angezeigt wird, auf die ich verlinkt habe. Es gibt an, welche der möglichen Optionen booleans (true/false) sind. Bei Anfragen von WordPress müssen boolesche Felder mit den Zeichenketten 'true' oder 'false' und nicht mit den PHP-Werten true oder false gesetzt werden.

Um den Avatar zu aktualisieren, setzen Sie das Feld avatar_url im Array $sso_params und setzen Sie auch das Feld avatar_force_update auf 'true'.

Es gibt ein Feld bio, das zum Festlegen der Biografie verwendet werden kann.

Das WP Discourse-Plugin setzt bereits die Felder bio und avatar_url. Es hat auch eine Einstellung “Force Avatar Update” in seinen SSO-Einstellungen. Das Problem könnte sein, dass diese Einstellungen nur aktualisiert werden, wenn sich ein Benutzer über die WordPress-Website bei Discourse anmeldet. Die Funktion sync_sso_record aktualisiert die Felder sofort, ohne dass sich der Benutzer bei Discourse anmelden muss.

Wenn Sie außerdem feststellen, dass die Biografien der Benutzer nicht wie in Discourse festgelegt werden, könnte es daran liegen, dass sie auf Ihrer WordPress-Website, wo das Plugin sie erwartet, nicht festgelegt werden: wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub. Wenn Woocommerce ein anderes Feld für Biografien hat, könnten Sie auf dieses Feld zugreifen und es in einem Aufruf von sync_sso_record verwenden.

3 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.