我正在尝试使用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
任何帮助都会很棒。
由于
答案 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)
假设您有自定义分类车辆
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']
发送,假设有这样的原因(可能您正在执行更新而不是创建)
我可能在这里错了......但这就是我的结论