Wie kann ich verhindern, dass ein Verfasser einen Artikel bearbeiten kann, der geplant wurde?

In dem alten WordPress, das ich hatte, war der Schreiber (ein Typ von Benutzer, der nicht veröffentlichen konnte), nachdem ein Artikel im Zeitplan war, nicht in der Lage, zu dem Artikel zurückzukehren und ihn zu bearbeiten. Aber jetzt in WordPress 8.1 sind sie (die Autoren) in der Lage, zurückzugehen und einen Zeitplanartikel zu bearbeiten. Gibt es eine Möglichkeit, dies zu stoppen?

Verfasser = Mitwirkender

Solutions Collecting From Web of "Wie kann ich verhindern, dass ein Verfasser einen Artikel bearbeiten kann, der geplant wurde?"

Ich, wie @fischi denke, dass Filter 'user_has_cap' ist die beste Wahl für die pourpose, aber ich denke, das ist besser für die Arbeit, unabhängig von der $ _GET Post oder Aktion: WordPress überprüfen die Meta-Cabability auf einer Post-Basis, ein zusätzliches Argument verwenden.

In wenigen Worten, wenn wir 'user_has_cap' für eine Meta-Fähigkeit (siehe https://codex.wordpress.org/Function_Reference/map_meta_cap ) filtern 'user_has_cap' haben wir Zugriff auf die Post-ID, und mit dieser können wir verhindern, dass ein Benutzer ein bestimmtes 'user_has_cap' bearbeitet oder löscht Post.

 add_filter( 'user_has_cap', 'no_edit_prending_for_contrib', 9999, 3 ); function no_edit_prending_for_contrib ( $allcaps, $caps, $args ) { // an arry of action we want to prevent $prevent = array('edit_posts', 'delete_posts'); // we are not checking for edit a post, do nothing if ( ! array_intersect( $prevent, (array) $caps ) ) return $allcaps; // we are not checking for a specific post, do nothing if ( ! isset( $args[2] ) || ! is_numeric( $args[2] ) ) return $allcaps; // the user has the capability to edit published posts, do nothing if ( array_key_exists( 'edit_published_posts', (array) $allcaps ) ) return $allcaps; // if the post is not a future one, do nothing if ( get_post_status( $args[2] ) !== 'future' ) return $allcaps; // if we are here we have to prevent user to edit or delete post if ( isset($allcaps['edit_posts']) ) unset($allcaps['edit_posts']); if ( isset($allcaps['delete_posts']) ) unset($allcaps['delete_posts']); return $allcaps; } 

Mit diesem Code können die Beitragenden die ausstehenden Posts weiterhin lesen, aber nur lesbar, genau wie die Posts, die von anderen Benutzern veröffentlicht werden.

Puh, das war schwer zu lösen 😉 Aber die Sache ist, du musst hier tief graben.

Die function current_user_can() verwendet viele verschiedene functionen afterwars, aber Sie können user_has_cap filtern, was im Grunde überprüft, ob der angemeldete Benutzer eine bestimmte Fähigkeit hat ( duh ).

Als Beitragende dürfen (standardmäßig) Beiträge mit einem anderen Status als publish bearbeiten (bitte korrigieren Sie mich, wenn ich falsch liege, ich habe nicht nach trash ), und auch die Fähigkeiten werden beim Laden des Admin-Bildschirms mehrmals geprüft Überprüfen Sie ein paar verschiedene Dinge, bevor Sie einen Fehler zurückgeben:

  • Kann der Benutzer edit_posts an erster Stelle? `
  • Soll der Status des Posts future bearbeitet future ?
  • Will der Benutzer den Beitrag bearbeiten oder einen neuen erstellen und ist ein Beitrag von der URL festgelegt? (wahrscheinlich am wenigsten wichtig aufgrund des Post-Status).

Die (fast) Lösung

Wenn kein Post (von $_GET['post'] ) gesetzt ist, kann der Filter ohne Einschränkung fortgesetzt werden.

Danach müssen Sie prüfen, ob der post_status in der Zukunft liegt, ob die Aktion (durch $_GET['action'] ) wirklich ‘edit’ ist und natürlich, ob der aktuelle Benutzer überhaupt editieren darf.

 add_filter( 'user_has_cap', 'f711_restrict_editing_future', 1, 3 ); function f711_restrict_editing_future ( $allcaps, $cap, $args ) { // check if a post ist set if ( !isset( $_GET['post'] ) ) return $allcaps; // get the post $thispost = get_post( (int) $_GET['post'] ); // check everything else if ( $cap[0] == 'edit_posts' && $thispost->post_status == 'future' && $_GET['action'] == 'edit' && $allcaps['contributor'] == 1 ) { wp_die( 'post is scheduled' ); } return $allcaps; } 

Die Probleme

Diese function zum Filtern Ihrer Benutzerrolle prüft nur zu dem Zeitpunkt, zu dem der Benutzer den zukünftigen Beitrag bearbeiten möchte. Möglicherweise müssen Sie auch die Listen der Beiträge filtern, um zu vermeiden, dass der Link zum Beitrag angezeigt wird.

Das zweite Problem ist, dass diese Lösung davon abhängt, dass der Benutzer die Rolle des contributor . Möglicherweise müssen Sie diese Einstellungen auch anpassen, wenn Sie eine allgemeine Lösung für dieses Problem haben möchten.

Aber um Ihre Frage zu beantworten – mit dieser function verhindern Sie, dass Mitwirkende zukünftige Beiträge bearbeiten

Nicht die eleganteste Art, aber ich hoffe du bekommst den Dreh 🙂