true, 'show_in_rest' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'auth_callback' => $auth, ]; // Idempotencia para actualizar el mismo post (mismo externalId) register_post_meta('post', '_ailoquence_external_id', $text); foreach (ailoquence_seo_meta_keys() as $field => $meta_key) { if ($field === 'schema_json_ld') continue; $args = $text; if (in_array($field, ['og_image', 'twitter_image'], true)) $args['sanitize_callback'] = 'esc_url_raw'; register_post_meta('post', $meta_key, $args); } // Schema JSON-LD: no puede pasar por sanitize_text_field (rompería el JSON), se valida como JSON. register_post_meta('post', '_ailoquence_schema_json_ld', [ 'single' => true, 'show_in_rest' => true, 'type' => 'string', 'sanitize_callback' => 'ailoquence_sanitize_json_ld', 'auth_callback' => $auth, ]); } function ailoquence_sanitize_json_ld($value) { $value = trim((string) $value); if ($value === '') return ''; json_decode($value); return json_last_error() === JSON_ERROR_NONE ? $value : ''; }