{"id":3603,"date":"2026-03-28T07:01:41","date_gmt":"2026-03-28T06:01:41","guid":{"rendered":"https:\/\/isla-stud.io\/?p=3603"},"modified":"2026-08-10T14:55:13","modified_gmt":"2026-08-10T12:55:13","slug":"wordpress-7-ai-client-developer","status":"publish","type":"post","link":"https:\/\/isla-stud.io\/no\/allgemein\/wordpress-7-ai-client-developer\/","title":{"rendered":"WordPress 7.0 AI Client fra et utviklerperspektiv"},"content":{"rendered":"<p class=\"wp-block-paragraph\">WordPress 7.0 f\u00e5r en innebygd AI Client. Ikke som utvidelse eller eksperimentelt funksjonsflagg, men som en del av kjernen. Det er et tydelig signal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jeg har utviklet WordPress-utvidelser siden 2009 og har med <a href=\"https:\/\/citelayer.ai\" target=\"_blank\" rel=\"noopener\">citelayer\u00ae<\/a> selv laget en KI-utvidelse som blir direkte ber\u00f8rt av dette arkitekturvalget. Her er den tekniske analysen min: Hva kan API-et, hvor ligger styrkene, og hva trenger utvidelsesutviklere \u00e5 vite?<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\" id=\"der-entry-point-wp-ai-client-prompt\">Inngangspunktet: <code>wp_ai_client_prompt()<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Alt begynner med \u00e9n funksjon:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">$builder = wp_ai_client_prompt();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Den returnerer et <code>WP_AI_Client_Prompt_Builder<\/code>-Objekt zur\u00fcck &#8211; ein Fluent Builder, \u00fcber den Prompt, Konfiguration und Generierungsmethode verkettet werden. Das Grundprinzip: Der Entwickler beschreibt, <strong>hva<\/strong> som trengs. WordPress tar seg av <strong>hvordan<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et enkelt eksempel p\u00e5 tekstgenerering:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\/\/ Prompt direkte som parameter \u2014 praktisk for enkle tilfeller\n$text = wp_ai_client_prompt( 'Oppsummer fordelene med caching i WordPress.' )\n    -&gt;using_temperature( 0.7 )\n    -&gt;generate_text();\n\n\/\/ Feilh\u00e5ndtering som overalt i WordPress: sjekk WP_Error\nif ( is_wp_error( $text ) ) {\n    return;\n}\n\necho wp_kses_post( $text );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Promptteksten kan angis som parameter eller med <code>with_text()<\/code> . Det siste er nyttig n\u00e5r prompten bygges opp dynamisk.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mehr-als-text-bild-sprache-video\">Mer enn tekst: bilder, tale og video<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">API-et er multimodalt. Bildegenerering f\u00f8lger samme m\u00f8nster:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">use WordPress\\AiClient\\Files\\DTO\\File;\n\n$image = wp_ai_client_prompt( &#039;Et futuristisk WordPress-logo i neonstil&#039; )\n    -&amp;gt;generate_image();\n\nif ( is_wp_error( $image ) ) {\n    return;\n}\n\n\/\/ File DTO med Data URI &mdash; direkte brukbar\necho &#039;&lt;img src=&quot;&#039; . esc_url( $image-&gt;getDataUri() ) . &#039;&quot; data-no-translation=&quot;&quot; data-no-auto-translation=&quot;&quot;&gt;&#039;;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For variasjoner finnes <code>generate_images( 4 )<\/code> og <code>generate_texts( 4 )<\/code>. I tillegg kommer <code>convert_text_to_speech_result()<\/code>, <code>generate_speech_result()<\/code> og <code>generate_video_result()<\/code>. Dermed dekker WordPress alle vanlige modaliteter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e6rlig interessant er multimodale resultater i \u00e9n enkelt foresp\u00f8rsel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">use WordPress\\AiClient\\Messages\\Enums\\ModalityEnum;\n\n\/\/ Tekst og bilder i ett svar \u2014 resultatet inneholder begge deler\n$result = wp_ai_client_prompt( 'Lag en oppskrift med bilder for hvert trinn.' )\n    -&gt;as_output_modalities( ModalityEnum::text(), ModalityEnum::image() )\n    -&gt;generate_result();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e5pner mange muligheter for utvidelser som genererer mer enn ren tekst.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"feature-detection-keine-annahmen-treffen\">Funksjonskontroll: Ikke ta noe for gitt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ikke alle WordPress-installasjoner vil ha en KI-leverand\u00f8r konfigurert. Og ikke alle leverand\u00f8rer st\u00f8tter alle modaliteter. API-et tilbyr deterministiske kontroller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">$builder = wp_ai_client_prompt( 'test' )\n    -&gt;using_temperature( 0.7 );\n\n\/\/ Ingen API-kall \u2014 rent logisk sjekk mot tilgjengelige leverand\u00f8rer\nif ( $builder-&gt;is_supported_for_text_generation() ) {\n    \/\/ Vis UI for tekstgenerering\n}\n\nif ( $builder-&gt;is_supported_for_image_generation() ) {\n    \/\/ Vis knapp for bildegenerering\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist sauber gel\u00f6st. Die Checks kosten nichts &#8211; keine API-Calls, keine Latenz. Plugin-Entwickler k\u00f6nnen ihre UI bedingt laden und einen hilfreichen Hinweis zeigen, wenn keine AI verf\u00fcgbar ist. Die Regel: <strong>Ta aldri for gitt at KI-funksjoner virker bare fordi WordPress 7.0 er installert.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tilgjengelige kontroller: <code>is_supported_for_text_generation()<\/code>, <code>is_supported_for_image_generation()<\/code>, <code>is_supported_for_text_to_speech_conversion()<\/code>, <code>is_supported_for_speech_generation()<\/code>, <code>is_supported_for_video_generation()<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"model-preferences-statt-requirements\">Modellpreferanser fremfor krav<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Her blir designfilosofien tydelig:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">$result = wp_ai_client_prompt( 'Erkl\u00e4re die Geschichte des Buchdrucks.' )\n    -&gt;using_temperature( 0.1 )\n    -&gt;using_model_preference(\n        'claude-sonnet-4-6',\n        'gemini-3.1-pro-preview',\n        'gpt-5.4'\n    )\n    -&gt;generate_text_result();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>using_model_preference()<\/code> angir en <strong>preferanse<\/strong>, ikke et krav. AI Client velger den f\u00f8rste tilgjengelige modellen i listen, eller en annen kompatibel modell hvis ingen av dem er konfigurert. Utvidelseskoden fungerer alltid, uavhengig av leverand\u00f8ren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det er det riktige valget. Utvidelsesutviklere b\u00f8r aldri v\u00e6re avhengige av at en bestemt modell er tilgjengelig. Den offisielle anbefalingen er \u00e5 sortere modellene slik at nyere st\u00e5r foran eldre. De tre offisielle leverand\u00f8rutvidelsene ved lansering gj\u00f8r allerede dette.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"strukturierte-antworten-mit-json-schema\">Strukturerte svar med JSON Schema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For utvidelser som trenger strukturerte data, og dem finnes det mange av, er dette et h\u00f8ydepunkt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">$schema = array(\n    'type'  =&gt; 'array',\n    'items' =&gt; array(\n        'type'       =&gt; 'object',\n        'properties' =&gt; array(\n            'plugin_name' =&gt; array( 'type' =&gt; 'string' ),\n            'category'    =&gt; array( 'type' =&gt; 'string' ),\n        ),\n        'required' =&gt; array( 'plugin_name', 'category' ),\n    ),\n);\n\n$json = wp_ai_client_prompt( 'List opp 5 popul\u00e6re WordPress-utvidelser med kategori.' )\n    -&gt;as_json_response( $schema )\n    -&gt;generate_text();\n\n\/\/ Strukturerte data direkte som array \u2014 ingen manuell parsing n\u00f8dvendig\n$data = json_decode( $json, true );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dette er gull verdt for SEO-utvidelser, skjemautvidelser og verkt\u00f8y for innholdsanalyse. I stedet for \u00e5 tolke ustrukturert tekst f\u00e5r man data som kan brukes direkte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"die-zwei-schichten-architektur\">Arkitekturen med to lag<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Under panseret best\u00e5r AI Client av to niv\u00e5er:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>PHP AI Client<\/strong> (<code>wordpress\/php-ai-client<\/code>) \u2013 et leverand\u00f8ruavhengig PHP-SDK, inkludert i kjernen som et eksternt bibliotek. CamelCase-metoder, exceptions og teknisk uavhengig av WordPress.<\/li>\n\n\n\n<li><strong>WordPress Wrapper<\/strong> \u2013 <code>WP_AI_Client_Prompt_Builder<\/code> tilpasser SDK-et til WordPress-konvensjoner: snake_case-metoder, <code>WP_Error<\/code> i stedet for exceptions, og integrasjon med WordPress HTTP Transport, Abilities API, Connectors-infrastrukturen og hook-systemet.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Dette er en elegant oppdeling. PHP-SDK-et kan i teorien ogs\u00e5 brukes utenfor WordPress. WordPress-wrapperen gj\u00f8r bruken naturlig i WordPress. Og <code>GenerativeAiResult<\/code>-objektet kan serialiseres og sendes direkte til <code>rest_ensure_response()<\/code> , slik at REST-API-integrasjonen er klar til bruk:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">function my_rest_callback( WP_REST_Request $request ) {\n    $result = wp_ai_client_prompt( $request-&gt;get_param( 'prompt' ) )\n        -&gt;generate_text_result();\n\n    \/\/ WP_Error eller GenerativeAiResult \u2014 begge fungerer\n    return rest_ensure_response( $result );\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"granulare-kontrolle-der-filter\">Detaljert kontroll: Filteret<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For sikkerhet og etterlevelse finnes <code>wp_ai_client_prevent_prompt<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">add_filter(\n    'wp_ai_client_prevent_prompt',\n    function ( bool $prevent, WP_AI_Client_Prompt_Builder $builder ): bool {\n        \/\/ Eksempel: AI kun for administratorer\n        if ( ! current_user_can( 'manage_options' ) ) {\n            return true;\n        }\n        return $prevent;\n    },\n    10,\n    2\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e5r en prompt blokkeres, blir det ikke gjort noe API-kall. <code>is_supported_*()<\/code> returnerer <code>false<\/code> , og <code>generate_*()<\/code> returnerer <code>WP_Error<\/code>. Ryddig, forutsigbart og uten race conditions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"starken-und-schwachen\">Styrker og svakheter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dette er godt l\u00f8st:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Leverand\u00f8rabstraksjonen. Utvidelsesutviklere trenger aldri \u00e5 forholde seg til API-n\u00f8kler, rategrenser eller s\u00e6regenheter hos leverand\u00f8rene.<\/li>\n\n\n\n<li>Funksjonskontroll uten API-kall. Man slipper \u00e5 gjette om noe vil fungere.<\/li>\n\n\n\n<li>WordPress-konvensjonene. <code>WP_Error<\/code>, hooks og REST-kompatibilitet gj\u00f8r at det f\u00f8les innebygd.<\/li>\n\n\n\n<li>St\u00f8tte for JSON Schema. Strukturerte svar har f\u00f8rsteklasses st\u00f8tte.<\/li>\n\n\n\n<li>Arkitekturen med to lag. Et tydelig skille mellom SDK-et og WordPress-integrasjonen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dette f\u00f8lger jeg med et kritisk blikk:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Det er nettstedseieren som konfigurerer tilkoblingen. Utvidelser har ingen innflytelse p\u00e5 <strong>om<\/strong> en leverand\u00f8r er konfigurert. Funksjonskontrollen h\u00e5ndterer dette, men utfordringen for brukeropplevelsen best\u00e5r.<\/li>\n\n\n\n<li>Modellandskapet endrer seg raskt. Det gjenst\u00e5r \u00e5 se hvor godt preferanselisten holder seg n\u00e5r det kommer nye modeller hver tredje m\u00e5ned.<\/li>\n\n\n\n<li>Konsekvensene for ytelsen er fortsatt uklare. Hvordan oppf\u00f8rer systemet seg under belastning n\u00e5r 10 utvidelser sender prompter samtidig?<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"was-das-fur-bestehende-plugins-bedeutet\">Hva dette betyr for eksisterende utvidelser<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Alle utvidelser som i dag har egne KI-integrasjoner, st\u00e5r overfor et valg: Beholde sin egen API-tilkoblingen eller g\u00e5 over til AI Client?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For <strong>SEO-utvidelser<\/strong> er svaret klart: Strukturerte data, innholdsanalyse og generering av metabeskrivelser blir langt ryddigere med AI Client. For <strong>skjemautvidelser<\/strong> \u00e5pner det for intelligent feltvalidering og automatisk utfylling. For <strong>netthandelsutvidelser<\/strong> blir det plutselig sv\u00e6rt enkelt \u00e5 lage KI-genererte produktbeskrivelser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For en utvidelse som <a href=\"https:\/\/wordpress.org\/plugins\/citelayer\/\" target=\"_blank\" rel=\"noreferrer noopener\">citelayer\u00ae &#8211; AI Visibility f\u00fcr WordPress<\/a>, som arbeider i skj\u00e6ringspunktet mellom WordPress og KI-systemer, er AI Client en naturlig utvidelse. Citelayer gj\u00f8r innhold lesbart for KI gjennom llms.txt, innsetting av Schema-data, bot-sporing og protokoller som UCP og WebMCP. AI Client kan tenkes \u00e5 supplere dette analyselaget med mer intelligente, KI-st\u00f8ttede vurderinger. Hva det konkret betyr for AI Visibility, har jeg <a href=\"https:\/\/citelayer.ai\/blog\/wordpress-7-ai-client\" target=\"_blank\" rel=\"noopener\">skrevet mer om i Citelayer-bloggen<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fazit\">Infrastruktur, ikke en liten tilleggsfunksjon<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress 7.0 AI Client er ingen liten tilleggsfunksjon. Det er infrastruktur. Gjennomtenkt, i tr\u00e5d med WordPress-konvensjoner og med en klar designfilosofi: Utvikleren beskriver hensikten, systemet tar seg av utf\u00f8relsen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den som utvikler WordPress-utvidelser i dag, b\u00f8r bli kjent med dette API-et. Ikke fordi man m\u00e5, men fordi det er grunnlaget neste generasjon WordPress-utvidelser vil bygge p\u00e5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den fullstendige API-dokumentasjonen finnes p\u00e5 <a href=\"https:\/\/make.wordpress.org\/core\/2026\/03\/24\/introducing-the-ai-client-in-wordpress-7-0\/\" target=\"_blank\" rel=\"noopener\">WordPress Make Blog<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>WordPress 7.0 AI Client i developer deep-dive: API-arkitektur, kodeeksempler, feature detection og hva det betyr for eksisterende plugins. Fra en plugin-utvikler som har v\u00e6rt med siden 2009.<\/p>","protected":false},"author":1,"featured_media":3606,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_isla_series_order":0,"_isla_series_term_id":0,"footnotes":""},"categories":[1,754],"tags":[],"isla_series":[],"class_list":["post-3603","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-ki-b2b"],"acf":[],"_links":{"self":[{"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/posts\/3603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/comments?post=3603"}],"version-history":[{"count":3,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/posts\/3603\/revisions"}],"predecessor-version":[{"id":4202,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/posts\/3603\/revisions\/4202"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/media\/3606"}],"wp:attachment":[{"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/media?parent=3603"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/categories?post=3603"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/tags?post=3603"},{"taxonomy":"isla_series","embeddable":true,"href":"https:\/\/isla-stud.io\/no\/wp-json\/wp\/v2\/isla_series?post=3603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}