feat: Divi tools write library entries; global ones with dry run, confirm and backup (E2, F2)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -53,7 +53,7 @@ class LibraryAccess
|
||||
* names no library entry (the caller goes on with PostGuard). With the library hidden (ruling
|
||||
* P9) or without the library right at all (ruling P12), an entry is refused exactly like an ID
|
||||
* that does not exist, so its type and existence stay unknown; only a user with the library
|
||||
* right who lacks edit_post on the entry gets forbidden (like pages).
|
||||
* right who lacks edit_post on the entry gets forbidden (like pages). $forWrite adds canEdit().
|
||||
*/
|
||||
public function item(mixed $postId, bool $forWrite): WP_Post|WP_Error|null
|
||||
{
|
||||
@@ -67,7 +67,7 @@ class LibraryAccess
|
||||
return PostGuard::notFound((int) $post->ID);
|
||||
}
|
||||
|
||||
return $this->canRead($post) ?? $post;
|
||||
return ($forWrite ? $this->canEdit($post) : $this->canRead($post)) ?? $post;
|
||||
}
|
||||
|
||||
/** Listing the library: edit_posts and the Divi role option divi_library. */
|
||||
@@ -93,6 +93,47 @@ class LibraryAccess
|
||||
: Errors::forbidden(sprintf('Keine Berechtigung, Bibliothekseintrag %d zu bearbeiten.', (int) $item->ID));
|
||||
}
|
||||
|
||||
/**
|
||||
* Changing one entry: canRead(), the role option save_library, the Tools-tab gate and a live
|
||||
* entry; a global entry additionally needs edit_global_library (E3 – Divi's builder route
|
||||
* does not check edit_post on the entry, F9; LIT MCP does).
|
||||
*/
|
||||
public function canEdit(WP_Post $item): ?WP_Error
|
||||
{
|
||||
$refusal = $this->canRead($item) ?? $this->roles->refusal('save_library') ?? $this->writableGate();
|
||||
if ($refusal !== null) {
|
||||
return $refusal;
|
||||
}
|
||||
|
||||
if ((string) $item->post_status !== 'publish') {
|
||||
return Errors::invalidInput(
|
||||
sprintf(
|
||||
'Bibliothekseintrag %d ist nicht aktiv (Status „%s“); nichts wurde gespeichert.',
|
||||
(int) $item->ID,
|
||||
(string) $item->post_status
|
||||
),
|
||||
['post_id' => 'nur aktive Bibliothekseinträge'],
|
||||
'Den Eintrag zuerst in der Divi-Bibliothek wiederherstellen.'
|
||||
);
|
||||
}
|
||||
|
||||
return $this->isGlobal($item) ? $this->roles->refusal('edit_global_library') : null;
|
||||
}
|
||||
|
||||
/** Refusal while the Tools tab keeps this connection from writing to the library. */
|
||||
public function writableGate(): ?WP_Error
|
||||
{
|
||||
if ($this->writable === null || ($this->writable)()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Errors::forbidden(
|
||||
'Schreiben in die Divi-Bibliothek ist für diese Verbindung abgeschaltet (Gruppe „Divi-Bibliothek“ auf '
|
||||
. '„nur lesen“ oder deaktiviert).',
|
||||
'Einen Administrator fragen: Einstellungen → LIT MCP → Tools.'
|
||||
);
|
||||
}
|
||||
|
||||
public function isGlobal(WP_Post $item): bool
|
||||
{
|
||||
return $this->store->isGlobal((int) $item->ID);
|
||||
|
||||
Reference in New Issue
Block a user