integrations について
integrationsは、ActivityPubプラグインと他のWordPressプラグインを連携させる開発者向けのスキルです。連携の読み込み、フェデレーション用フック、投稿タイプのサポート、互換性確認について説明します。
主な機能
- 01連携ディレクトリと読み込み規約
- 02プラグイン検出と初期化のパターン
- 03投稿タイプのフェデレーション対応
- 04TransformerとActivityStreamsのフィルター
- 05連携の互換性テスト
活用シーン
- 01他のWordPressプラグインへの対応追加
- 02カスタム投稿タイプのフェデレーション
- 03送信するActivityPubオブジェクトの調整
- 04連携の読み込みと互換性の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ automattic/ wordpress-activitypub --skill integrationsインストール後、Claude Code で/integrationsを入力して読み込まれたか確認します。
詳細
ActivityPub の連携
このスキルでは、ActivityPub プラグインをほかの WordPress プラグインと連携する方法を説明します。
クイックリファレンス
連携ファイルの配置場所
すべての連携ファイルは integration/ ディレクトリにあります。
ファイル名: class-{plugin-name}.php(AGENTS.md の PHP 規約に準拠)
名前空間: Activitypub\Integration
連携の読み込み方法
連携は plugin_init() 内の integration/load.php で登録します。それぞれ検出チェックで保護したうえで、クラスの静的な init() を呼び出します。
// integration/load.php
if ( \defined( 'JETPACK__VERSION' ) ) {
Jetpack::init();
}
既存の連携
現在提供されている実際の連携は、integration/ を参照してください。
akismet、buddypress、classic-editor、enable-mastodon-apps、jetpack、
litespeed-cache、multisite-language-switcher、nodeinfo、opengraph、
podlove-podcast-publisher、seriously-simple-podcasting、surge、webfinger、
wpml、yoast-seo。
いくつかの例:
- Akismet — 受信したコメントやインタラクションを Akismet のスパムチェックにかけます。
- OpenGraph — OpenGraph プラグインを介して
fediverse:creatorと関連メタデータを追加します。 - Enable Mastodon Apps — Mastodon クライアントアプリがサイトと通信できるようにします。
- キャッシュ(LiteSpeed Cache、Surge) — ActivityPub のレスポンスを適切にキャッシュ可能、またはキャッシュされない状態に保ちます。
- 多言語対応(WPML、Multisite Language Switcher) — 言語に応じたアクターとコンテンツの処理を行います。
ディレクトリ構造と命名規則の全容については、docs/php-class-structure.md を参照してください。
新しい連携の作成
基本的な連携クラス
<?php
namespace Activitypub\Integration;
class Plugin_Name {
/**
* Initialize the class, registering WordPress hooks.
*/
public static function init() {
// Enable federation for the plugin's post type.
\add_post_type_support( 'plugin_post_type', 'activitypub' );
// Provide a custom transformer if the default Post transformer is not enough.
\add_filter( 'activitypub_transformer', array( self::class, 'transformer' ), 10, 3 );
}
/**
* Return a custom transformer for the plugin's objects.
*
* @param mixed $transformer The transformer to use. Default null.
* @param mixed $data The object to transform.
* @param string $object_class The class of the object to transform.
* @return mixed
*/
public static function transformer( $transformer, $data, $object_class ) {
if ( 'WP_Post' === $object_class && 'plugin_post_type' === $data->post_type ) {
require_once __DIR__ . '/class-custom-transformer.php';
return new Custom_Transformer( $data );
}
return $transformer;
}
}
次に、integration/load.php に登録します。
if ( \defined( 'PLUGIN_VERSION' ) ) {
Plugin_Name::init();
}
連携パターン
投稿タイプのフェデレーションを有効にする
投稿タイプのサポートによって、どのコンテンツがフェデレーションされるかが決まります。add_post_type_support() を使用してください。activitypub_post_types フィルターはありません。
\add_post_type_support( 'event', 'activitypub' );
\add_post_type_support( 'product', 'activitypub' );
有効な投稿タイプは activitypub_support_post_types オプションに保存されます(\get_option( 'activitypub_support_post_types', array( 'post' ) ) で読み取ります)。
カスタムトランスフォーマー
activitypub_transformer フィルターは 3 つの引数(( $transformer, $data, $object_class ))を受け取り、優先度 10, 3 で登録します。
\add_filter( 'activitypub_transformer', function ( $transformer, $data, $object_class ) {
if ( 'WP_Post' === $object_class && 'event' === $data->post_type ) {
return new Event_Transformer( $data );
}
return $transformer;
}, 10, 3 );
Activity オブジェクトの変更
最終的な ActivityStreams 配列を調整するには、activitypub_activity_object_array(( $array, $class, $id, $object ))にフックします。
\add_filter( 'activitypub_activity_object_array', function ( $array, $class, $id, $object ) {
if ( isset( $array['type'] ) && 'Note' === $array['type'] ) {
// Adjust the outgoing object array here.
}
return $array;
}, 10, 4 );
連携のテスト
連携の読み込みを確認する
// Check if integration is active.
if ( \class_exists( '\Activitypub\Integration\Plugin_Name' ) ) {
// Integration loaded.
}
互換性をテストする
- 対象のプラグインをインストールします
- ActivityPub を有効化します
- 競合がないか確認します
- カスタム投稿タイプがフェデレーションされることを確認します
- プラグインのコンテンツのフェデレーションをテストします
よくある連携の問題
プラグインの検出
// Multiple detection methods (match how integration/load.php guards each one).
if ( \defined( 'PLUGIN_VERSION' ) ) { }
if ( \function_exists( 'plugin_function' ) ) { }
if ( \class_exists( 'Plugin_Class' ) ) { }
フックの優先度
// Use appropriate priority.
\add_filter( 'hook', 'callback', 20 ); // After plugin's filter.
名前空間の競合
// Use fully qualified names.
$object = new \Plugin\Namespace\Class();
ベストプラクティス
init()を呼び出す前に、必ずintegration/load.phpの検出チェックで連携を保護してください。- ほかのプラグインのデフォルト設定を上書きする必要がある場合は、フィルターに遅い優先度を使用してください。
- 複数のプラグインバージョンでテストしてください。
- 互換性要件を文書化してください。
- プラグインが無効化された場合も適切に処理してください。