WpLinkTargets answers the library, internal "_" types and every type without a Divi post_link_url option like a missing ID; replace-text strips library IDs only from global subtrees. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
63 lines
1.8 KiB
PHP
63 lines
1.8 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace LIT\MCP\Integrations\Divi\Pages;
|
||
|
||
use LIT\MCP\Integrations\Divi\Compose\LinkTargets;
|
||
use LIT\MCP\Integrations\Divi\Compose\ValueSanitizer;
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
/**
|
||
* WordPress sanitizing of Divi values (spec §5.6/§10). Because DiviSaver bypasses kses for the
|
||
* page as a whole (kses would re-serialize every untouched block, D7), every value this plugin
|
||
* writes goes through here instead – always via ValueCleaner::clean(), which also checks
|
||
* $variable(…)$ references before and after these sanitizers.
|
||
*
|
||
* Rich text and code depend on unfiltered_html like in core (ruling S4): administrators keep
|
||
* their embeds, forms and scripts; everybody else gets wp_kses_post.
|
||
*/
|
||
final class WpValueSanitizer implements ValueSanitizer
|
||
{
|
||
/** @param LinkTargets $links The {{link:}} targets post_link_url_* follow too (ruling P10). */
|
||
public function __construct(private LinkTargets $links = new WpLinkTargets())
|
||
{
|
||
}
|
||
|
||
public function text(string $value): string
|
||
{
|
||
return sanitize_text_field($value);
|
||
}
|
||
|
||
public function html(string $value): string
|
||
{
|
||
return $this->allowsUnfilteredHtml() ? $value : wp_kses_post($value);
|
||
}
|
||
|
||
public function code(string $value): string
|
||
{
|
||
return $this->allowsUnfilteredHtml() ? $value : wp_kses_post($value);
|
||
}
|
||
|
||
public function url(string $value): string
|
||
{
|
||
return esc_url_raw(trim($value));
|
||
}
|
||
|
||
public function allowsUnfilteredHtml(): bool
|
||
{
|
||
return current_user_can('unfiltered_html');
|
||
}
|
||
|
||
public function canReadPost(int $id): bool
|
||
{
|
||
return current_user_can('read_post', $id);
|
||
}
|
||
|
||
public function linkTargetType(int $id): ?string
|
||
{
|
||
return $this->links->postTypeOf($id);
|
||
}
|
||
}
|