Usage search distinguishes certain (ID referenced) and possible (file URL only) usages, hides titles the user cannot read, and keeps queries bounded. MediaGuard checks per-attachment capabilities and refuses trashed media unless the caller opts in. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01At3V6SjwbMe6eMzVGW3Hs7
98 lines
2.9 KiB
PHP
98 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace LIT\MCP;
|
|
|
|
use LIT\MCP\Abilities\AbilityRegistrar;
|
|
use LIT\MCP\ChangeLog\ChangeLog;
|
|
use LIT\MCP\ChangeLog\ChangeLogCleanup;
|
|
use LIT\MCP\ChangeLog\ChangeLogInstaller;
|
|
use LIT\MCP\Guides\InstructionsBuilder;
|
|
use LIT\MCP\Integrations\Core\CoreIntegration;
|
|
use LIT\MCP\Integrations\IntegrationRegistry;
|
|
use LIT\MCP\Integrations\Media\MediaIntegration;
|
|
use LIT\MCP\Integrations\Pods\PodsFieldSource;
|
|
use LIT\MCP\Integrations\WordPress\Schema\ContentSchema;
|
|
use LIT\MCP\Integrations\WordPress\Schema\RegisteredMetaSource;
|
|
use LIT\MCP\Integrations\WordPress\Schema\SampledMetaSource;
|
|
use LIT\MCP\Integrations\WordPress\WordPressIntegration;
|
|
use LIT\MCP\Server\RequestContext;
|
|
use LIT\MCP\Server\ServerRegistrar;
|
|
|
|
/**
|
|
* Wires WP-LIT-MCP into WordPress.
|
|
*/
|
|
final class Plugin
|
|
{
|
|
public const VERSION = '0.1.0';
|
|
|
|
private static string $pluginFile = '';
|
|
|
|
public static function boot(string $pluginFile): void
|
|
{
|
|
self::$pluginFile = $pluginFile;
|
|
|
|
$missing = (new Dependencies())->missing();
|
|
if ($missing !== []) {
|
|
self::noticeMissing($missing);
|
|
return;
|
|
}
|
|
|
|
(new Access())->register();
|
|
(new RequestContext())->register();
|
|
|
|
$limits = new Limits();
|
|
$changeLog = new ChangeLog();
|
|
(new ChangeLogInstaller($changeLog))->maybeInstall();
|
|
(new ChangeLogCleanup($changeLog, $limits))->register();
|
|
|
|
$schema = self::contentSchema();
|
|
$registry = new IntegrationRegistry(
|
|
new CoreIntegration(self::pluginDir() . '/docs/guides'),
|
|
new WordPressIntegration($schema, $changeLog),
|
|
new MediaIntegration($schema, $changeLog, $limits)
|
|
);
|
|
|
|
(new AbilityRegistrar($registry))->register();
|
|
(new ServerRegistrar(
|
|
$registry,
|
|
new InstructionsBuilder($registry, static fn (): array => $schema->postTypeNames())
|
|
))->register();
|
|
|
|
\WPMedia\MCP\OAuth\Bootstrap::instance();
|
|
}
|
|
|
|
public static function pluginDir(): string
|
|
{
|
|
return dirname(self::$pluginFile);
|
|
}
|
|
|
|
/**
|
|
* @param list<string> $missing
|
|
*/
|
|
public static function noticeMissing(array $missing): void
|
|
{
|
|
add_action('admin_notices', static function () use ($missing): void {
|
|
printf(
|
|
'<div class="notice notice-error"><p>%s</p></div>',
|
|
esc_html(sprintf(
|
|
/* translators: %s: comma separated list of missing components */
|
|
__('WP-LIT-MCP ist inaktiv. Es fehlt: %s', 'wp-lit-mcp'),
|
|
implode(', ', $missing)
|
|
))
|
|
);
|
|
});
|
|
}
|
|
|
|
private static function contentSchema(): ContentSchema
|
|
{
|
|
$sources = [new RegisteredMetaSource(), new SampledMetaSource()];
|
|
if (PodsFieldSource::isAvailable()) {
|
|
array_unshift($sources, new PodsFieldSource());
|
|
}
|
|
|
|
return new ContentSchema($sources);
|
|
}
|
|
}
|