WordPress som backend for mobilapper: React Native-guide

WordPress som backend for mobilapper: React Native-guide

Sist verifisert: 12. oktober 2026
18 min lesetid
Guide
500+ WP-prosjekter

WordPress fungerer pålitelig som mobilbackend når API-kontrakten er eksplisitt definert, bufret i hurtigminne og sikret med robuste tilgangskontroller. Den svake varianten sender forespørsler mot standard REST-endepunkter ved hvert skjermbytte. Den gjennomtenkte arkitekturen modellerer lette datastrukturer, styrer tokens uten nettleseravhengigheter, sender push-varsler og ivaretar synkronisering uten nett før den første visningen settes i produksjon.

Les mer om WordPress-hastighetsoptimalisering hos WPPoland.


#Hvorfor bruke WordPress som backend for en mobilapp

Mobilapplikasjoner krever forutsigbar og rask datalevering på iOS og Android, samtidig som redaksjonelle team trenger et intuitivt publiseringsgrensesnitt. Å utvikle en skreddersydd backend fra bunnen av krever egne databasetabeller, administrasjonspaneler og omfattende rettighetsstyring. Når WordPress tas i bruk som et hodeløst CMS, leverer det en ferdig redaksjonell arbeidsflate med etablerte godkjenningsrutiner, granulære roller og innebygd mediebehandling rett etter installasjon.

Ved å frikoble presentasjonslaget fungerer WordPress som en ren API-motor, mens React Native håndterer det native brukergrensesnittet. Denne oppdelingen gir klare operative fordeler for produkt- og utviklingsteam:

  1. Redaksjonell uavhengighet: Innholdsredaktører oppretter artikler, organiserer taksonomier og oppdaterer kampanjebannere via blokkredigeringsverktøyet eller egendefinerte felter, uten at appen må oppdateres i App Store eller Google Play.
  2. Felles kodebase på tvers av plattformer: React Native knytter native systemkomponenter sammen med en felles TypeScript-kodebase for iOS og Android, og tar imot strømlinjeformede JSON-strukturer fra serveren.
  3. Uavhengige lanseringssykluser: Endringer i databaseskjemaer, webhooks og hurtigminnelag på serversiden kan rulles ut fortløpende uten å tvinge sluttbrukere til å laste ned en ny app-oppdatering.
  4. Budsjetteffektivitet: Organisasjoner gjenbruker eksisterende WordPress-utvidelser, redaksjonelle tilganger og relasjonsmodeller, i stedet for å betale for dyre eksterne SaaS-plattformer.

En produksjonsklar mobilklient krever imidlertid mer enn standardendepunktene i kjernen. Mobiltelefoner opererer under ustabile nettverksforhold, bytter mellom mobilmaster og trådløse nettverk, og rammes av forsinkelser ved unødvendige TCP-forhandlinger. Backend-arkitekturen må derfor redusere antall nettverkskall, servere optimaliserte bildeformater, distribuere push-varsler og håndtere frakoblede skrivehandlinger lokalt til nettverksforbindelsen er gjenopprettet.


#Hodeløs arkitektur for WordPress og React Native

I en hodeløs arkitektur kjører WordPress på en opprinnelsesserver eller et klyngeoppsett bak en omvendt proxy og Redis-hurtigminne. React Native-appen kommuniserer utelukkende over sikre HTTPS-grensesnitt, og styrer sikkerhetstokens, lokal hurtigbufring og klienttilstand autonomt.

#Komponenter i et hodeløst mobiloppsett

En komplett teknisk arkitektur er bygget opp av fire hovedlag:

  1. WordPress-kjerne og relasjonsdatabase: Lagrer artikler i MySQL, håndterer tilpassede innholdstyper (CPT), taksonomier, mediemetadata og brukerspesifikke tilganger.
  2. API-tilgangslag: Egendefinerte klasser som arver fra WP_REST_Controller for skreddersydde REST-endepunkter, eller utvidelsen WPGraphQL for sammensatte grafspørringer.
  3. Sikkerhetsport og autentisering: JSON Web Tokens (RFC 7519) eller OAuth 2.0 PKCE for validering av mobile forespørsler, kombinert med applikasjonspassord for interne feilsøkingstester.
  4. Mobilt kjøretidsmiljø: React Native og Expo med navigasjonsstakker, TanStack Query for nettverkstilstand og Expo SQLite for lokal datalagring uten nett.

#WordPress REST API sammenlignet med GraphQL for mobil

Valget mellom det innebygde REST API-et og WPGraphQL avhenger av datastrukturenes kompleksitet, nettforsinkelse og tilgjengelig infrastruktur for hurtigbufring.

EgenskapWordPress REST APIWPGraphQL
Inkludert i kjernenStandard i WordPress siden versjon 4.7Krever utvidelsen WPGraphQL
SpørringsfleksibilitetFaste svarstrukturer per endepunktKlienten spesifiserer nøyaktig hvilke felt som hentes
Dataoverheng (over-fetching)Må begrenses manuelt via parameteren _fieldsEliminert på spørringsnivå
HTTP-hurtigbufringSvært enkelt på kantservere via GET-forespørslerKrever persistente spørringer eller proxy-mellomvare
N+1-spørringsproblematikkVanlig ved henting av dypt nøstede relasjonerLøses i ett enkelt nettverkskall
LæringskurveStandard REST-prinsipper som alle webutviklere kjennerKrever forståelse for GraphQL-skjemaer og AST-syntaks

For tradisjonelle innholdsfeeder med mest lesetrafikk gir det innebygde REST API-et med egne kontrollere og kantbufring forutsigbar drift uten eksterne programvareavhengigheter. For komplekse nettbutikker eller apper med dype forfatter- og kommentarrelasjoner eliminerer WPGraphQL unødvendige kaskader av nettverkskall.


#Implementering av egne kontrollere med WP_REST_Controller

Standardendepunktene i WordPress returnerer store JSON-objekter fylt med unødvendige temametadata, HTML-formatering tilpasset skrivebordsvisning og overflødige forfatterdetaljer. Ved å utvikle egne kontrollere basert på WP_REST_Controller kuttes datamengden drastisk, samtidig som API-responsen standardiseres.

#Registrering av tilpassede ruter og endepunkter

Følgende eksempel viser en utvidelse som oppretter et optimalisert mobilendepunkt:

<?php
/**
 * Plugin Name: REST-kontroller for mobilapp
 * Description: Hoyytelses REST-endepunkter for React Native.
 * Version: 1.0.0
 * Author: WPPoland
 */

if (!defined("ABSPATH")) {
    exit;
}

class Mobile_Posts_Controller extends WP_REST_Controller {

    public function __construct() {
        $this->namespace = "app/v1";
        $this->rest_base = "feed";
    }

    public function register_routes() {
        register_rest_route($this->namespace, "/" . $this->rest_base, array(
            array(
                "methods"             => WP_REST_Server::READABLE,
                "callback"            => array($this, "get_items"),
                "permission_callback" => array($this, "get_items_permissions_check"),
                "args"                => $this->get_collection_params(),
            ),
            "schema" => array($this, "get_public_item_schema"),
        ));
    }

    public function get_items_permissions_check($request) {
        return true;
    }

    public function get_items($request) {
        $page     = (int) $request->get_param("page");
        $per_page = (int) $request->get_param("per_page");

        $args = array(
            "post_type"      => "post",
            "post_status"    => "publish",
            "posts_per_page" => $per_page,
            "paged"          => $page,
            "no_found_rows"  => false,
        );

        $query = new WP_Query($args);
        $posts = array();

        foreach ($query->posts as $post) {
            $data    = $this->prepare_item_for_response($post, $request);
            $posts[] = $this->prepare_response_for_collection($data);
        }

        $response = rest_ensure_response($posts);
        $response->header("X-WP-Total", (int) $query->found_posts);
        $response->header("X-WP-TotalPages", (int) $query->max_num_pages);

        return $response;
    }

    public function prepare_item_for_response($post, $request) {
        $thumb_id = get_post_thumbnail_id($post->ID);
        
        $media_urls = array(
            "thumbnail" => wp_get_attachment_image_url($thumb_id, "mobile_thumbnail"),
            "card"      => wp_get_attachment_image_url($thumb_id, "mobile_card"),
            "full"      => wp_get_attachment_image_url($thumb_id, "mobile_hero"),
        );

        $item = array(
            "id"         => $post->ID,
            "title"      => wp_strip_all_tags(get_the_title($post)),
            "slug"       => $post->post_name,
            "date"       => mysql_to_rfc3339($post->post_date),
            "summary"    => wp_strip_all_tags(get_the_excerpt($post)),
            "media"      => $media_urls,
            "view_count" => (int) get_post_meta($post->ID, "_app_view_count", true),
        );

        return rest_ensure_response($item);
    }

    public function get_collection_params() {
        return array(
            "page" => array(
                "description"       => "Gjeldende sidenummer.",
                "type"              => "integer",
                "default"           => 1,
                "sanitize_callback" => "absint",
                "validate_callback" => "rest_validate_request_arg",
            ),
            "per_page" => array(
                "description"       => "Maksimalt antall elementer per side.",
                "type"              => "integer",
                "default"           => 10,
                "sanitize_callback" => "absint",
                "validate_callback" => "rest_validate_request_arg",
            ),
        );
    }
}

add_action("rest_api_init", function () {
    $controller = new Mobile_Posts_Controller();
    $controller->register_routes();
});

En tilpasset kontroller reduserer datastørrelsen fra rundt 120 KB til 8 KB per forespørsel ved å fjerne ubrukte blokkattributter, kommentarstrukturer og overflødige forfatterfelter.

#Parameterrensing og feilhåndtering

Mobile klienter forventer presise HTTP-statuskoder og standardiserte JSON-feilmeldinger:

function app_sanitize_query_param($value, $request, $param) {
    if ($param === "search_term") {
        return sanitize_text_field(trim($value));
    }
    return sanitize_text_field($value);
}

function app_format_error_response($code, $message, $status_code = 400) {
    return new WP_Error($code, $message, array(
        "status"    => $status_code,
        "timestamp" => time(),
    ));
}

#Utvidelse av WPGraphQL-skjemaet for mobilapper

Når arkitekturen baseres på WPGraphQL, gjør egne felter det mulig å beregne data på serveren før de overføres til klienten, noe som sparer batteri og prosessorkraft på mobilen.

#Registrering av tilpassede GraphQL-felter

Kroken graphql_register_types legger til beregnede egenskaper direkte på Post-typen:

add_action("graphql_register_types", function () {
    register_graphql_field("Post", "mobileMetrics", array(
        "type"        => "MobileMetricsType",
        "description" => "Beregnede verdier for mobile enheter.",
        "resolve"     => function ($post) {
            $content = get_post_field("post_content", $post->databaseId);
            $word_count = str_word_count(strip_tags($content));
            $read_minutes = max(1, (int) ceil($word_count / 200));

            return array(
                "wordCount"       => $word_count,
                "readingMinutes"  => $read_minutes,
                "isOfflineReady"  => true,
            );
        },
    ));

    register_graphql_object_type("MobileMetricsType", array(
        "description" => "Objekt for mobile beregninger",
        "fields"      => array(
            "wordCount" => array(
                "type"        => "Int",
                "description" => "Totalt antall ord i artikkelen",
            ),
            "readingMinutes" => array(
                "type"        => "Int",
                "description" => "Beregnet lesetid i minutter",
            ),
            "isOfflineReady" => array(
                "type"        => "Boolean",
                "description" => "Flagg for automatisk frakoblet synkronisering",
            ),
        ),
    ));
});

Klienten henter lesetid og synkroniseringsstatus i den samme spørringen som henter artikkelens tittel og innhold.


#Autentiseringsstrategier for mobile applikasjoner

Sikkerhetsmodellen for mobilapper skiller seg vesentlig fra vanlige nettlesere. En kompilert mobilapp kan ikke beskytte hemmelige klientnøkler, og nettleser-informasjonskapsler er ikke standard. Tre metoder peker seg ut:

#Applikasjonspassord under utvikling og integrasjonstesting

Applikasjonspassord har vært en del av kjernen i WordPress siden versjon 5.6. De genererer en tilfeldig streng på 24 tegn knyttet til en bestemt brukerkonto.

Den store fordelen er at ingen tredjepartsutvidelser er påkrevd, og hvert enkelt passord kan trekkes tilbake i brukerprofilen i kontrollpanelet. Fordi passordene sendes via Basic Authentication i HTTP-hodet ved hver forespørsel, bør de reserveres for utviklingsmiljøer, interne administrasjonsverktøy og automatiserte synkroniseringsskript.

#JWT-autentisering med token-rotasjon

JSON Web Tokens (RFC 7519) koder signert brukeridentitet og utløpstidspunkt med en hemmelig nøkkel (HMAC SHA-256) eller et asymmetrisk nøkkelpar (RS256).

Serveren verifiserer den kryptografiske signaturen tilstandsløst uten databasespørringer for hver innkommende forespørsel. For god sikkerhet må mobilapplikasjonen benytte kort levetid på tilgangstokens (for eksempel 15 minutter) sammen med et fornyelsestoken lagret i enhetens sikre maskinvarelager. Når tilgangstokenet utløper, fornyer appen det automatisk i bakgrunnen.

#OAuth 2.0 PKCE for offentlige klienter

Proof Key for Code Exchange (RFC 7636) ble utviklet spesifikt for native klienter som ikke kan holde på en hemmelig klientnøkkel.

Under pålogging genererer klienten en tilfeldig kryptografisk streng (code verifier), hasher denne til en kontrollverdi (code challenge) og sender brukeren til WordPress sitt påloggingsvindu. Etter godkjenning veksler appen den midlertidige autorisasjonskoden og den opprinnelige kontrollstrengen inn i et tilgangstoken. Selv om autorisasjonskoden skulle fanges opp på enheten, kan den ikke benyttes uten den opprinnelige kontrollstrengen.


#Mediehåndtering og responsive bildeformater for mobilskjermer

Å overføre tunge skrivebordsbilder med bredde på 2400 piksler og filstørrelse på 2 MB til mobilskjermer tømmer brukernes datakvote og skaper hakking under rulling i React Native. WordPress må settes opp til å generere tilpassede dimensjoner og servere moderne WebP- eller AVIF-formater.

#Registrering av mobile bildestørrelser i WordPress

I temaets functions.php eller i en utvidelse defineres nøyaktige bildestørrelser:

function app_register_mobile_image_sizes() {
    // Miniatyrbilde for lister
    add_image_size("mobile_thumbnail", 320, 240, true);

    // Standardkort i hovedfeeden
    add_image_size("mobile_card", 640, 480, true);

    // Fullskjerms toppbilde
    add_image_size("mobile_hero", 1080, 720, array("center", "center"));
}
add_action("after_setup_theme", "app_register_mobile_image_sizes");

#Tilgjengeliggjøring av responsive bildestørrelser i API-et

Responsen fra API-et bør inneholde en ryddig oversikt over alle tilgjengelige bildestørrelser:

function app_format_attachment_sources($attachment_id) {
    if (!$attachment_id) {
        return null;
    }

    $sizes = array("mobile_thumbnail", "mobile_card", "mobile_hero", "full");
    $output = array();

    foreach ($sizes as $size) {
        $src = wp_get_attachment_image_src($attachment_id, $size);
        if ($src) {
            $output[$size] = array(
                "url"    => $src[0],
                "width"  => $src[1],
                "height" => $src[2],
            );
        }
    }

    return $output;
}

#Push-varsler via WordPress-kroker og Firebase

Push-varsler opprettholder brukerengasjement ved å varsle om nye artikler eller viktige hendelser. WordPress sine hendelseskroker fanger opp publiseringstidspunktet og sender meldinger via Firebase Cloud Messaging (FCM) eller Expo Push Service.

#Lagring av enhetstokens i WordPress

Når appen starter opp, sendes enhetstokenet til et eget endepunkt:

add_action("rest_api_init", function () {
    register_rest_route("app/v1", "/register-device", array(
        "methods"             => "POST",
        "callback"            => "app_register_device_token",
        "permission_callback" => function () {
            return is_user_logged_in() || current_user_can("read");
        },
    ));
});

function app_register_device_token($request) {
    $token    = sanitize_text_field($request->get_param("push_token"));
    $platform = sanitize_text_field($request->get_param("platform"));
    $user_id  = get_current_user_id();

    if (empty($token)) {
        return new WP_Error("invalid_token", "Enhetstoken kan ikke vaere tomt", array("status" => 400));
    }

    update_user_meta($user_id, "_app_push_token", $token);
    update_user_meta($user_id, "_app_device_platform", $platform);

    return rest_ensure_response(array("registered" => true));
}

#Utsending av varsler ved publisering av innhold

Kroken transition_post_status sikrer at varselet kun sendes når et utkast endrer status til publisert:

function app_send_post_publication_notification($new_status, $old_status, $post) {
    if ($new_status !== "publish" || $old_status === "publish" || $post->post_type !== "post") {
        return;
    }

    $title   = get_the_title($post);
    $post_id = $post->ID;

    $tokens = get_users(array(
        "meta_key"     => "_app_push_token",
        "meta_compare" => "EXISTS",
        "fields"       => array("ID"),
    ));

    $push_tokens = array();
    foreach ($tokens as $user) {
        $token = get_user_meta($user->ID, "_app_push_token", true);
        if ($token) {
            $push_tokens[] = $token;
        }
    }

    if (empty($push_tokens)) {
        return;
    }

    $payload = array();
    foreach ($push_tokens as $t) {
        $payload[] = array(
            "to"    => $t,
            "sound" => "default",
            "title" => "Ny artikkel: " . $title,
            "body"  => wp_trim_words(get_the_excerpt($post), 20),
            "data"  => array("postId" => $post_id, "slug" => $post->post_name),
        );
    }

    wp_remote_post("https://exp.host/--/api/v2/push/send", array(
        "headers" => array(
            "Content-Type" => "application/json",
            "Accept"       => "application/json",
        ),
        "body"    => wp_json_encode($payload),
        "timeout" => 10,
    ));
}
add_action("transition_post_status", "app_send_post_publication_notification", 10, 3);

#Tilstandshåndtering og frakoblet synkronisering med TanStack Query og SQLite

Mobiltelefoner mister jevnlig nettforbindelsen i tunneler, tog eller områder med svak mobildekning. En pålitelig React Native-app må vise lokalt lagret innhold umiddelbart og legge brukerhandlinger i en lokal synkroniseringskø.

#Oppsett av TanStack Query med AsyncStorage

TanStack Query håndterer oppdatering av hurtigminne, bakgrunnshenting og ventetilstander:

import React from "react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { createAsyncStoragePersister } from "@tanstack/query-async-storage-persister";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { persistQueryClient } from "@tanstack/react-query-persist-client";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      gcTime: 1000 * 60 * 60 * 24 * 7,
      staleTime: 1000 * 60 * 5,
      retry: 2,
    },
  },
});

const asyncStoragePersister = createAsyncStoragePersister({
  storage: AsyncStorage,
  key: "WORDPRESS_QUERY_CACHE",
});

persistQueryClient({
  queryClient,
  persister: asyncStoragePersister,
  maxAge: 1000 * 60 * 60 * 24 * 7,
});

export const AppQueryProvider = ({ children }: { children: React.ReactNode }) => {
  return (
    <QueryClientProvider client={queryClient}>
      {children}
    </QueryClientProvider>
  );
};

#Relasjonsdatabase med SQLite for bokmerker og frakoblet skrivekø

For å lagre fullstendige artikler og håndtere brukerhandlinger uten nett leverer Expo SQLite svært høy ytelse:

import * as SQLite from "expo-sqlite";

const db = SQLite.openDatabaseSync("app_wordpress_cache.db");

export const initializeDatabase = () => {
  db.execSync(`
    CREATE TABLE IF NOT EXISTS offline_posts (
      id INTEGER PRIMARY KEY NOT NULL,
      slug TEXT UNIQUE NOT NULL,
      title TEXT NOT NULL,
      summary TEXT,
      content TEXT,
      featured_image_url TEXT,
      cached_at INTEGER NOT NULL
    );

    CREATE TABLE IF NOT EXISTS offline_mutation_queue (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      endpoint TEXT NOT NULL,
      method TEXT NOT NULL,
      payload TEXT NOT NULL,
      created_at INTEGER NOT NULL
    );
  `);
};

export const savePostOffline = (post: {
  id: number;
  slug: string;
  title: string;
  summary: string;
  content: string;
  featuredImageUrl: string;
}) => {
  const statement = db.prepareSync(`
    INSERT OR REPLACE INTO offline_posts (id, slug, title, summary, content, featured_image_url, cached_at)
    VALUES ($id, $slug, $title, $summary, $content, $featuredImageUrl, $cachedAt);
  `);

  statement.executeSync({
    $id: post.id,
    $slug: post.slug,
    $title: post.title,
    $summary: post.summary,
    $content: post.content,
    $featuredImageUrl: post.featuredImageUrl,
    $cachedAt: Date.now(),
  });
};

export const replayOfflineMutations = async (authToken: string) => {
  const pending = db.getAllSync<{
    id: number;
    endpoint: string;
    method: string;
    payload: string;
  }>("SELECT * FROM offline_mutation_queue ORDER BY created_at ASC;");

  for (const item of pending) {
    try {
      const response = await fetch(`https://your-wordpress-site.com/wp-json/${item.endpoint}`, {
        method: item.method,
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${authToken}`,
        },
        body: item.payload,
      });

      if (response.ok) {
        db.runSync("DELETE FROM offline_mutation_queue WHERE id = ?", [item.id]);
      }
    } catch {
      break;
    }
  }
};

#Hvordan gjøre en WordPress React Native-app rask

Ytelsesoptimalisering forutsetter et samspill mellom serverkonfigurasjon, nettverksbufring og JavaScript-kjøretiden i React Native.

#Objekthurtigminne og kantbufring via CDN

Å belaste serveren med titalls databasespørringer ved hver app-start tømmer maskinvarens ressurser:

  1. Redis Object Cache: Lagrer spørringer etter innlegg og taksonomier i serverens RAM, og kutter responstiden fra 400 ms til 40 ms.
  2. Nginx FastCGI microcaching: Bufrer offentlige GET-kall på rutene /wp-json/wp/v2/posts og /wp-json/app/v1/feed i 60 til 180 sekunder på webserveren.
  3. Tagger for kantbufring i CDN: Cloudflare leverer innhold fra servere nær brukeren. Ved publisering tømmer et webhook-kall den aktuelle hurtigminnetaggen umiddelbart.

#Listevirtualisering og jevn rulling

For å vise lange innholdsoversikter benyttes den virtualiserte komponenten FlatList:

import React, { useCallback } from "react";
import { FlatList, View, Text, Image, StyleSheet, ListRenderItem } from "react-native";

interface ArticleItem {
  id: number;
  title: string;
  summary: string;
  media: { card?: string };
}

export const FeedList = ({ articles }: { articles: ArticleItem[] }) => {
  const renderItem: ListRenderItem<ArticleItem> = useCallback(({ item }) => (
    <View style={styles.card}>
      {item.media.card ? (
        <Image
          source={{ uri: item.media.card }}
          style={styles.cardImage}
          resizeMode="cover"
        />
      ) : null}
      <View style={styles.textContainer}>
        <Text style={styles.title}>{item.title}</Text>
        <Text style={styles.summary} numberOfLines={2}>{item.summary}</Text>
      </View>
    </View>
  ), []);

  const keyExtractor = useCallback((item: ArticleItem) => item.id.toString(), []);

  return (
    <FlatList
      data={articles}
      renderItem={renderItem}
      keyExtractor={keyExtractor}
      initialNumToRender={6}
      maxToRenderPerBatch={8}
      windowSize={5}
      removeClippedSubviews={true}
    />
  );
};

const styles = StyleSheet.create({
  card: {
    backgroundColor: "#ffffff",
    borderRadius: 8,
    marginHorizontal: 16,
    marginVertical: 8,
    overflow: "hidden",
  },
  cardImage: {
    width: "100%",
    height: 180,
  },
  textContainer: {
    padding: 16,
  },
  title: {
    fontSize: 18,
    fontWeight: "bold",
    color: "#111827",
  },
  summary: {
    fontSize: 14,
    color: "#4b5563",
    marginTop: 6,
  },
});

#Sikring av WordPress-backend for mobile applikasjoner

Siden mobile app-filer kan dekompileres av uvedkommende, må privilegerte databasetilganger, administratorpassord og ubegrensede API-nøkler aldri legges inn i klientkoden.

#Sikker tokenlagring med SecureStore

Brukerspesifikke tokens skal utelukkende oppbevares i operativsystemets krypterte maskinvarelager:

import * as SecureStore from "expo-secure-store";

export const storeAuthToken = async (token: string): Promise<void> => {
  await SecureStore.setItemAsync("user_jwt_token", token, {
    keychainAccessible: SecureStore.WHEN_UNLOCKED,
  });
};

export const getAuthToken = async (): Promise<string | null> => {
  return await SecureStore.getItemAsync("user_jwt_token");
};

export const clearAuthSession = async (): Promise<void> => {
  await SecureStore.deleteItemAsync("user_jwt_token");
};

#Sikkerhetshoder og reduksjon av angrepsflate

I WordPress-oppsettet aktiveres strenge sikkerhetshoder for alle REST-svar, samtidig som versjonsnumre skjules:

add_action("rest_api_init", function () {
    add_filter("rest_pre_serve_request", function ($value) {
        header("X-Content-Type-Options: nosniff");
        header("X-Frame-Options: DENY");
        header("Referrer-Policy: strict-origin-when-cross-origin");
        return $value;
    });

    remove_action("template_redirect", "rest_output_link_header", 11);
});

#Reelle arkitekturavveininger i produksjonsmiljøer

Drift av en hodeløs arkitektur krever bevisste vurderinger av tekniske kompromisser mellom serveren og mobilklienten.

#Datakonsistens mellom kantservere og enhetsminne

I en nettleser kan brukeren tvinge gjennom en oppdatering, mens en mobilapp må synkronisere data automatisk i bakgrunnen. Når redaksjonen endrer en artikkel, berører det tre lag med hurtigminne:

  • Opprinnelsesserver: Redis-nøkler må tømmes via WordPress sine lagringskroker.
  • Omvendt proxy på kantservere: Cloudflare må motta en slettekommando via sitt API.
  • Lokal SQLite-database på telefonen: React Native må sjekke tidsstempler eller lytte etter et stille push-signal for å oppdatere lagrede artikler uten å forstyrre brukeren.

Et lettvekts endepunkt for synkroniseringsstatus (/wp-json/app/v1/sync-status) gjør det mulig for appen å verifisere om lokale data er oppdaterte med en forespørsel på 200 byte, før den laster ned store JSON-feeder på nytt.

#Innholdsmodellering: egendefinerte felter versus blokkparsing

Redaktører foretrekker ofte blokkredigeringsverktøyet Gutenberg. Å tolke rå HTML i React Native ved hjelp av tredjepartsbiblioteker kan imidlertid gjøre rullingen treg på rimeligere telefoner.

I produksjon velger utviklere mellom to løsninger:

  • Strukturerte egendefinerte felter (ACF eller Carbon Fields): Leverer rene datastrukturer (tabeller med strenger, bilde-ID-er) som knyttes direkte til native React Native-komponenter.
  • Blokkparsing på serversiden: WordPress transformerer blokkstrukturen til AST-objekter i JSON-format før svaret sendes. Dette gir redaktørene full visuell frihet, mens appen rendrer native visninger i stedet for trege WebView-komponenter.

#Testrutiner og overvåking av API-kontrakter

Stabil produksjonsdrift krever kontinuerlig overvåking og automatiserte grensesnittester.

#Kontrakttesting og vern mot skjemaregresjoner

En uventet endring i en WordPress-utvidelse kan forandre strukturen på et JSON-objekt og føre til at mobilappen krasjer. Gode rutiner i CI/CD inkluderer:

  1. Automatiserte integrasjonstester med Vitest eller Newman som validerer endepunktet /wp-json/app/v1/feed mot et definert JSON Schema.
  2. Overvåking av serverens responstid (TTFB) med verktøy som Sentry eller Grafana for å oppdage forsinkelser over 250 millisekunder på bufrede forespørsler.
  3. Belastningstester som simulerer tusenvis av samtidige enhetsforespørsler etter utsendelse av et push-varsel.

#API-versjonering for eldre appversjoner

I motsetning til nettsider der ny kode rulles ut umiddelbart til alle, forblir eldre app-versjoner installert på brukernes telefoner i mange måneder. Endringer i datastrukturer må versjoneres i URL-navnerommet (som /wp-json/app/v1/ og /wp-json/app/v2/), slik at bakoverkompatibiliteten bevares for brukere som ikke har oppdatert appen.


#Nettverkssikkerhet og sertifikatvalidering i mobile apper

Mobile enheter kobler seg jevnlig til åpne eller usikrede trådløse nettverk på kafeer, flyplasser og togstasjoner. For å forhindre avlytting eller manipulasjon av datatrafikken (Man-in-the-Middle) kreves det ytterligere sikkerhetstiltak utover ordinære TLS-sertifikater.

#Implementering av SSL-pinning i React Native

Ved å låse sertifikatet (SSL-pinning) sammenligner mobilapplikasjonen serverens offentlige nøkkel eller sertifikatavtrykk mot en forhåndsdefinert hash-verdi i applikasjonskoden. Dersom en angriper forsøker å skyve inn et forfalsket sertifikat, avbrytes dataoverføringen øyeblikkelig:

  1. Bruk av native nettverksbiblioteker som react-native-ssl-pinning eller tilpassede nettverkslag i Expo for å validere serversertifikatet før overføring av sensitive tokens.
  2. Nøkkelrotasjon: Fordi TLS-sertifikater fornyes jevnlig, må reservenøkler for fremtidige sertifikater legges inn i klientkoden i god tid før eksisterende sertifikater utløper.
  3. Blokkering av usikret trafikk: Gjennom Android Network Security Config og iOS App Transport Security (ATS) blokkeres ukryptert HTTP-kommunikasjon direkte på operativsystemnivå.

#JSON-LD-skjema for denne React Native-guiden

{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "WordPress som backend for mobilapper: React Native-guide",
  "description": "Teknisk guide om bruk av WordPress som hodeløs backend for React Native og Expo.",
  "author": {
    "@type": "Organization",
    "name": "WPPoland"
  },
  "datePublished": "2026-01-29",
  "dateModified": "2026-10-12",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://wppoland.com/nb/wordpress-backend-mobile-apps-react-native/"
  }
}
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Hvordan bruke WordPress som backend for React Native-apper",
  "description": "Steg-for-steg-veiledning for å bygge mobilapper med hodeløs WordPress som publiseringsløsning",
  "totalTime": "PT4H",
  "supply": [
    "WordPress-installasjon",
    "Node.js og npm-miljø",
    "React Native-utviklingsmiljø"
  ],
  "step": [
    {
      "@type": "HowToStep",
      "position": 1,
      "name": "Konfigurer WordPress-backend",
      "text": "Implementering av WP_REST_Controller eller WPGraphQL-skjemaer for mobile endepunkter."
    },
    {
      "@type": "HowToStep",
      "position": 2,
      "name": "Sett opp autentisering",
      "text": "Etablering av JWT- eller OAuth 2.0 PKCE-arbeidsflyter med maskinvarebasert lagring."
    },
    {
      "@type": "HowToStep",
      "position": 3,
      "name": "Knytt til medier og push-varsler",
      "text": "Definisjon av mobile bildestorrelser og utsending av push-varsler via WordPress-hendelser."
    },
    {
      "@type": "HowToStep",
      "position": 4,
      "name": "Styr tilstand og frakoblet lagring",
      "text": "Oppsett av TanStack Query-persistens og SQLite for uavbrutt drift uten nettforbindelse."
    }
  ]
}

For utvikling og rådgivning kan du lese mer om våre tjenester som WordPress-utvikler.

Neste steg

Gjør artikkelen om til faktisk implementering

Denne blokken styrker intern lenking og sender leseren videre til de mest relevante tjenestene og innholdet.

Vil du få dette implementert på nettstedet ditt?

Hvis du vil gjøre kunnskapen i artikkelen om til konkrete forbedringer, redesign eller en tydelig leveranseplan, kan jeg ta det videre.

Relevant klynge

Utforsk andre WordPress-tjenester og kunnskapsbase

Styrk virksomheten din med profesjonell teknisk støtte innen kjerneområdene i WordPress-økosystemet.

Artikkel-FAQ

Ofte stilte spørsmål

Praktiske svar for å bruke temaet i faktisk arbeid.

SEO-readyGEO-readyAEO-ready3 Q&A
Kan WordPress virkelig fungere som backend for en React Native-app#
Ja. WordPress eksponerer innhold via REST API siden 4.7 og via GraphQL med WPGraphQL-tillegget. Sammen med JWT-autentisering og Redis-caching fungerer det som et produksjonsklart innholds-API for native mobilklienter, uten kostnaden ved å bygge en egen backend fra bunnen av.
Bør jeg bruke REST eller GraphQL med WordPress til mobil#
REST ligger i kjernen, krever ingen tillegg og fungerer godt for lesetunge innholdslister. GraphQL via WPGraphQL er bedre når du må hente nøstede relasjoner i én og samme forespørsel, som er vanlig for produktsider eller artikler med relatert innhold.
Hva kan gå galt med headless WordPress på mobil#
Å treffe REST API-et uten caching gjør hver skjermvisning til en databasespørring og svekker responsen i appen. Uten JWT eller signerte tokens står endepunktene åpne for misbruk. Feil CORS-oppsett på WordPress-siden hindrer React Native-klienten i å motta svar i utviklingsbygg.

Trenger du FAQ tilpasset bransje og marked? Vi lager en versjon som støtter dine forretningsmål.

Ta kontakt

Relaterte artikler