Come aggiornare/inserire dati di campi personalizzati (post meta) con l'API REST di WordPress?

11 gen 2018, 08:10:31
Visualizzazioni: 18.1K
Voti: 4

Sto cercando di aggiungere dati personalizzati dei post (post meta data) attraverso l'API di WordPress ma sto riscontrando difficoltà nell'aggiornare/aggiungere i dati personalizzati. Questo è il codice che sto utilizzando.

Codice scritto in functions.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {
    // register_rest_field ( 'nome-del-tipo-di-post', 'nome-del-campo-da-restituire', array-di-callback-e-schema() )
    register_rest_field( 'experience', 'subtitle', array(
        'get_callback' => 'get_post_meta_for_api',
        'update_callback' => 'update_post_meta_for_exp',
        'schema' => null,
    ));
}

function update_post_meta_for_exp($object, $meta_value ) {
    $havemetafield = get_post_meta($object['id'], 'experience', false);
    if ($havemetafield) {
        $ret = update_post_meta($object['id'], 'subtitle', $meta_value );
        return true;
    } else {
        $ret = add_post_meta( $object['id'], 'subtitle', $meta_value ,true );
        return true;
    }
}

function get_post_meta_for_api( $object ) {
    //ottiene l'id dall'array dell'oggetto post
    $post_id = $object['id'];

    //restituisce il post meta
    return get_post_meta( $post_id )["Subtitle"][0];
}

function create_api_posts_meta_field_time() {
    // register_rest_field ( 'nome-del-tipo-di-post', 'nome-del-campo-da-restituire', array-di-callback-e-schema() )
    register_rest_field( 'experience', 'timing_of_experience', array(
        'get_callback' => 'get_post_meta_for_api_time',
        'update_callback' => function($meta_value ) {
            $havemetafield = get_post_meta(1, 'experience', false);
            if ($havemetafield) {
                $ret = update_post_meta(1, 'timing_of_experience', $meta_value );
                return true;
            } else {
                $ret = add_post_meta( 1, 'timing_of_experience', $meta_value ,true );
                return true;
            }
        },
        'schema' => null,
    ));
}

function get_post_meta_for_api_time( $object ) {
    //ottiene l'id dall'array dell'oggetto post
    $post_id = $object['id'];

    //restituisce il post meta
    return get_post_meta( $post_id )["timing_of_experience"][0];
}

File JS incluso nella pagina su cui sto lavorando

var quickAddExperience = document.querySelector("#quick-add-experience");

if (quickAddExperience) {
    quickAddExperience.addEventListener("click",function() {
        var ourPostData = {
            'title'                  : document.getElementById('title').value,
            'content'                : document.getElementById('content').value,
            'subtitle'               : document.getElementById('company_name').value,
            'timing_of_experience'   : document.getElementById('time_period').value,
            'status'                 : 'publish'
        }

        console.log(ourPostData);
        var createPost = new XMLHttpRequest();
        createPost.open("POST", magicalData.siteURL + "/wp-json/wp/v2/experience-api");
        createPost.setRequestHeader("X-WP-Nonce", magicalData.nonce);
        createPost.setRequestHeader("Content-Type","application/json;charset=UTF-8");
        createPost.send(JSON.stringify(ourPostData));
        createPost.onreadystatechange = function(){
            if (createPost.readystate == 4) {
                if (createPost.status == 201) {
                    document.querySelector('.data-api-post-1 [name="title"]').value ='';
                    document.querySelector('.data-api-post-1 [name="content"]').value ='';
                    document.querySelector('.data-api-post-1 [name="company_name"]').value ='';
                    document.querySelector('.data-api-post-1 [name="time_period"]').value ='';
                }else{
                    alert("Errore - riprova");
                }
            }
        }
    });
}

Questo codice funziona per i campi predefiniti, significa che il nuovo post viene creato ma ci sono solo titolo e contenuto.

Modifica: Quando ho provato a fare il debug ho scoperto che il codice update_callback non viene eseguito mentre get_callback viene eseguito.

4
Commenti

dove non recuperi i valori? Il minimo del debug è mostrare il contenuto delle variabili che non contengono il valore atteso.

mmm mmm
11 gen 2018 20:31:43

scusa non ho capito cosa stai chiedendo

Varun Naharia Varun Naharia
12 gen 2018 04:50:03

Puoi ridurlo al minimo indispensabile per riprodurre il problema? C'è molto codice extra che rende più difficile la lettura.

janh janh
15 gen 2018 16:49:00

@janh è il codice minimo.

Varun Naharia Varun Naharia
16 gen 2018 06:58:59
Tutte le risposte alla domanda 2
0

Ho appena eseguito un test con il tuo codice e secondo me non funziona perché hai un errore nella funzione get_callback.

La prima volta proverà a ottenere il subtitle (o il timing_of_experience) ma genererà un errore perché non esiste ancora e questo errore bloccherà la registrazione del update_callback.

Quindi, il problema è che nel get_callback la chiave Subtitle ha una S maiuscola e non è così che viene salvata.

In secondo luogo, dovresti rispettare la regola generale di validare i dati e verificare se il valore esiste prima di tentare di accedervi. In questo modo:

function get_post_meta_for_api( $object ) {
    // Ottieni l'id dell'array dell'oggetto post
    $post_id = $object['id'];

    $meta = get_post_meta( $post_id );

    if ( isset( $meta['subtitle'] ) && isset( $meta['subtitle'][0] ) ) {
        // Restituisci il post meta
        return $meta['subtitle'][0];
    }

    // Meta non trovato
    return false;
}

Come ho detto, ho eseguito un test, sostituendo il tuo post type experience con post e funziona.

Come suggerimento bonus, dovresti cercare di organizzare meglio il tuo codice perché è difficile da leggere con questa indentazione e ordine delle funzioni. Inoltre, per il update_callback è sufficiente un semplice return true.

function update_post_meta_for_exp($object, $meta_value ) {
    $havemetafield  = get_post_meta($object['id'], 'experience', false);
    if ($havemetafield) {
        $ret = update_post_meta($object['id'], 'subtitle', $meta_value );
    } else {
        $ret = add_post_meta( $object['id'], 'subtitle', $meta_value ,true );
    }
    return true;
}
20 gen 2018 18:00:01
1

Puoi scrivere dati personalizzati per i post utilizzando il codice qui sotto. Ho scritto un custom post type "ad_portfolio" con categorie e immagine in evidenza nell'API di WordPress usando questo codice. Spero sia utile. Grazie

    function prepare_rest($data, $post, $request){
    $_data = $data->data;

    $thumbnail_id = get_post_thumbnail_id( $post->ID );
    $featured_media_url = wp_get_attachment_image_src( $thumbnail_id, 'large' );

    $post_categories = wp_get_post_terms( $post->ID, 'ad_portfolios' , array("fields" => "all") );
    $cats = array();

    foreach($post_categories as $cat){
        $cats[] = ['slug' => $cat->slug, 'name' => $cat->name ];
    }

    $_data['featured_media_url'] = $featured_media_url[0];
    $_data['portfolio_cats'] = $cats;
    $data->data = $_data;

    return $data;
}
add_filter('rest_prepare_ad_portfolio', 'prepare_rest', 10, 3);
//il post type è "ad_portfolio"
16 gen 2018 19:28:01
Commenti

Grazie per la risposta ma non sembra la soluzione che ho chiesto, potresti spiegare come funzionerà e perché il mio codice non sta funzionando?

Varun Naharia Varun Naharia
17 gen 2018 07:04:36