Wordpress:使用API​​ Javascript更新自定义字段

时间:2018-02-12 15:25:41

标签: javascript jquery wordpress rest api

我正在尝试使用javascript和Wordpress REST API更新自定义字段。

我可以使用它轻松创建一个新帖子,它完美无缺:

var post = new wp.api.models.Post( { title: 'This is a test post' } );
post.save();

但是我需要更新帖子自定义字段。我尝试过以下代码:https://wordpress.stackexchange.com/questions/218261/wp-api-js-backbone-client-how-to-update-post-meta

var parentId = 91; // the post id
var metaData = new wp.api.collections.PostMeta('', {parent: parentId});
metaData.fetch()
.done(function(data) {
    var someKey = data.findWhere({key: 'someKey'});
    someKey.set('value', 'newValue');
    someKey.save({parent: parentId});
});

但我在控制台中遇到以下错误:

Uncaught TypeError: wp.api.collections.PostMeta is not a constructor

任何帮助都会很棒。

由于

2 个答案:

答案 0 :(得分:0)

不是替代方案

我放弃了这种方法,而是采用了如下所述的Ajax:https://teamtreehouse.com/community/how-update-custom-fields-with-ajax-in-wordpress

基本上是jQuery:

jQuery.ajax({ // In Wordpress use jQuery rather than $ to avoid conflict
            url : 'https://example.com/wp-admin/admin-ajax.php', // This address will redirect the query to the functions.php file, where we coded the function that we need.
            type : 'POST',
            data : {
                action : 'my_action', 
                postid : postid,
            },
            beforeSend: function() {
                   //console.log('Updating Field');
            },
            success : function( response ) {


            },
            complete: function(){

            }
});

的functions.php

function my_action(){
    $order_id = $_POST['postid'];
     // DO something
    echo $return;

    wp_die($order_id = ''); // this is required to terminate immediately and 
    return a proper response
} 

我不会将此标记为解决方案,因为它不是,但它可以帮助遇到它的任何人。

答案 1 :(得分:0)

TLDR;

假设您有自定义分类车辆

在您的javascript中

var vehicles = new wp.api.collections.Vehicles();
vehicles.create(
  {
    name: 'Truck',
    description: 'A truck or lorry is a motor vehicle designed to transport cargo'
    meta:{
        '_wiki_link': 'https://en.wikipedia.org/wiki/Truck'
    }
});
你的php 中的

  

参见 wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php:437

add_action( 'rest_insert_vehicles', function( $term, $request, $flag ){
    $term_meta = $request->get_json_params()['meta'] ?? [];
    foreach( $term_meta as $meta_key => $meta_value ){
        update_term_meta( $term->term_id, $meta_key, $meta_value );
    }
}, 20, 3 );

有类似的问题,试图从javascript rest api更新术语meta ...

似乎你不能纯粹使用javascript ...

原因是,一旦通过其余条款控制器插入术语(下面的代码段)

  

请参阅wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php#L428

$term = wp_insert_term( wp_slash( $prepared_term->name ), $this->taxonomy, wp_slash( (array) $prepared_term ) );

...该术语的实际细节是 NOT 发送到此控制器的更新部分

  

请参阅wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php#L444

    if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
        $meta_update = $this->meta->update_value( $request['meta'], (int) $request['id'] );

        if ( is_wp_error( $meta_update ) ) {
            return $meta_update;
        }
    }

您会注意到它通过$request['id']而不是$term['id']发送,假设有这样的原因(可能您正在执行更新而不是创建)

我可能在这里错了......但这就是我的结论