it-swarm.com.de

Wie kann ein Nutzer zulassen, dass sein Beitrag (Anzeige) ein Entwurf ist und dann erneut veröffentlicht wird, ohne dass eine Genehmigung erforderlich ist?

Ich verwende WordPress als Verzeichnis-Site, auf der ein Benutzer einen Beitrag einreichen kann, der zu seiner Anzeige/Auflistung wird. Den Benutzern wird eine benutzerdefinierte WordPress-Rolle zugewiesen.

Posts müssen einmal vom Administrator genehmigt und veröffentlicht werden. Anschließend können sie ihre Posts nach Belieben aktualisieren. Im Moment funktioniert dies einwandfrei, da ich der benutzerdefinierten Rolle keine Veröffentlichungsfunktionen zugewiesen habe.

Ich brauche jedoch auch die Möglichkeit, dass der Benutzer seinen Beitrag vorübergehend offline setzt (Entwurf vielleicht) und ihn veröffentlicht, wann immer er möchte. Derzeit müssen sie ihren Beitrag, wenn sie einen "Entwurf" erstellen, zur erneuten Veröffentlichung zur Überprüfung einreichen - dies ist nicht ideal.

Gibt es einen Ausweg, damit sie ihren Beitrag von published zu draft und dann wieder zurück von draft zu published ändern können, ohne dass eine Genehmigung erforderlich ist?

Oder gebe ich ihnen zunächst Veröffentlichungsmöglichkeiten, aber es gibt ein Plugin, für das der erste Beitrag genehmigt werden muss? (Sie dürfen sowieso nur 1 Beitrag schreiben).

Was ist mit einer benutzerdefinierten Metabox mit einem Kontrollkästchen, das steuert, ob der Beitrag veröffentlicht wird oder nicht? Leider hätte ich keine Ahnung, wo ich mit dieser Art von Funktionalität anfangen soll. Ich benutze WPALchemy jedoch für andere Metaboxen.

1
Andrew

Dank des Vorschlags von Chris, eine Fähigkeit im Handumdrehen zuzuweisen, konnte ich etwas zum Laufen bringen, das jemand anderem helfen könnte. Es gibt vielleicht eine bessere Methode, aber diese funktioniert gut für meine Situation.

Da ich mit einem benutzerdefinierten Beitragstyp listing arbeite, musste ich dem Benutzer den zugeordneten Funktionscode publish_listings zuweisen, jedoch erst, nachdem diese genehmigt wurden. Ich konnte mir dies am besten vorstellen, indem ich eine "Nur-Administrator" -Metabox in die benutzerdefinierten Post-Bildschirme einfügte, die nur Administratoren sehen konnten. Dies wurde mit Hilfe von WPAlchemy und dem output_filter gemacht.

Mit einer Metabox, die jetzt nur ein Administrator sehen konnte, habe ich ein einfaches Kontrollkästchen hinzugefügt. Wenn diese Option aktiviert ist und der Beitrag aktualisiert wird, wird dem Autor des aktuellen Beitrags die Funktion publish_listings hinzugefügt. Da es sich um eine Art Verzeichnis-Site handelt, erlaube ich in meinem Fall nur 1 Beitrag pro Autor, sodass dies recht gut funktioniert. Wenn diese Option deaktiviert und aktualisiert ist, wird die Funktion entfernt. Der Anwendungsfall würde also so aussehen:

  1. Der Nutzer übermittelt den Beitrag zur Genehmigung
  2. Der Administrator überprüft den Beitrag, aktiviert das Kontrollkästchen und veröffentlicht den Beitrag zum ersten Mal
  3. Es steht dem Benutzer nun frei, seinen Beitrag nach Belieben zu aktualisieren, einschließlich der Erstellung eines Entwurfs und der erneuten Veröffentlichung.

Wie ich bereits erwähnt habe, verwende ich WPAlchemy zum Heben schwerer Metaboxen. Daher konnte ich save_filter verwenden, um die Funktion hinzuzufügen, wenn der Beitrag aktualisiert wird.

function save_admin_only( $meta, $post_id ) {
global $post;

//get the author ID of the post we're on
$author_id = $post->post_author;
$id = get_the_author_meta( 'ID' , $author_id );
$user = new WP_User( $id ); //retrieves the user, based on their ID specified above for user with WP_User class

    if($meta['_can_publish'] == 'yes') {    
        $user->add_cap( 'publish_listings' ); //assign capability to this user if checkbox is ticked
    }
    else { $user->remove_cap( 'publish_listings' ); } //otherwise remove the capability so they can not publish

return $meta;
}

Wenn Sie nach einem benutzerdefinierten Post-Typ suchen müssen (sagen wir, Sie hatten mehr als einen), können Sie diesen mit folgendem Zeilenumbruch versehen:

if ( 'other_post_type' == get_post_type() ) {
    ...
}

Dies scheint äußerst hilfreich für andere Szenarien zu sein, in denen Sie keine ganz neue Rolle erstellen möchten, nur um einem Benutzer einige Funktionen zu geben. Wenn jemand das oben genannte verbessern kann, dann bitte tun.

0
Andrew

Ich hatte vor kurzem mit genau dem gleichen Problem zu tun. Ich habe es nicht gelöst, und wir haben beschlossen, dass die Leute, da sie für ihre Einträge einen relativ hohen Betrag zahlen mussten, einen ausreichenden Anreiz erhalten würden, keine schlechten Beiträge zu veröffentlichen. Außerdem wäre es mühsam, jeden einzelnen manuell zu genehmigen - die Leute warten nicht gern einen Tag, um Ergebnisse zu erzielen.

Deshalb haben wir unserem directory_member-Benutzer von Anfang an die Funktionen publish_posts und edit_published_posts zugewiesen. Sie müssen den Zahlungsvorgang durchlaufen, bevor der Beitrag veröffentlicht wird. Sobald sie bezahlt haben, können sie mit ihrer Post alles tun, was sie wollen.

Aber ich hatte eine (seltene) Gehirnwelle, die sich mit Ihrer Frage befasste. Ich denke, wo ich falsch gelaufen bin, gibt es nur eine directory_member Ebene anstatt directory_member und directory_member_approved. Letzterer hätte die Fähigkeit edit_published_posts; Ersteres würde nicht. Es wäre relativ einfach, den Benutzer zu überlisten, wenn ein Administrator den Beitrag zum ersten Mal veröffentlicht.

Die andere Möglichkeit besteht darin, die edit_published_posts-Funktion im Handumdrehen basierend auf einem Benutzer-Metafeld, in admin_init oder irgendwo anders zuzuweisen. Aber irgendwie denke ich, dass die Idee, zwei explizite Ebenen zu haben, besser ist.

Lassen Sie mich wissen, was Sie am Ende tun.

2
Chris Carson