【问题标题】:How do I set a custom meta value when creating a post using the Wordpress REST api使用 Wordpress REST api 创建帖子时如何设置自定义元值
【发布时间】:2018-11-04 11:16:30
【问题描述】:

我目前正在使用 Wordpress REST API 来阅读和撰写帖子。

我创建了一个名为 property 的自定义帖子类型:

register_post_type( 'property', array(
  'labels' => array(
    'name' => 'Properties',
    'singular_name' => 'Property',
   ),
  'description' => '',
  'show_in_rest' => true,
  'public' => true,
  'menu_position' => 20,
  'supports' => array( 'title', 'editor')
));

add_action( 'init', 'property_cpt' );

我添加了一个名为 property_name 的自定义元框,因此它将出现在编辑帖子管理页面中:

function add_property_metaboxes(){
    add_meta_box(
        'property_name', // id
        'Name', // title
        'property_name_callback', // callback
        'property', // page
        'normal', // context
        'default' // priority
    );
}
function property_name_callback() {
    global $post;
    wp_nonce_field( basename( __FILE__ ), 'property_fields' );
    $value = get_post_meta( $post->ID, 'property_name', true );
    echo '<input name="property_name" type="text" value="' . $value . '" />';
}
add_action( 'add_meta_boxes', 'add_property_metaboxes' );

我正在处理这个帖子类型的保存功能:

function property_save_meta( $post_id, $post ) {
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return $post_id;
    }
    if  ( !isset( $_POST['property_name'] ) || 
          !wp_verify_nonce( $_POST['property_fields'], basename(__FILE__) ) ) {
        return $post_id;
    }
    $events_meta['property_name'] = esc_textarea( $_POST['property_name'] );

    foreach ( $events_meta as $key => $value ) :
        if ( 'revision' === $post->post_type ) {
            return;
        }
        if ( get_post_meta( $post_id, $key, false ) ) {
            update_post_meta( $post_id, $key, $value );
        } else {
            add_post_meta( $post_id, $key, $value);
        }
        if ( ! $value ) {
            delete_post_meta( $post_id, $key );
        }
    endforeach;
}
add_action( 'save_post', 'property_save_meta', 1, 2 );

最后我将property_name注册为一个休息字段:

function register_rest_fields() {
    register_rest_field('property', 'property_name', 
        array(
        'get_callback' => 'get_post_meta_cb', 
        'update_callback' => 'update_post_meta_cb', 
        'schema' => null
        )
    );
}

function get_post_meta_cb($object, $field_name, $request){
    return get_post_meta($object['id'], $field_name, true); 
}
function update_post_meta_cb($value, $object, $field_name){
    if ( ! $value || ! is_string( $value ) ) {
        return;
    }
    return update_term_meta( $object->ID, $field_name, $value );
}
add_action('rest_api_init', 'register_rest_fields');

在前端,我可以使用 API 获取“属性”帖子,并且property_name 字段正确显示在响应中。

我也可以轻松创建新帖子,但我无法设置 property_name 元字段值。

目前我正在尝试:

request(`${url}/wp-json/wp/v2/property`, {
    method: "POST",
    body:JSON.stringify({
        title: 'Lorem ipsum dolor sit amet',
        content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        status: 'publish',
        meta: {
            property_name: 'Testing'
        }
    })
});

【问题讨论】:

  • 在您的“更新”回调 (update_post_meta_cb()) 中,您使用了 update_term_meta() 而不是 update_post_meta()
  • @SallyCJ 谢谢!我花了几个小时在这上面。你可以把它作为答案

标签: javascript wordpress wordpress-rest-api


【解决方案1】:

(正如我在评论中指出的那样)问题出在:

function update_post_meta_cb($value, $object, $field_name){
    if ( ! $value || ! is_string( $value ) ) {
        return;
    }
    return update_term_meta( $object->ID, $field_name, $value );
}

您实际保存 post 元数据的位置,但随后使用了 update_term_meta() 用于保存 term 元数据。 :)

并且(我忘了说)要修复它,只需将 update_term_meta() 替换为 update_post_meta()。 ;)

【讨论】:

    猜你喜欢
    • 2020-01-09
    • 2018-06-24
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多