Gruppen und Kategorien hinzufügen (mit Sicherheit) mit WP-Discourse oder der API?

Wir verwalten eine Mitgliedschaft über unser Wordpress/Woocommerce-System. Wir verwenden Discourse seit ein paar Jahren auf einer Subdomain mit SSO, und es hat großartig funktioniert. Ich habe Code in meiner functions-Datei, der den Gruppenzugriff hinzufügt/entfernt, wenn jemand beitritt/kündigt.

Wir haben eine Funktion in unserer Mitgliedschaft hinzugefügt, bei der Leute einer kleinen Gruppe von 6-8 Personen für wöchentliche Zoom-Anrufe beitreten können.

Um dies zu verwalten, haben wir einen Wordpress-Post-Typ namens „Cohorts“ erstellt, der die wöchentlichen Anrufinformationen enthält, und diese Cohorts dann einem Benutzer über benutzerdefinierte Benutzerfelder zugewiesen.

Hier ist, was ich tun möchte:

  1. Erstellen Sie für jede der Kohorten eine Gruppe.
  2. Erstellen Sie für jede der Kohorten eine Unterkategorie, zu der nur die Gruppe aus Nr. 1 Zugang hat.
  3. Fügen Sie jedes der Mitglieder zu seiner jeweiligen Gruppe hinzu, was ihnen Zugang zu ihrer jeweiligen Unterkategorie für ihre Kohorte verschafft.

Ich weiß, wie man Nr. 3 macht, aber gibt es eine Möglichkeit, Gruppen und Unterkategorien (mit den Sicherheitseinstellungen) programmatisch hinzuzufügen?

Ich kann diese Funktionalität in den WP-Discourse-Dienstprogrammen nicht finden. Auch wenn ich mir die API ansehe, sehe ich, wo Kategorien hinzugefügt werden können, aber nicht die Sicherheitsfunktionen.

Ist das, was ich tun möchte, möglich?

Ja, das ist möglich. Sie können jede API-Anfrage an Discourse von WordPress aus mit der Hilfsmethode discourse_request stellen, d. h.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
$args =  array(
   "body" => "",
   "type" => "post"
);
$response = DiscourseUtilities::discourse_request( $path, $args );

Dies formatiert die Anfrage korrekt und verwendet den API-Schlüssel und den Benutzer, die Sie in den WP Discourse-Einstellungen angegeben haben. Sie benötigen einen globalen Schlüssel für die Aktionen, auf die Sie sich beziehen (wenn Sie denselben Schlüssel auch für die normale WP Discourse-Funktionalität verwenden).

Eine Gruppe erstellen

Der Endpunkt, den Sie benötigen, ist dieser: Discourse API Docs. Es gibt keine vollständige Liste der Parameter in den API-Dokumenten, aber Sie finden sie hier: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Eine Kategorie erstellen

Der Endpunkt, den Sie benötigen, ist dieser: Discourse API Docs. Ebenso finden Sie die vollständige Parameterliste hier: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Beachten Sie, dass die “Sicherheitseinstellungen” über den Parameter permissions gesteuert werden. Sie müssen ihm lediglich ein Objekt mit Gruppennamen als Schlüssel und Berechtigungsstufen als Ganzzahlen als Werte übergeben, z. B.

{
  "cohort1": 2,
  "staff": 1
}

Die Liste der Berechtigungsstufen als Ganzzahlen finden Sie hier: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 „Gefällt mir“

@Angus, vielen Dank! Das war genau das, was ich brauchte!

Ich konnte meine Gruppen erstellen, Benutzer Gruppen zuweisen und die Kategorien mit der richtigen Sicherheit erstellen.

Ich schätze deine Hilfe sehr.

Noch eine Frage… wenn ich versuche, ein PUT auszuführen, um eine Kategorie oder Gruppe zu aktualisieren, erhalte ich diese Fehlermeldung:

Fataler Fehler: Uncaught Error: Call to undefined function wp_remote_put() in […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

Hier ist mein Testcode, der versucht, Kategorie ID 61 mit einem neuen Namen zu aktualisieren:

$path = "/categories/61.json";
$args =  array(
            "type" => "put",
            "body" => array (
                "name" => "Cohorts 1",
            )
        );
$response = DiscourseUtilities::discourse_request( $path, $args )

Was mache ich falsch?

Gibt es hier Ideen? Vielen Dank!

Tut mir leid Tim, ich war die letzten Tage weg. Es sieht so aus, als ob die Methode discourse_request angepasst werden muss, um dies zu unterstützen. Ich werde nächste Woche einen PR dafür erstellen und es wird wahrscheinlich noch eine Woche dauern, bis dieser zusammengeführt wird.

Wenn Sie es früher als das möchten, können Sie die zugrunde liegenden WP-Methoden wie folgt verwenden:

$api_credentials = DiscourseUtilities::get_api_credentials();
if ( is_wp_error( $api_credentials ) ) {
    return $api_credentials;
}

$headers = array(
    'Api-Key'      => sanitize_key( $api_credentials['api_key'] ),
    'Api-Username' => sanitize_text_field( $api_credentials['api_username'] ),
    'Accept'       => 'application/json',
);
$body = array( /* spezifisch für den Endpunkt, den Sie verwenden */ );
$url = /* Die absolute URL für den Endpunkt, den Sie verwenden */ ;

$opts = array(
   'headers' => $headers,
   'body'  => json_encode( $body ),
   'method'  => 'PUT'
);

$result =  wp_remote_request( $url, $opts );

Hallo @timgrahl, könntest du eine funktionierende Funktion für WordPress mit WooCommerce teilen, um Benutzer zu Gruppen hinzuzufügen/zu entfernen?

Ich benutze WooCommerce mit Mitgliedschaften und versuche, dies zum Laufen zu bringen… wenn ein WordPress-Benutzer eine aktive WooCommerce-Mitgliedschaft hat, wird der Benutzer zur Gruppe X hinzugefügt… wenn die Mitgliedschaft gekündigt oder abgelaufen ist, wird der Benutzer aus der Gruppe X entfernt.

Hallo Tom, um Discourse-Gruppen mit WooCommerce-Mitgliedschaften zu synchronisieren, sollten Sie den hier beschriebenen Ansatz verwenden:

Ja, das habe ich gesehen… aber immer noch zu dumm, um dafür einen Code-Schnipsel zu erstellen :confused: