Cum să actualizezi/introduci date în câmpuri personalizate (post meta) folosind WordPress REST API?

11 ian. 2018, 08:10:31
Vizualizări: 18.1K
Voturi: 4

Încerc să adaug date personalizate pentru postări (post meta data) prin intermediul WordPress API dar întâmpin dificultăți la actualizarea/adăugarea datelor personalizate. Mai jos este codul pe care îl folosesc.

Cod scris în functions.php

    add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'numele-tipului-de-postare', 'numele-campului-de-returnat', array-de-callback-uri-si-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 ) {
 //obține id-ul din array-ul obiectului postării
 $post_id = $object['id'];

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

 function create_api_posts_meta_field_time() {

// register_rest_field ( 'numele-tipului-de-postare', 'numele-campului-de-returnat', array-de-callback-uri-si-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 ) {
 //obține id-ul din array-ul obiectului postării
 $post_id = $object['id'];

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

Fișierul JS inclus în pagina la care lucrez

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("Eroare - încearcă din nou");
                        }
                    }
                }


        });
    }

Acest cod funcționează pentru câmpurile implicite, adică se creează o postare nouă dar conține doar titlu și conținut.

Editare: Când am încercat să depanez, am descoperit că update_callback nu se execută, dar get_callback se execută.

4
Comentarii

de unde nu preiei valorile? minimul de depanare este să afișezi conținutul variabilelor care nu conțin valoarea așteptată.

mmm mmm
11 ian. 2018 20:31:43

scuze, nu înțeleg ce întrebi

Varun Naharia Varun Naharia
12 ian. 2018 04:50:03

Poți să reduci problema la strictul necesar pentru a reproduce eroarea? Există mult cod suplimentar care face mai grea citirea.

janh janh
15 ian. 2018 16:49:00

@janh este cod minim.

Varun Naharia Varun Naharia
16 ian. 2018 06:58:59
Toate răspunsurile la întrebare 2
0

Tocmai am rulat un test cu codul tău și, în opinia mea, acesta nu funcționează pentru că ai o eroare în funcția get_callback.

Prima dată va încerca să obțină subtitle (sau timing_of_experience), dar va declanșa o eroare pentru că nu există de la început, iar această eroare va bloca înregistrarea update_callback.

Deci, problema este că în get_callback cheia Subtitle are un S majuscul, iar acesta nu este modul în care este salvată.

În al doilea rând, ar trebui să respecți regula generală de validare a datelor și să verifici dacă valoarea există înainte de a încerca să o accesezi. Astfel:

function get_post_meta_for_api( $object ) {
    //obține id-ul din array-ul obiectului post
    $post_id = $object['id'];

    $meta = get_post_meta( $post_id );

    if ( isset( $meta['subtitle' ] ) && isset( $meta['subtitle' ][0] ) ) {
        //returnează meta postului
        return $meta['subtitle' ][0];
    }

    // meta negăsită
    return false;
}

Cum am spus, am rulat un test, înlocuind tipul tău de post experience cu post și funcționează.

Bonus, ar trebui să încerci să îți organizezi codul mai bine, deoarece este greu de citit cu această indentare și ordine a funcțiilor. De asemenea, pentru update_callback un simplu return true este suficient.

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 ian. 2018 18:00:01
1

Puteți scrie date personalizate pentru articole folosind codul de mai jos. Am scris categorii pentru tipul de articol personalizat "ad_portfolio" și imaginea reprezentativă în API-ul WordPress folosind codul de mai jos. Sper să vă fie de ajutor. Mulțumesc

    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);
//tipul de articol este "ad_portfolio"
16 ian. 2018 19:28:01
Comentarii

Mulțumesc pentru răspuns, dar nu pare să fie soluția pe care am cerut-o. Poți să explici cum va funcționa și de ce codul meu nu funcționează?

Varun Naharia Varun Naharia
17 ian. 2018 07:04:36