✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Använda WordPress Block Editor (Gutenberg) med REST API

14

I min tidigare artikel pratade jag om hur man går igenom inlägg och anpassade inläggstyper inom Gutenberg. I det här inlägget pratar jag om att ta emot och använda anpassad data inom Gutenberg från WordPress REST API-slutpunkter.

I det här exemplet ska vi:

REST API är inte alltid rätt väg.

*Vi använder get_optionendast i REST API som ett exempel. Om du bara behöver tillgång till ett alternativ och du inte tänker ändra dess tillstånd, kan du istället använda wp_localize_scriptför att skicka alternativen till JavaScript.

Om du vill komma åt ett alternativ OCH ändra dess tillstånd rekommenderar jag att du läser min guide om hur du lagrar inställningar och data i alternativtabellen med Gutenberg med hjälp av Settings API .*

Skapa en REST API-slutpunkt

Vi kommer att skapa en enkel REST API-slutpunkt som returnerar värdet av ett WordPress-alternativ (med get_option).

function wcltd_get_option() {
    register_rest_route(
        'wcltd/wholesome-plugin/v1',
        '/get/option/(?P<option>([A-Za-z0-9_])+)/',
        array(
            'callback'            => function ($request) {
                $option = isset( $request['option'] )? esc_attr( $request['option'] ): null;
                $value  = get_option( $option, '' );
                return $value;
            },
            'methods'             => 'GET',) );
}
add_action( 'rest_api_init', 'wcltd_get_option' );

Efter att du har skapat den här slutpunkten, se till att spara dina permalänkar på nytt så att de slår in. Observera att det finns bättre sätt att göra detta på (som att använda flush_rewrite_rules()register_activation_hook), men för det här exemplet räcker det med en snabb återlagring.

Nu när vi skickar webbadressen /wp-json/wcltd/wholesome-plugin/v1/get/option/test/(efter din egen domän uppenbarligen) till vår webbläsare kommer den att returnera ett värde, som antingen är en tom sträng ''eller värdet på alternativet om det är inställt.

Vår slutpunkt, returnerar en tom sträng Vår slutpunkt, returnerar en tom sträng

Notera att jag målmedvetet har kommenterat raderna 12-14, vilket skulle säkerställa att endast någon som har edit_posträttigheter kan köra koden om den lämnas inne. Men med denna kommenterade kan vi inte testa koden i vår webbläsare.

Försök att lägga till kod för att ge ditt alternativ ett värde och se vad det ger. Till exempel om jag skulle köra följande kod före min funktion:

update_option( 'wcltd_example_option', 'Hello World' );

Om jag nu träffar slutpunkten /wp-json/wcltd/wholesome-plugin/v1/get/option/wcltd_example_option/får jag följande utdata:

Vår slutpunkt, returnerar en del data.

Registrera en databutik

Nu när vi har en REST API-slutpunkt kan vi skapa ett datalager med registerStore.

registerStoretillhandahåller ett Redux-liknande datalager som gör det möjligt för oss att hantera tillstånd i hela vår applikation. Den stöder också resolvers, som gör det möjligt för oss att fylla i staten från en extern källa (som vår REST API).

Du kan läsa mer om REACT-tillståndet i den officiella dokumentationen.

Så här kan vi skapa en butik (som store.jsi vårt projekt som gör att vi kan hämta data från vår REST API-slutpunkt.

Beroenden

Vi kommer att behöva extrahera apiFetchoch registerStorefrån våra WordPress-beroenden.

import apiFetch from '@wordpress/api-fetch';
import { registerStore } from '@wordpress/data';

Väljare

Det första vi vill göra är att skapa en väljarfunktion, i ett objekt som kallas "selektorer".

Allt detta gör är att extrahera "alternativet" från staten och returnera det.

const selectors = {
    getOption( state, optionKey) {
        const { option } = state;
        return option;
    },
};

Upplösare

Resolvern är en bieffekt av väljaren och gör lite mer.

Här skapar vi vår funktion som tar vår optionKey och skickar en REST API-slutpunkt till våra åtgärder (som vi kommer att definiera härnäst).

Detta ställer sedan in alternativet, med ytterligare en uppmaning till våra handlingar.

const resolvers = {
    *getOption( optionKey) {
        const option = yield actions.getOption(
            '/wcltd/wholesome-plugin/v1/get/option/' + optionKey + '/',
        );
        return actions.setOption( option );
    },
};

Åtgärder

De två funktionerna i ett objekt med namn actionssom vi anropade tidigare definieras här.

De indikerar vilken kontroll eller reducering vi ska använda för att ställa in eller få värdet.

const actions = {
    setOption( option) {
        return {
            type: 'SET_OPTION',
            option,
        };
    },
    getOption( path) {
        return {
            type: 'GET_OPTION',
            path,
        };
    },
};

Kontroller

I våra kontroller har vi GET_OPTIONsom gör att API-anropet använder apiFetchoch den sökväg som vi definierade tidigare.

const controls = {
    GET_OPTION( action) {
        return apiFetch( { path: action.path } );
    },
};

Reducerare

I vår reducerfunktion har vi SET_OPTIONsom tar vårt värde (i detta fall optionoch ställer in dess tillstånd.

function reducer( state = { option: '' }, action) {
    switch (action.type) {
        case 'SET_OPTION':
            return {
                ...state,
                option: action.option,
            };
    }
    return state;
};

Registrering av butiken

Slutligen registrerar vi en butik, ger den ett namnutrymme så att vi kan komma åt det och skickar in ett objekt med alla ovanstående objekt och funktioner.

const store = registerStore(
    'wcltd/wholesome-plugin/data',
    {
        actions,
        controls,
        reducer,
        resolvers,
        selectors,
    }
);

export default store;

export standardbutik;

Använda data med ett block

Låt oss utöka blocket som skapats av @wordpress/create-blockskriptet som jag skrev om tidigare för att göra det möjligt för oss att ansluta till en REST API-slutpunkt.

Skapa en fil i /srcmappen som heter store.jsoch kopiera all ovanstående kod till den:

import apiFetch from '@wordpress/api-fetch';
import { registerStore } from '@wordpress/data';

const selectors = {
    getOption( state, optionKey) {
        const { option } = state;
        return option;
    },
};

const resolvers = {
    *getOption( optionKey) {
        const option = yield actions.getOption(
            '/wcltd/wholesome-plugin/v1/get/option/' + optionKey + '/',
        );
        return actions.setOption( option );
    },
};

const actions = {
    setOption( option) {
        return {
            type: 'SET_OPTION',
            option,
        };
    },
    getOption( path) {
        return {
            type: 'GET_OPTION',
            path,
        };
    },
};

const controls = {
    GET_OPTION( action) {
        return apiFetch( { path: action.path } );
    },
};

function reducer( state = { option: '' }, action) {
    switch (action.type) {
        case 'SET_OPTION':
            return {
                ...state,
                option: action.option,
            };
    }
    return state;
};

const store = registerStore(
    'wcltd/wholesome-plugin/data',
    {
        actions,
        controls,
        reducer,
        resolvers,
        selectors,
    }
);

export default store;

Redigera nu vår /src/index.jsfil för att inkludera store.jsfilen:


import store from './store';
import Edit from './edit';
import save from './save';

Vi måste också se till att vi har inkluderat withSelectöverst i vår fil:

import { withSelect } from '@wordpress/data';

Låt oss sedan slå in vår redigeringsmodul withSelectför att göra REST API-anropet till vårt alternativ, så här:


edit: withSelect( (select) => {
    const option = select( 'wcltd/wholesome-plugin/data' ).getOption( 'wcltd_example_option' );
    return {
        option,
    };
} )( Edit ),

Nu kan vi komma åt optionvåra rekvisita inom edit.js, så här:

export default function Edit( { className, option }) {
    return (<p className={ className }>
            { option }
        </p>
    );
}

Slutligen, låt oss titta på vårt block i editorn och se vad vi får:

Utdata i blockredigeraren. Utdata i blockredigeraren.

Inspelningskälla: wholesomecode.ltd

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer