Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
44 lines
1.2 KiB
PHP
44 lines
1.2 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace LIT\MCP\Integrations\Divi\Pages;
|
||
|
||
use LIT\MCP\Abilities\Rev;
|
||
use LIT\MCP\Integrations\Divi\BlockTree\Document;
|
||
use LIT\MCP\Integrations\Divi\BlockTree\NodeIndex;
|
||
use WP_Post;
|
||
|
||
/**
|
||
* An entry loaded for the Divi tools: the post, its parsed tree, the path index and the
|
||
* tree_rev (hash of post_content – the optimistic lock of the Divi tools, ruling P16; the
|
||
* post-level lock stays `rev` = Rev::ofPost()).
|
||
*/
|
||
final class DiviPage
|
||
{
|
||
public function __construct(
|
||
public readonly WP_Post $post,
|
||
public readonly Document $document,
|
||
public readonly NodeIndex $index
|
||
) {
|
||
}
|
||
|
||
public function treeRev(): string
|
||
{
|
||
return Rev::of((string) $this->post->post_content);
|
||
}
|
||
|
||
/** Whether post_content is a Divi 5 layout (or empty, so a first section can be added). */
|
||
public function isDiviLayout(): bool
|
||
{
|
||
$content = (string) $this->post->post_content;
|
||
|
||
return trim($content) === '' || str_contains($content, '<!-- wp:divi/');
|
||
}
|
||
|
||
public function editUrl(): string
|
||
{
|
||
return (string) add_query_arg('et_fb', '1', (string) get_permalink($this->post));
|
||
}
|
||
}
|