'object', 'properties' => $props]; if ($required) $schema['required'] = $required; return ['name' => $name, 'description' => $desc, 'scope' => $scope, 'handler' => 'AskTamMCP\\Extensions\\Batch16::' . $method, 'inputSchema' => $schema]; }; $registry->register($def('wpml_set_post_language', 'Set (or change) the WPML language of a post. Optionally join an existing translation group via trid and source language.', ['post_id' => ['type' => 'integer'], 'language_code' => ['type' => 'string'], 'trid' => ['type' => 'integer'], 'source_language' => ['type' => 'string']], ['post_id', 'language_code'], 'write', 'setLanguage')); $registry->register($def('wpml_copy_to_language', 'Create a translation of a post into a target language (copies title/content/type/status) and links it to the source translation group. Returns the new post id.', ['source_id' => ['type' => 'integer'], 'target_language' => ['type' => 'string'], 'status' => ['type' => 'string', 'enum' => ['publish', 'draft']]], ['source_id', 'target_language'], 'write', 'copyToLanguage')); $registry->register($def('wpml_connect_translation', 'Connect an existing post as the translation of a source post (joins the source trid) in the given language.', ['source_id' => ['type' => 'integer'], 'translated_id' => ['type' => 'integer'], 'language_code' => ['type' => 'string']], ['source_id', 'translated_id', 'language_code'], 'write', 'connect')); } private static function etype(int $postId): string { return 'post_' . get_post_type($postId); } private static function trid(int $postId): ?int { $trid = apply_filters('wpml_element_trid', null, $postId, self::etype($postId)); return $trid ? (int) $trid : null; } private static function langOf(int $postId): ?string { $d = apply_filters('wpml_element_language_code', null, ['element_id' => $postId, 'element_type' => self::etype($postId)]); return $d ?: null; } public static function setLanguage(array $args): array { $id = (int) ($args['post_id'] ?? 0); if (!get_post($id)) throw new \RuntimeException('Post not found: ' . $id); $lang = (string) ($args['language_code'] ?? ''); if ($lang === '') throw new \RuntimeException('language_code required.'); $args_set = [ 'element_id' => $id, 'element_type' => self::etype($id), 'trid' => isset($args['trid']) ? (int) $args['trid'] : self::trid($id), 'language_code' => $lang, 'source_language_code' => $args['source_language'] ?? null, ]; do_action('wpml_set_element_language_details', $args_set); return ['post_id' => $id, 'language_code' => self::langOf($id), 'trid' => self::trid($id)]; } public static function copyToLanguage(array $args): array { $src = (int) ($args['source_id'] ?? 0); $p = get_post($src); if (!$p) throw new \RuntimeException('Source post not found: ' . $src); $target = (string) ($args['target_language'] ?? ''); if ($target === '') throw new \RuntimeException('target_language required.'); $status = ($args['status'] ?? 'draft') === 'publish' ? 'publish' : 'draft'; $newId = wp_insert_post([ 'post_title' => $p->post_title, 'post_content' => $p->post_content, 'post_excerpt' => $p->post_excerpt, 'post_type' => $p->post_type, 'post_status' => $status, ], true); if (is_wp_error($newId)) throw new \RuntimeException('Copy failed: ' . $newId->get_error_message()); $srcLang = self::langOf($src); $trid = self::trid($src); do_action('wpml_set_element_language_details', [ 'element_id' => $newId, 'element_type' => 'post_' . $p->post_type, 'trid' => $trid, 'language_code' => $target, 'source_language_code' => $srcLang, ]); return ['source_id' => $src, 'new_id' => $newId, 'language_code' => self::langOf($newId), 'trid' => self::trid($newId), 'status' => $status]; } public static function connect(array $args): array { $src = (int) ($args['source_id'] ?? 0); $tr = (int) ($args['translated_id'] ?? 0); if (!get_post($src) || !get_post($tr)) throw new \RuntimeException('Source or translated post not found.'); $lang = (string) ($args['language_code'] ?? ''); if ($lang === '') throw new \RuntimeException('language_code required.'); $trid = self::trid($src); if (!$trid) throw new \RuntimeException('Source has no WPML trid; set its language first.'); do_action('wpml_set_element_language_details', [ 'element_id' => $tr, 'element_type' => 'post_' . get_post_type($tr), 'trid' => $trid, 'language_code' => $lang, 'source_language_code' => self::langOf($src), ]); return ['source_id' => $src, 'translated_id' => $tr, 'trid' => $trid, 'language_code' => self::langOf($tr)]; } }