Metadata in custom post type zetten via WP API

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • De_Bastaard
  • Registratie: Oktober 2001
  • Laatst online: 13:56
ik gebruik op mijn WP website een theme om een 'directory' te maken waarin ik allerlei bedrijven wil listen.

Deze bedrijven (een listing) maak ik aan via de WP API, maar het vullen van de metadata wilt maar niet lukken.

Om dit type post (custom post type) via de API aan te kunnen maken heb ik wat aanpassingen gedaan in o.a. functions.php om dit type open te zetten voor de API. So far, so good.

Als ik nu vanuit mijn WP back-end een nieuw post van dit type maak en deze metadata velden vul dan zie ik dit ook terug als ik de posts van dit type ophaal via de API, inclusief de metadata:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
{
    "id": 10575,
    "date": "2018-03-23T20:33:40",
    "date_gmt": "2018-03-23T20:33:40",
    "guid": {
        "rendered": "http:\/\/mijnurl.com\/?post_type=lv_listing&p=10575"
    },
    "modified": "2018-03-23T20:33:40",
    "modified_gmt": "2018-03-23T20:33:40",
    "slug": "test-meta",
    "status": "publish",
    "type": "lv_listing",
    "link": "http:\/\/mijnurl.com\/listing\/test-meta\/",
    "title": {
        "rendered": "test meta"
    },
    "content": {
        "rendered": "<p>alksdjakl<\/p>\n",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>asdasda<\/p>\n",
        "protected": false
    },
    "author": 2,
    "featured_media": 0,
    "comment_status": "closed",
    "ping_status": "closed",
    "template": "",
    "listing_amenities": [],
    "listing_category": [430],
    "listing_location": [],
    "listing_keyword": [],
    "metadata": {
        "_edit_lock": ["1521837220:1"],
        "_edit_last": ["1"],
        "slide_template": ["default"],
        "jvfrm_spot_control_options": [""],
        "_vc_post_settings": ["a:1:{s:10:\"vc_grid_id\";a:0:{}}"],
        "_tagline": [""],
        "_website": ["www.hierkomteenurl.com"],
        "_email": [""],
        "_address": [""],
        "_phone1": [""],
        "_phone2": [""],
        "_facebook_link": [""],
        "_twitter_link": [""],
        "_instagram_link": [""],
        "_google_link": [""],
        "_linkedin_link": [""],
        "_youtube_link": [""],
        "detail_images": [""],
        "lv_listing_lat": ["0"],
        "lv_listing_lng": ["0"],
        "lv_listing_street_visible": ["0"],
        "lv_listing_street_lat": ["0"],
        "lv_listing_street_lng": ["0"],
        "lv_listing_street_heading": ["0"],
        "lv_listing_street_pitch": ["0"],
        "lv_listing_street_zoom": ["0"],
        "_featured_item": ["0"],
        "the_grid_item_custom_link_target": ["_self"],
        "the_grid_item_col": ["1"],
        "the_grid_item_row": ["1"],
        "the_grid_item_content_color": ["dark"],
        "the_grid_item_overlay_color": ["light"],
        "the_grid_item_video_ratio": ["4:3"],
        "the_grid_item_youtube_ratio": ["4:3"],
        "the_grid_item_vimeo_ratio": ["4:3"],
        "the_grid_item_wistia_ratio": ["4:3"]
    },
    "_links": {
        "self": [{
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/lv_listing\/10575"
        }],
        "collection": [{
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/lv_listing"
        }],
        "about": [{
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/types\/lv_listing"
        }],
        "author": [{
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/users\/2"
        }],
        "replies": [{
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/comments?post=10575"
        }],
        "wp:attachment": [{
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/media?parent=10575"
        }],
        "wp:term": [{
            "taxonomy": "listing_amenities",
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/listing_amenities?post=10575"
        },
        {
            "taxonomy": "listing_category",
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/listing_category?post=10575"
        },
        {
            "taxonomy": "listing_location",
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/listing_location?post=10575"
        },
        {
            "taxonomy": "listing_keyword",
            "embeddable": true,
            "href": "http:\/\/mijnurl.com\/wp-json\/wp\/v2\/listing_keyword?post=10575"
        }],
        "curies": [{
            "name": "wp",
            "href": "https:\/\/api.w.org\/{rel}",
            "templated": true
        }]
    }
}


Wanneer ik nu echter via de API een nieuwe post van dit type wil maken mét daarin een of meerdere gevulde metadata velden dan worden deze metadata velden niet opgeslagen. De post van dit specifieke type wordt verder gewoon aangemaakt, alleen de metadata niet.

Het gaat volgens mij over zogenaamde 'protected' metadata velden omdat het velden van een plugin zijn. Ze beginnen allemaal in elk geval met een underscore, zoals _website, _facebook, e.d.

Dit heb ik toegevoegd aan mijn functions.php om de metadata velden open te zetten voor de API:

code:
1
2
3
4
register_rest_field( 'lv_listing', 'metadata', array(
    'get_callback' => function ( $data ) {
        return get_post_meta( $data['id'], '', '' );
    }, ));


Mijn request ziet er bijv. zo uit:

code:
1
2
3
4
5
6
7
8
9
10
{
"title":"test meta",
"content":"<p>alksdjakl</p>\n",
"excerpt":"<p>asdasda</p>\n"
,"author":0
,"listing_category":[388]
,"metadata":{"_linkedin_link":[
            "tralala.com"
         ]}
}


Heeft iemand een idee? Ik vermoed dat ik ergens iets kleins over het hoofd zie waardoor ik geen metadata mag updaten, maar ik weet niet wat. De rol van mijn user is Admin en zou alles moeten mogen ..

Alle reacties


Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Nu online
Niet een antwoord op je vraag, maar aangezien je volledige access hebt tot de files etc, waarom wil je de API gebruiken? Het is nl veel efficienter om het gewoon rechtstreeks in WP te doen?

Je kunt evt WP functionaliteit in je custom scriptje krijgen door de wp-load te includen.

Acties:
  • 0 Henk 'm!

  • De_Bastaard
  • Registratie: Oktober 2001
  • Laatst online: 13:56
Je bedoelt het inladen via die Import tool?

Ik gebruik Mendix om mijn dataset te maken en vanuit Mendix kan ik niet dat (enigszins maffe) RSS formaat genereren. Een webservice (rest of soap) is geen probleem :)

Acties:
  • 0 Henk 'm!

  • Maaark
  • Registratie: Juli 2008
  • Nu online
De_Bastaard schreef op vrijdag 23 maart 2018 @ 21:53:
Je bedoelt het inladen via die Import tool?

Ik gebruik Mendix om mijn dataset te maken en vanuit Mendix kan ik niet dat (enigszins maffe) RSS formaat genereren. Een webservice (rest of soap) is geen probleem :)
WP all import zou je idd ook kunnen gebruiken, dat is misschien nog wel het makkelijkste :)

Ik doelde eigenlijk meer op een zelf gemaakt PHP scriptje dat je data uitleest en de insert uitvoert en de meta data updatet. Dus eigenlijk wat WP all import al voor je doet :P

En als je het echt gebonden bent aan een request dam is het misschien handig om wat meer info over de daadwerkelijke request te sturen, zoals url of zelfs het volledige CURL request.

Acties:
  • 0 Henk 'm!

  • De_Bastaard
  • Registratie: Oktober 2001
  • Laatst online: 13:56
Het probleem is een beetje dat ik 0.0 PHP skills heb maar wel goed ben met Mendix :')

Zal morgen even de hele request posten, maar kan ik misschien ook ergens de logging van de wp API vinden? Ik krijg een 200/201 terug dus daar zal geen fout in staan. Misschien wordt er ergens nog een reden gelogd waarom de meta niet kan worden geüpdate?

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 06-10 14:43

TheDane

1.618

Heb je niet de register_meta() functie nodig ipv register_rest_field() ?

https://developer.wordpre...-api/modifying-responses/

Acties:
  • 0 Henk 'm!

  • De_Bastaard
  • Registratie: Oktober 2001
  • Laatst online: 13:56
Not sure.

Is register_meta niet nodig om het veld te registreren in plaats van het vullen ervan?

Acties:
  • 0 Henk 'm!

  • De_Bastaard
  • Registratie: Oktober 2001
  • Laatst online: 13:56
Inmiddels heb ik het "redelijk" aan de praat.

Ik kan nu via de REST API posts van mijn custom type aanmaken en de meta velden vullen. Het enige waar ik echter tegenaan loop is dat een meta veld (bijv. _website) meerdere waardes kan hebben. Als ik via de backend een nieuw post aanmaak van dit type en "test.com" invul als adres voor het custom field "_website", dan wordt dit in JSON via de GET method getoond als:

"_website":["test.com", "test.com"]

Waarom dit gedaan wordt is me vooralsnog een raadsel, want de velden zijn bedoeld om maar één waarde te hebben, zoals "website", "facebook link", "linkedin link". Mochten er bijvoorbeeld meerdere telefoonnummers aanwezig zijn, dan heb je een veld "phonenumber1" en "phonenumber2".

Voor de geinteresseerden, dit is de extra actie die ik heb toegevoegd aan mijn functions.php:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
add_action( 'rest_api_init', function () {
    register_rest_field( 'lv_listing', 'meta', array(
        'get_callback' => function( $data ) {
            $listing_obj = get_post_meta( $data['id'], '', false );
            return $listing_obj;
        },
        'update_callback' => function($value, $listing_obj, $field_name ) {
            foreach ($value as $key => $value) {
                #post id to link meta to
                error_log($listing_obj->ID);
                #name of the meta field to update/add
                error_log($key);
                #value of the meta field
                error_log($value);
                update_post_meta($listing_obj->ID, $key, $value);
            }
            return true;
        },
         'schema' => null,
    ) );
} );
  • $listing_obj->ID = is het ID van de post waaraan de meta gelinked moet worden
  • $key = naam van het te updaten meta veld
  • $value = de waarde van het toe te voegen meta veld
Vervolgens moet je voor elk object in de array (want je krijgt een array aan meta) de update_post_meta functie gebruiken. Als de meta nog niet bestaat, wordt die via de update_post_meta functie vanzelf aangemaakt.

Als ik nu zoals eerder vermeld een array stuur krijg ik een 400 - Bad Request, omdat de value op het moment maar een single value mag zijn en geen array.

Ben opzich redelijk op weg nu :)

[ Voor 74% gewijzigd door De_Bastaard op 05-04-2018 09:08 ]

Pagina: 1